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 小时前
OpenClaw架构揭秘:178k stars的个人AI助手如何用Gateway模式统一控制12+通讯频道
前端·javascript·github
冷雨夜中漫步5 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
郝学胜-神的一滴6 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
百锦再6 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
百锦再6 小时前
React编程高级主题:测试代码
android·前端·javascript·react.js·前端框架·reactjs
颜酱7 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
m0_736919107 小时前
C++代码风格检查工具
开发语言·c++·算法
喵手7 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控
2501_944934738 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
helloworldandy8 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python