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',

尾语

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

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

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

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

相关推荐
宋发元5 分钟前
如何使用正则表达式验证域名
python·mysql·正则表达式
Dontla15 分钟前
Rust泛型系统类型推导原理(Rust类型推导、泛型类型推导、泛型推导)为什么在某些情况必须手动添加泛型特征约束?(泛型trait约束)
开发语言·算法·rust
明辉光焱20 分钟前
[Electron]总结:如何创建Electron+Element Plus的项目
前端·javascript·electron
XMYX-038 分钟前
Python 操作 Elasticsearch 全指南:从连接到数据查询与处理
python·elasticsearch·jenkins
牧码岛41 分钟前
Web前端之汉字排序、sort与localeCompare的介绍、编码顺序与字典顺序的区别
前端·javascript·web·web前端
正义的彬彬侠43 分钟前
sklearn.datasets中make_classification函数
人工智能·python·机器学习·分类·sklearn
belldeep44 分钟前
python:用 sklearn 转换器处理数据
python·机器学习·sklearn
安静的_显眼包O_o1 小时前
from sklearn.preprocessing import Imputer.处理缺失数据的工具
人工智能·python·sklearn
安静的_显眼包O_o1 小时前
from sklearn.feature_selection import VarianceThreshold.移除低方差的特征来减少数据集中的特征数量
人工智能·python·sklearn
_可乐无糖1 小时前
pytest中的断言
python·pytest