QQ音乐API逆向工程:如何绕过加密机制获取音乐数据?
QQ音乐API逆向工程:如何绕过加密机制获取音乐数据?
【免费下载链接】MCQTSS_QQMusicQQ音乐解析项目地址: https://gitcode.com/gh_mirrors/mc/MCQTSS_QQMusic
你是否曾想过,为什么市面上的音乐平台API调用越来越困难?QQ音乐作为国内最大的音乐平台之一,其API接口采用了复杂的加密机制和验证体系。今天,我们将深入探讨一个开源项目——MCQTSS_QQMusic,它成功破解了QQ音乐的API调用机制,为开发者提供了一个可靠的数据获取方案。
项目核心价值:三大技术突破
1. 签名算法的逆向破解
QQ音乐的API调用核心在于其独特的签名算法get_sign。这个算法采用了多重加密和字符变换技术,是API调用的第一道防线。MCQTSS_QQMusic项目通过逆向工程成功还原了这一算法:
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('=', '')这个算法包含了MD5哈希、字符重排、异或运算和自定义Base64编码等多个步骤,是QQ音乐API安全体系的核心。
2. 分布式CDN调度机制的解析
QQ音乐采用分布式CDN架构来分发音乐内容,每个音乐文件都有对应的Vkey验证。项目通过分析get_music_url函数,揭示了如何获取有效的音乐播放地址:
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'])3. JavaScript加密算法的Python实现
新版搜索接口采用了JavaScript加密算法生成searchid,项目通过execjs库成功在Python环境中执行JavaScript代码:
// 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 }Python调用代码:
import execjs rFile = open("./getsearchid.js", 'r', encoding='UTF-8') sid = execjs.compile(rFile.read()).call('l', '3')技术实现对比:传统爬虫 vs 逆向工程
| 技术维度 | 传统网页爬虫 | MCQTSS_QQMusic逆向方案 |
|---|---|---|
| 数据获取方式 | 解析HTML页面 | 直接调用API接口 |
| 请求效率 | 低(需要加载完整页面) | 高(仅传输JSON数据) |
| 数据完整性 | 可能缺失动态加载内容 | 完整获取所有数据字段 |
| 稳定性 | 依赖页面结构变化 | 依赖API接口稳定性 |
| 反爬虫绕过 | User-Agent伪装、代理IP | 签名算法、Cookie验证 |
| 开发复杂度 | 中等 | 高(需要逆向分析) |
实际应用场景分析
场景一:音乐信息批量采集
对于音乐数据分析项目,需要获取大量歌曲的元数据信息。通过get_music_info函数,可以高效获取歌曲的详细信息:
def get_music_info(self, music_id): uin = ''.join(random.sample('1234567890', 10)) data = {"comm": {"cv": 4747474, "ct": 24, "format": "json", "inCharset": "utf-8", "outCharset": "utf-8", "notice": 0, "platform": "yqq.json", "needNewCode": 1, "uin": uin, "g_tk_new_20200303": 708550273, "g_tk": 708550273}, "req_1": {"module": "music.trackInfo.UniformRuleCtrl", "method": "CgiGetTrackInfo", "param": {"ids": [music_id], "types": [0]}}} ret = json.loads(requests.get(url='https://u.y.qq.com/cgi-bin/musicu.fcg?data={}'.format(json.dumps(data)), headers=self._headers, cookies=self._cookies).text) if ret['code'] == 500001: return 'Error' return ret['req_1']['data']['tracks']场景二:歌单数据分析
音乐推荐系统需要分析歌单的组成和用户偏好。get_playlist_info_num函数支持分页获取歌单中的所有歌曲:
def get_playlist_info_num(self, playlist_id, song_num): data = {"comm": {"g_tk": 5381, "uin": "", "format": "json", "inCharset": "utf-8", "outCharset": "utf-8", "notice": 0, "platform": "h5", "needNewCode": 1}, "req_0": {"module": "music.srfDissInfo.aiDissInfo", "method": "uniform_get_Dissinfo", "param": {"disstid": int(playlist_id), "enc_host_uin": "", "tag": 1, "userinfo": 1, "song_begin": song_num, "song_num": 30}}} resp = json.loads(requests.post( url='https://u.y.qq.com/cgi-bin/musicu.fcg?_webcgikey=uniform_get_Dissinfo&_={}'.format( int(time.time() * 1000)), headers=self._headers, cookies=self._cookies, data=json.dumps(data)).text) if resp['code'] == 500001: return 'Error' return resp['req_0']['data']['songlist']场景三:MV资源下载
视频内容分析需要获取MV的下载地址和元数据。get_mv_url函数提供了完整的MV信息获取:
def get_mv_url(self, vid): data = {"comm": {"ct": 6, "cv": 0, "g_tk": 1366999994, "uin": ''.join(random.sample('1234567890', 10)), "format": "json", "platform": "yqq"}, "mvInfo": {"module": "video.VideoDataServer", "method": "get_video_info_batch", "param": {"vidlist": [vid], "required": ["vid", "type", "sid", "cover_pic", "duration", "singers", "new_switch_str", "video_pay", "hint", "code", "msg", "name", "desc", "playcnt", "pubdate", "isfav", "fileid", "filesize", "pay", "pay_info", "uploader_headurl", "uploader_nick", "uploader_uin", "uploader_encuin"]}}, "mvUrl": {"module": "music.stream.MvUrlProxy", "method": "GetMvUrls", "param": {"vids": [vid], "request_type": 10003, "addrtype": 3, "format": 264}}} return requests.post(url='https://u.y.qq.com/cgi-bin/musicu.fcg', data=json.dumps(data), timeout=1, headers=self._headers).json()技术挑战与解决方案
挑战一:Cookie验证机制
QQ音乐使用Cookie进行用户身份验证,普通用户Cookie有效期约7天,绿钻用户才能解析VIP歌曲。项目通过set_cookie函数实现了Cookie的格式转换:
def set_cookie(self, cookie): list_ret = {} cookie_list = cookie.split('; ') for i in range(len(cookie_list)): list_1 = cookie_list[i].split('=') list_ret[list_1[0]] = list_1[1] if len(list_1) == 3: list_ret[list_1[0]] = list_1[1] + '=' + list_1[2] return list_ret挑战二:API错误处理
当API返回500001错误码时,表示数据提交错误或Cookie过期。项目在所有API调用中都加入了错误检测:
if ret['code'] == 500001: return 'Error'挑战三:请求频率限制
为了避免被服务器限制,项目采用了随机User-Agent和合理的请求间隔:
self._headers = { 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X; zh-CN) AppleWebKit/537.51.1 (' 'KHTML, like Gecko) Mobile/17D50 UCBrowser/12.8.2.1268 Mobile AliApp(TUnionSDK/0.1.20.3) ' }项目架构设计分析
模块化设计
项目采用面向对象设计,将所有功能封装在QQ_Music类中:
MCQTSS_QQMusic/ ├── Main.py # 核心API类 ├── demo.py # 基础使用示例 ├── demo_1.py # 歌单解析示例 ├── demo_mv.py # MV下载示例 ├── demo_toplist.py # 排行榜示例 └── search_music_new/ # 新版搜索模块 ├── getsearchid.js # JavaScript加密算法 └── search_music.py # 新版搜索实现接口统一化
所有API调用都通过musicu.fcg网关,采用统一的JSON-RPC风格请求格式:
{ "comm": { "cv": 4747474, "ct": 24, "format": "json", "inCharset": "utf-8", "outCharset": "utf-8", "notice": 0, "platform": "yqq.json", "needNewCode": 1, "uin": "1234567890", "g_tk_new_20200303": 708550273, "g_tk": 708550273 }, "req_1": { "module": "music.trackInfo.UniformRuleCtrl", "method": "CgiGetTrackInfo", "param": { "ids": ["0039MMyB0qxFvH"], "types": [0] } } }快速开始指南
环境准备
# 克隆项目 git clone https://gitcode.com/gh_mirrors/mc/MCQTSS_QQMusic cd MCQTSS_QQMusic # 安装依赖 pip install requests==2.27.1 pyexecjs==1.5.1基础使用示例
import Main # 初始化QQ音乐客户端 QQM = Main.QQ_Music() # 设置Cookie(可选,用于VIP歌曲) # QQM._cookies = QQM.set_cookie('your_cookie_here') # 搜索歌曲 songs = QQM.search_music('周杰伦', 10) for song in songs: print(f"歌曲: {song['songname']}, 歌手: {song['singer'][0]['name']}") # 获取歌曲播放地址 music_url = QQM.get_music_url(songs[0]['songmid']) print(f"播放地址: {music_url}") # 获取歌词 lyrics = QQM.get_lyrics(songs[0]['songmid']) print(f"歌词: {lyrics[:100]}...")高级功能示例
# 获取歌单信息 playlist_id = '7808278211' playlist_info = QQM.get_playlist_info(playlist_id) print(f"歌单名称: {playlist_info['detail']['title']}") # 获取MV信息 mv_info = QQM.get_mv_url('r00127x0yzd') print(f"MV名称: {mv_info['mvInfo']['data']['r00127x0yzd']['name']}") # 获取排行榜 toplist = QQM.get_Toplist_Info() print(f"排行榜数据: {len(toplist['data']['list'])} 条记录")技术合规与伦理建议
合法使用原则
- 个人学习研究:本项目仅适用于技术学习和研究目的
- 数据使用限制:获取的音乐数据不得用于商业用途
- 版权尊重:尊重音乐创作者的版权,不得大规模下载或传播
- 服务器压力:合理控制请求频率,避免对QQ音乐服务器造成过大压力
技术伦理
- 逆向工程研究应专注于技术学习,而非恶意破解
- 尊重平台的技术保护措施
- 遵守相关法律法规和平台使用条款
- 倡导负责任的技术实践
技术发展趋势
随着音乐平台安全机制的不断升级,API逆向工程面临更多挑战。未来的技术发展方向可能包括:
- 动态加密算法:平台可能采用更复杂的动态签名算法
- 机器学习检测:使用AI技术识别异常请求模式
- 硬件指纹识别:结合设备指纹进行用户身份验证
- 区块链技术:用于版权保护和内容分发
MCQTSS_QQMusic项目为我们提供了一个宝贵的技术研究案例,展示了如何通过系统化的逆向工程方法理解复杂的API调用机制。无论你是对音乐数据处理感兴趣,还是希望学习API逆向工程技术,这个项目都值得深入研究和学习。
重要提示:本文仅用于技术学习和研究目的,请在实际应用中严格遵守相关法律法规和平台使用条款。
【免费下载链接】MCQTSS_QQMusicQQ音乐解析项目地址: https://gitcode.com/gh_mirrors/mc/MCQTSS_QQMusic
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
