Python JS逆向之Ku狗,实现搜索下载功能(附源码)

嗨喽~大家好呀,这里是魔王呐 ❤ ~!

[python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取](#python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取)

今天用Python来实现一下酷狗JS逆向,实现搜索下载功能

环境使用:

  • Python 3.8

  • Pycharm

模块使用:

  • import hashlib <内置模块>

  • import prettytable as pt --> pip install prettytable

  • import requests --> pip install requests

  • import time

  • import re

  • import json

模块安装:

win + R 输入cmd 输入安装命令 pip install 模块名 (如果你觉得安装速度比较慢, 你可以切换国内镜像源)


获取福利代码 <点击此处获取>

  1. 音乐播放器源码 <界面>

  2. 音乐下载软件源码 <界面>


代码实现步骤

  1. 发送请求, 模拟浏览器对于url地址发送请求

    对于 音频信息数据包 发送请求

    • 内容基本上都可以直接在浏览器中复制过来的
  2. 获取数据, 获取服务器返回响应数据

    开发者工具: response 响应

  3. 解析数据, 提取我们需要的数据内容

    歌名 / 歌曲链接

  4. 保存数据, 获取歌曲内容, 保存到本地文件夹

代码展示

cpp 复制代码
# 导入数据请求模块
import requests
# 导入时间模块
import time
# 导入解密模块
import hashlib
# 导入正则表达式
import re
# 导入json模块
import json

def md5_hash(date, word):
    text = [
        'NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt',
        'appid=1014',
        'bitrate=0',
        'callback=callback123',
        f'clienttime={date}',
        'clientver=1000',
        'dfid=2UHYNz3g5BlC1P5mfH2586l5',
        'filter=10',
        'inputtype=0',
        'iscorrection=1',
        'isfuzzy=0',
        f'keyword={word}',
        'mid=6cff5eec372eb97a1152cedd1d7c9fd5',
        'page=1',
        'pagesize=30',
        'platform=WebFilter',
        'privilege_filter=0',
        'srcappid=2919',
        'token=84444db71f298ea679c54e933acfdbe53a634f98423439ccb0f5f17d7b74e1da',
        'userid=458167322',
        'uuid=6cff5eec372eb97a1152cedd1d7c9fd5',
        'NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt'
    ]
    string = ''.join(text)
    md = hashlib.md5()
    md.update(string.encode('utf-8'))
    signature = md.hexdigest()
    return signature


# 模拟浏览器 请求头
headers = {
    'Referer': '****/',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36'
}
word = input('请输入你要下载歌曲名字/歌手: ')
# word = '周杰伦'
date = int(time.time() * 1000)
signature = md5_hash(date=date, word=word)
# 请求链接
search_url = f'****/v2/search/song'
# 请求参数
data = {
    'callback': 'callback123',
    'srcappid': '2919',
    'clientver': '1000',
    'clienttime': date,
    'mid': '6cff5eec372eb97a1152cedd1d7c9fd5',
    'uuid': '6cff5eec372eb97a1152cedd1d7c9fd5',
    'dfid': '2UHYNz3g5BlC1P5mfH2586l5',
    'keyword': word,
    'page': '1',
    'pagesize': '30',
    'bitrate': '0',
    'isfuzzy': '0',
    'inputtype': '0',
    'platform': 'WebFilter',
    'userid': '458167322',
    'iscorrection': '1',
    'privilege_filter': '0',
    'filter': '10',
    'token': '84444db71f298ea679c54e933acfdbe53a634f98423439ccb0f5f17d7b74e1da',
    'appid': '1014',
    'signature': signature,
}
# 发送请求
search_data = requests.get(url=search_url, params=data, headers=headers).text
# 正则匹配数据
html = re.findall('callback123\((.*?)\)', search_data)[0]
# json字符串转成字典
info_json = json.loads(html)
for index in info_json['data']['lists']:
    music_id = index['EMixSongID']
    # 请求链接
    url = f'*****/yy/index.php?r=play/getdata&dfid=2UHYNz3g5BlC1P5mfH2586l5&appid=1014&mid=6cff5eec372eb97a1152cedd1d7c9fd5&platid=4&encode_album_audio_id={music_id}&_=1695193937882'
    # 发送请求 -> <Response [200]> 响应对象
    response = requests.get(url=url, headers=headers)
    """
    获取响应数据
        1- response.text 获取响应文本数据
        2- response.json() 获取响应json数据
        3- response.content 获取响应二进制数据
    requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0):
        原因: 你获得数据不是完整json数据格式
        解决:
            1. response.text 查看数据返回的效果
                <是否被反爬 / json是否完整>
            2. jQuery1910617558460865655_1695193937878({})
                - 使用正则表达式直接提取数据内容
                - jQuery是回调函数, 来自于请求参数
    解析数据 -> 字典取值
        根据键值对取值: 根据冒号左边的内容[键], 提取冒号右边的内容[值]

    图片/音频/视频/特定格式文件 --> url地址 唯一资源定位符
        对于链接发送请求, 获取二进制数据, 进行保存
    """
    json_data = response.json()
    # 提取歌名
    audio_name = json_data['data']['audio_name']
    # 提取链接
    play_url = json_data['data']['play_url']
    # 保存数据
    music_content = requests.get(url=play_url, headers=headers).content
    with open('music\\' + audio_name + '.mp3', mode='wb') as f:
        f.write(music_content)

    print(audio_name, play_url)

小知识点

字典数据:

dit = {
    '键1': '值1',   --> 键值对
    '键2': '值2'
    '键3': {'键3-1': '值3-1'}
    '键4': [{'键4-1': '值4-1'}, {'键4-2': '值4-2'}]
}
获取值3-1 --> dit['键3']['键3-1']
获取值4-2 --> dit['键4'][1]['键4-2']

批量替换

选中内容 ctrl + R 输入正则命令
(.*?): (.*)
'$1': '$2',

尾语

最后感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇

相关推荐
接着奏乐接着舞。15 分钟前
如何在 Three.js 地球飞线中间生成卡片
开发语言·javascript·ecmascript
shadowflies21 分钟前
组件库TDesign的表格<t-table>的使用,行列合并以及嵌入插槽实现图标展示,附踩坑
前端·javascript·vue.js·vue·tdesign
Dack46625 分钟前
1.1、Python3基础语法
笔记·python
阿泽不想掉光头发33 分钟前
C#实现调用DLL 套壳读卡程序(桌面程序开发)
java·开发语言·后端·websocket·http·c#
m0_7482400238 分钟前
Python毕业设计选题:基于协同过滤的动漫推荐系统设计与实现_django+hive+spider
python·django·课程设计
bglmmz38 分钟前
JPA查询部分字段的最佳实践
java·开发语言
Marzlam1 小时前
C# IDisposable接口 与析构函数
开发语言·c#
高锰酸钾_1 小时前
Python数据可视化小项目
python·信息可视化·数据分析
峰子20121 小时前
Go语言实现守护进程的挑战
开发语言·后端·面试·架构·golang·go
m0_748237151 小时前
PHP实现登录和注册(附源码)
开发语言·php