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调用的巧妙运用
- 多格式数据处理的完整性
- 完善的错误处理机制
- 跨平台兼容的技术架构
通过深入理解这些技术细节,开发者可以更好地应对类似的技术挑战,推动音乐技术领域的创新发展。
登录后查看全文
热门项目推荐
相关项目推荐
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00
GLM-4.7-FlashGLM-4.7-Flash 是一款 30B-A3B MoE 模型。作为 30B 级别中的佼佼者,GLM-4.7-Flash 为追求性能与效率平衡的轻量化部署提供了全新选择。Jinja00
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin07
compass-metrics-modelMetrics model project for the OSS CompassPython00
项目优选
收起
deepin linux kernel
C
27
11
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
525
3.72 K
Ascend Extension for PyTorch
Python
329
391
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
877
578
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
335
162
暂无简介
Dart
764
189
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
12
1
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
1.33 K
746
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
67
20
React Native鸿蒙化仓库
JavaScript
302
350