嗨喽~大家好呀,这里是魔王呐 ❤ ~!
[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 模块名 (如果你觉得安装速度比较慢, 你可以切换国内镜像源)
获取福利代码 <点击此处获取>
-
音乐播放器源码 <界面>
-
音乐下载软件源码 <界面>
代码实现步骤
-
发送请求, 模拟浏览器对于url地址发送请求
对于 音频信息数据包 发送请求
- 内容基本上都可以直接在浏览器中复制过来的
-
获取数据, 获取服务器返回响应数据
开发者工具: response 响应
-
解析数据, 提取我们需要的数据内容
歌名 / 歌曲链接
-
保存数据, 获取歌曲内容, 保存到本地文件夹
代码展示
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',
尾语
最后感谢你观看我的文章呐~本次航班到这里就结束啦 🛬
希望本篇文章有对你带来帮助 🎉,有学习到一点知识~
躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。
最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇