深度解析QQ音乐API:Python逆向工程实战指南
2026-02-06 04:00:59作者:凌朦慧Richard
QQ音乐作为国内主流音乐平台,其API接口采用了多重加密和验证机制,为开发者获取音乐数据带来了显著技术挑战。本文通过逆向工程分析,深入探讨QQ音乐API的调用机制、签名算法实现以及数据解析技术。
技术架构与核心原理
QQ音乐API采用模块化设计,通过musicu.fcg统一网关处理各类数据请求。核心通信基于JSON-RPC风格,每个请求包含comm公共参数和多个req_x业务模块参数。
签名算法逆向解析
项目实现了QQ音乐特有的签名算法get_sign,该算法基于MD5哈希和自定义编码转换:
def get_sign(self, data):
k1 = {"0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9,
"A": 10, "B": 11, "C": 12, "D": 13, "E": 14, "F": 15}
l1 = [212, 45, 80, 68, 195, 163, 163, 203, 157, 220, 254, 91, 204, 79, 104, 6]
text = json.dumps(data, separators=(',', ':'))
md5 = hashlib.md5(text.encode()).hexdigest().upper()
# 字符位置重排和异或运算
t1 = ''.join([md5[i] for i in [21, 4, 9, 26, 16, 20, 27, 30]])
t3 = ''.join([md5[i] for i in [18, 11, 3, 2, 1, 7, 6, 25]])
ls2 = []
for i in range(16):
x1 = k1[md5[i * 2]]
x2 = k1[md5[i * 2 + 1]]
x3 = ((x1 * 16) ^ x2) ^ l1[i]
ls2.append(x3)
# Base64变种编码
t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
ls3 = []
for i in range(6):
if i == 5:
ls3.append(t[ls2[-1] >> 2])
ls3.append(t[(ls2[-1] & 3) << 4])
else:
x4 = ls2[i * 3] >> 2
x5 = (ls2[i * 3 + 1] >> 4) ^ ((ls2[i * 3] & 3) << 4)
x6 = (ls2[i * 3 + 2] >> 6) ^ ((ls2[i * 3 + 1] & 15) << 2)
x7 = 63 & ls2[i * 3 + 2]
ls3.extend(t[x4] + t[x5] + t[x6] + t[x7])
t2 = ''.join(ls3).replace('[\\/+]', '')
sign = 'zzb' + t1 + t2 + t3
return sign.lower().replace('+', '').replace('/', '').replace('=', '')
API调用机制分析
QQ音乐采用分布式CDN调度和Vkey验证机制,音乐播放地址获取流程:
def get_music_url(self, music_mid):
data = {
"req": {
"module": "CDN.SrfCdnDispatchServer",
"method": "GetCdnDispatch",
"param": {"guid": "1535153710", "calltype": 0, "userip": ""}
},
"req_0": {
"module": "vkey.GetVkeyServer",
"method": "CgiGetVkey",
"param": {
"guid": "1535153710",
"songmid": [music_mid],
"songtype": [0],
"uin": ''.join(random.sample('1234567890', 10)),
"loginflag": 1,
"platform": "20"
}
},
"comm": {"uin": uin, "format": "json", "ct": 24, "cv": 0}
}
ret = requests.get('https://u.y.qq.com/cgi-bin/musicu.fcg?data={}'.format(
json.dumps(data)), headers=self._headers, cookies=self._cookies)
return 'https://dl.stream.qqmusic.qq.com/{}'.format(
ret['req_0']['data']['midurlinfo'][0]['purl'])
数据提取技术实现
批量歌单信息获取
通过get_playlist_info_num方法实现分页批量获取,解决单次请求限制:
def get_playlist_info_num(self, playlist_id, song_num):
data = {
"comm": {"g_tk": 5381, "uin": "", "format": "json", "platform": "h5"},
"req_0": {
"module": "music.srfDissInfo.aiDissInfo",
"method": "uniform_get_Dissinfo",
"param": {
"disstid": int(playlist_id),
"song_begin": song_num,
"song_num": 30 # 每批获取30条记录
}
}
}
return self._api_call(data)['req_0']['data']['songlist']
搜索算法升级
新版搜索模块采用JavaScript加密生成searchid,通过execjs执行:
// getsearchid.js 加密算法
function l(e) {
var t = (new Date).getTime().toString()
, n = ""
, r = "abcdefghijklmnopqrstuvwxyz0123456789";
for (i = 0; i < e; i++)
n += r.charAt(Math.floor(Math.random() * r.length));
return t + n
}
技术挑战与解决方案
Cookie验证机制
普通用户Cookie有效期约7天,绿钻用户可解析VIP歌曲。通过模拟浏览器行为维持会话有效性:
def set_cookie(self, cookie):
list_ret = {}
cookie_list = cookie.split('; ')
for item in cookie_list:
key_value = item.split('=')
list_ret[key_value[0]] = key_value[1] if len(key_value) == 2 else '='.join(key_value[1:])
return list_ret
错误处理与重试机制
API返回500001错误码时进行异常处理:
ret = requests.get(url, headers=self._headers, cookies=self._cookies)
if ret['code'] == 500001: # 数据提交错误或Cookie过期
return 'Error'
合规使用建议
- 法律合规性:本技术仅用于学习研究和学术交流,不得用于商业用途
- 数据安全:获取的音乐数据应遵守版权法规,避免大规模爬取
- 技术伦理:逆向工程研究应尊重平台技术保护措施,不进行恶意破解
- 资源限制:合理控制请求频率,避免对平台服务器造成压力
项目部署与使用
git clone https://gitcode.com/gh_mirrors/mc/MCQTSS_QQMusic
cd MCQTSS_QQMusic
pip install requests==2.27.1 pyexecjs==1.5.1
通过本文的技术分析,开发者可以深入了解QQ音乐API的工作原理,为音乐数据处理和分析提供技术参考。建议在实际应用中严格遵守相关法律法规,合理使用技术成果。
登录后查看全文
热门项目推荐
相关项目推荐
GLM-5智谱 AI 正式发布 GLM-5,旨在应对复杂系统工程和长时域智能体任务。Jinja00
GLM-5-w4a8GLM-5-w4a8基于混合专家架构,专为复杂系统工程与长周期智能体任务设计。支持单/多节点部署,适配Atlas 800T A3,采用w4a8量化技术,结合vLLM推理优化,高效平衡性能与精度,助力智能应用开发Jinja00
请把这个活动推给顶尖程序员😎本次活动专为懂行的顶尖程序员量身打造,聚焦AtomGit首发开源模型的实际应用与深度测评,拒绝大众化浅层体验,邀请具备扎实技术功底、开源经验或模型测评能力的顶尖开发者,深度参与模型体验、性能测评,通过发布技术帖子、提交测评报告、上传实践项目成果等形式,挖掘模型核心价值,共建AtomGit开源模型生态,彰显顶尖程序员的技术洞察力与实践能力。00
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00
MiniMax-M2.5MiniMax-M2.5开源模型,经数十万复杂环境强化训练,在代码生成、工具调用、办公自动化等经济价值任务中表现卓越。SWE-Bench Verified得分80.2%,Multi-SWE-Bench达51.3%,BrowseComp获76.3%。推理速度比M2.1快37%,与Claude Opus 4.6相当,每小时仅需0.3-1美元,成本仅为同类模型1/10-1/20,为智能应用开发提供高效经济选择。【此简介由AI生成】Python00
Qwen3.5Qwen3.5 昇腾 vLLM 部署教程。Qwen3.5 是 Qwen 系列最新的旗舰多模态模型,采用 MoE(混合专家)架构,在保持强大模型能力的同时显著降低了推理成本。00- RRing-2.5-1TRing-2.5-1T:全球首个基于混合线性注意力架构的开源万亿参数思考模型。Python00
项目优选
收起
deepin linux kernel
C
27
11
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
567
3.83 K
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
68
20
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
12
1
暂无简介
Dart
798
197
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
1.37 K
779
喝着茶写代码!最易用的自托管一站式代码托管平台,包含Git托管,代码审查,团队协作,软件包和CI/CD。
Go
23
0
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
349
200
Ascend Extension for PyTorch
Python
376
446
无需学习 Kubernetes 的容器平台,在 Kubernetes 上构建、部署、组装和管理应用,无需 K8s 专业知识,全流程图形化管理
Go
16
1


