163MusicLyrics解密算法:QQ音乐API解析机制揭秘
2026-02-04 05:20:36作者:秋阔奎Evelyn
你是否曾经遇到过想要获取QQ音乐的逐字歌词(Verbatim Lyrics),却发现官方API返回的都是加密数据?163MusicLyrics项目通过逆向工程和巧妙的解密算法,成功解析了QQ音乐的加密机制。本文将深入解析这一复杂的解密过程,带你了解背后的技术原理。
QQ音乐逐字歌词加密机制概述
QQ音乐为了保护其逐字歌词资源,采用了多重加密策略:
- 三重DES加密:使用自定义密钥进行三次DES加密
- 十六进制编码:将加密数据转换为十六进制字符串
- GZIP压缩:对最终数据进行压缩处理
- XML格式包装:将歌词内容包装在XML结构中
这种复杂的加密机制使得直接获取原始歌词变得异常困难。
解密算法核心流程
1. 外部DLL调用机制
163MusicLyrics项目通过调用外部DLL文件QQMusicVerbatim.dll来实现核心解密功能:
[DllImport("QQMusicVerbatim.dll", EntryPoint = "?Ddes@qqmusic@@YAHPAE0H@Z",
CallingConvention = CallingConvention.Cdecl)]
private static extern void func_ddes(sbyte[] a, string b, int c);
[DllImport("QQMusicVerbatim.dll", EntryPoint = "?des@qqmusic@@YAHPAE0H@Z",
CallingConvention = CallingConvention.Cdecl)]
private static extern void func_des(sbyte[] a, string b, int c);
2. 三重DES解密流程
flowchart TD
A[获取加密的十六进制字符串] --> B[转换为sbyte数组]
B --> C[第一轮DES解密<br>密钥: !@#)(NHLiuy*$%^&]
C --> D[第二轮DES解密<br>密钥: 123ZXC!@#)(*$%^&]
D --> E[第三轮DES解密<br>密钥: !@#)(*$%^&abcDEF]
E --> F[转换为byte数组]
F --> G[SharpZipLib解压缩]
G --> H[解析XML获取歌词内容]
3. 核心解密代码实现
public QQMusicBean.LyricResult GetVerbatimLyric(string songId)
{
var resp = SendPost("https://c.y.qq.com/qqmusic/fcgi-bin/lyric_download.fcg",
new Dictionary<string, string>
{
{ "version", "15" },
{ "miniversion", "82" },
{ "lrctype", "4" },
{ "musicid", songId },
});
// 移除XML注释
resp = resp.Replace("<!--", "").Replace("-->", "");
var dict = new Dictionary<string, XmlNode>();
XmlUtils.RecursionFindElement(XmlUtils.Create(resp), VerbatimXmlMappingDict, dict);
var result = new QQMusicBean.LyricResult { Code = 0, Lyric = "", Trans = "" };
foreach (var pair in dict)
{
var text = pair.Value.InnerText;
if (string.IsNullOrWhiteSpace(text)) continue;
// 十六进制字符串转换为sbyte数组
var sz = MathUtils.ConvertStringToHexSbytes(text, out var sbytes);
// 三重DES解密
func_ddes(sbytes, "!@#)(NHLiuy*$%^&", sz);
func_des(sbytes, "123ZXC!@#)(*$%^&", sz);
func_ddes(sbytes, "!@#)(*$%^&abcDEF", sz);
// 解压缩处理
var decompressBytes = MathUtils.SharpZipLibDecompress(MathUtils.SbytesToBytes(sbytes, sz));
var decompressText = Encoding.UTF8.GetString(decompressBytes);
// XML解析获取歌词内容
if (decompressText.Contains("<?xml"))
{
// 移除BOM标识
string byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
if (decompressText[0] == byteOrderMarkUtf8[0])
{
decompressText = decompressText.Remove(0, byteOrderMarkUtf8.Length);
}
var doc = XmlUtils.Create(decompressText);
var subDict = new Dictionary<string, XmlNode>();
XmlUtils.RecursionFindElement(doc, VerbatimXmlMappingDict, subDict);
if (subDict.TryGetValue("lyric", out var d))
{
var lyricContent = d.Attributes["LyricContent"].InnerText;
switch (pair.Key)
{
case "orig":
result.Lyric = LyricUtils.DealVerbatimLyric(lyricContent, SearchSourceEnum.QQ_MUSIC);
break;
case "ts":
result.Trans = LyricUtils.DealVerbatimLyric(lyricContent, SearchSourceEnum.QQ_MUSIC);
break;
}
}
}
}
return result;
}
关键技术组件解析
1. 十六进制转换工具
public static int ConvertStringToHexSbytes(string s, out sbyte[] sbytes)
{
sbytes = new sbyte[1024 * 1024];
var sz = 0;
for (var i = 1; i < s.Length; i += 2)
{
sbytes[sz++] = (sbyte)(ParseHex(s[i - 1]) * 16 + ParseHex(s[i]));
}
return sz;
}
2. GZIP解压缩实现
public static byte[] SharpZipLibDecompress(byte[] data)
{
var compressed = new MemoryStream(data);
var decompressed = new MemoryStream();
var inputStream = new InflaterInputStream(compressed);
inputStream.CopyTo(decompressed);
return decompressed.ToArray();
}
3. XML解析映射表
private static readonly Dictionary<string, string> VerbatimXmlMappingDict = new Dictionary<string, string>
{
{ "content", "orig" }, // 原文歌词
{ "contentts", "ts" }, // 译文歌词
{ "contentroma", "roma" }, // 罗马音歌词
{ "Lyric_1", "lyric" }, // 解压后的歌词内容
};
解密过程的技术挑战
1. 密钥逆向工程
通过分析QQ音乐客户端的网络请求和内存数据,逆向工程团队成功提取了三组DES加密密钥:
| 解密轮次 | 密钥字符串 | 用途 |
|---|---|---|
| 第一轮 | !@#)(NHLiuy*$%^& |
初始解密 |
| 第二轮 | 123ZXC!@#)(*$%^& |
中间解密 |
| 第三轮 | !@#)(*$%^&abcDEF |
最终解密 |
2. 数据格式处理
解密过程中需要处理多种数据格式转换:
flowchart LR
A[十六进制字符串] --> B[sbyte数组]
B --> C[三重DES解密]
C --> D[byte数组转换]
D --> E[GZIP解压缩]
E --> F[UTF-8字符串]
F --> G[XML解析]
G --> H[歌词内容提取]
3. 错误处理机制
项目实现了完善的错误处理机制:
- 网络请求超时重试
- 数据格式验证
- 解密失败回退
- 歌词内容清洗处理
实际应用场景
1. 歌词批量下载
protected override ResultVo<LyricVo> GetLyricVo0(string id, string displayId, bool isVerbatim)
{
QQMusicBean.LyricResult resp;
if (isVerbatim)
{
resp = _api.GetVerbatimLyric(id);
if (resp.Code == 0)
{
// 同时获取翻译歌词
var resp2 = _api.GetLyric(displayId);
if (resp2.Code == 0)
{
resp.Trans = resp2.Trans;
}
}
}
else
{
resp = _api.GetLyric(displayId);
}
return resp.Code == 0 ? new ResultVo<LyricVo>(resp.ToVo()) : ResultVo<LyricVo>.Failure(ErrorMsg.LRC_NOT_EXIST);
}
2. 多类型歌词支持
项目支持多种歌词类型处理:
| 歌词类型 | 处理方式 | 输出格式 |
|---|---|---|
| 原文歌词 | 直接解密 | LRC格式 |
| 翻译歌词 | Base64解码 | LRC格式 |
| 逐字歌词 | 三重解密+解压缩 | 自定义XML格式 |
| 罗马音歌词 | 特殊处理 | 拼音格式 |
技术实现的价值意义
163MusicLyrics项目的QQ音乐API解密机制具有重要的技术价值:
- 逆向工程典范:展示了如何通过技术手段解析商业API的保护机制
- 跨平台兼容:支持Windows和跨平台版本,技术实现具有通用性
- 开源贡献:为音乐技术社区提供了宝贵的技术参考和实现方案
- 教育意义:深入理解加密算法、网络协议、数据解析等核心技术
总结与展望
QQ音乐API的解密机制是一个典型的技术案例,163MusicLyrics项目通过精湛的逆向工程技术成功解析了这一复杂系统。这种技术实现不仅解决了用户获取逐字歌词的实际需求,也为类似的技术挑战提供了可参考的解决方案。
随着音乐平台安全机制的不断升级,未来的技术挑战将更加复杂。但正是这种技术探索精神,推动着开源社区不断前进,为用户创造更多价值。
技术要点回顾:
- 三重DES加密算法的逆向工程
- 外部DLL调用的巧妙运用
- 多格式数据处理的完整性
- 完善的错误处理机制
- 跨平台兼容的技术架构
通过深入理解这些技术细节,开发者可以更好地应对类似的技术挑战,推动音乐技术领域的创新发展。
登录后查看全文
热门项目推荐
相关项目推荐
GLM-5智谱 AI 正式发布 GLM-5,旨在应对复杂系统工程和长时域智能体任务。Jinja00
GLM-5-w4a8GLM-5-w4a8基于混合专家架构,专为复杂系统工程与长周期智能体任务设计。支持单/多节点部署,适配Atlas 800T A3,采用w4a8量化技术,结合vLLM推理优化,高效平衡性能与精度,助力智能应用开发Jinja00- QQwen3.5-397B-A17BQwen3.5 实现了重大飞跃,整合了多模态学习、架构效率、强化学习规模以及全球可访问性等方面的突破性进展,旨在为开发者和企业赋予前所未有的能力与效率。Jinja00
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
ruoyi-plus-soybeanRuoYi-Plus-Soybean 是一个现代化的企业级多租户管理系统,它结合了 RuoYi-Vue-Plus 的强大后端功能和 Soybean Admin 的现代化前端特性,为开发者提供了完整的企业管理解决方案。Vue08- RRing-2.5-1TRing-2.5-1T:全球首个基于混合线性注意力架构的开源万亿参数思考模型。Python00
Qwen3.5Qwen3.5 昇腾 vLLM 部署教程。Qwen3.5 是 Qwen 系列最新的旗舰多模态模型,采用 MoE(混合专家)架构,在保持强大模型能力的同时显著降低了推理成本。00
项目优选
收起
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
575
3.89 K
Ascend Extension for PyTorch
Python
396
474
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
360
219
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
902
704
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
1.39 K
787
昇腾LLM分布式训练框架
Python
122
148
React Native鸿蒙化仓库
JavaScript
312
364
暂无简介
Dart
814
200
华为昇腾面向大规模分布式训练的多模态大模型套件,支撑多模态生成、多模态理解。
Python
124
161
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
93
161