基于 Kotlin + Compose Multiplatform 的桌面工具,将网易云/QQ音乐/酷狗/酷我等平台的加密音乐格式转换为标准音频格式(mp3/flac/ogg/m4a 等),带现代桌面 GUI 与命令行批量转换。
仅供学习与技术交流,请勿用于商业用途,请在合法范围内使用。
纯净白 · 精密工具风格:近白底、白色卡片、发丝线分隔,品牌橙单点强调;格式徽章按平台家族着色,状态一眼可读。
| 浅色 · 转换队列 | 深色 · 转换队列 |
|---|---|
| 浅色模式 | 深色模式 |
| 网易云下载 · 登录后 | 网易云下载 · 下载中 |
|---|---|
| 登录后空状态 | 下载进行中 |
- 覆盖网易云 / QQ音乐 / 酷狗 / 酷我四家主流平台的加密格式
- 自动识别解密后的真实音频格式(MP3/FLAC/OGG/M4A/WAV 等),保留内嵌标签与封面;NCM 额外写回歌名/歌手/专辑/封面
- 深/浅双主题一键切换
- 拖拽或点击添加文件/文件夹,队列内逐文件显示格式、大小与状态
- 按解密后音频内容做 SHA-256 去重(保留不带
(N)后缀的文件) - 网易云下载:扫码 / 短信验证码 / 浏览器三种方式登录 → 查看并多选歌单 → 下载 MP3(保留歌名/歌手/专辑/封面)
- 命令行批量转换与桌面 GUI 两用
| 平台 | 扩展名 |
|---|---|
| 网易云音乐 | ncm |
| QQ音乐 | qmc0 qmc2 qmc3 qmc4 qmc6 qmc8 qmcflac qmcogg tkm mflac mflac0 mflac1 mflac2 mgg mgg0 mgg1 mgg2 mggl mmp4 bkcmp3 bkcm4a bkcflac bkcwav bkcape bkcogg bkcwma |
| 酷狗音乐 | kgm kgma vpr |
| 酷我音乐 | kwm |
需要 JDK 17+:
./gradlew run # 启动桌面 GUI ./gradlew run --args="-h" # 命令行帮助 ./gradlew test # 运行测试(41 个,含 unlock-music 真实样本向量)
- 直接把加密音乐文件或文件夹拖进虚线区域,或点击「添加文件 / 添加文件夹」选择。
- 队列会列出每个文件:左侧为格式徽章(NCM 橙 / QMC 靛蓝 / KGM 青绿 / KWM 紫),中间为文件名与大小,右侧为状态。
- 右侧「输出目录」显示默认位置
~/Music/MusicUnlock(用户主目录下,打包版会自动创建)。 - 点「浏览...」更换目录,点「打开」在系统文件管理器中查看。
- 打开「按解密后音频内容去重」开关后,转换时会对解密后的音频做 SHA-256:内容相同的歌曲只保留一个,优先保留不带
(N)后缀的文件(例如同时存在晴天.ncm与晴天 (1).ncm时保留前者),其余标记为「重复」。
- 点右下角「开始转换」,逐文件进行:状态会从「等待中 → 转换中(行内进度条)→ 已完成 / 失败」。
- 转换过程中队列锁定(不能移除文件或修改输出目录/去重开关),完成后即可在输出目录找到结果。
| 状态 | 含义 |
|---|---|
| 等待中 | 排队中,尚未开始 |
| 转换中 | 正在处理,行内有橙色渐变进度条 |
| 已完成 | 转换成功,已写入输出目录 |
| 失败 | 文件损坏或不支持,行内会显示具体原因 |
| 重复 | 与队列中其他文件解密后内容相同,被去重跳过 |
顶部切换到「网易云下载」页,可把网易云歌单歌曲下载为 MP3。
登录页提供三种方式,登录态仅保存在本次会话内;成功后界面展示账号昵称与头像,点「退出登录」即清除会话。
- 扫码登录:点击「获取二维码」,用网易云 App「扫一扫」完成登录。部分账号会触发网易云服务端的安全验证(返回 8821),此时扫码无法完成,请改用浏览器登录。
- 验证码登录:输入网易云绑定手机号,点击「发送验证码」后填入验证码登录。若当前网络触发安全验证,会提示改用浏览器登录。
- 浏览器登录(推荐):自动打开本机 Chrome/Edge 进入网易云官方登录页,你在浏览器内完成登录后自动读取登录态并回到 App,无需复制粘贴。
- 登录后自动列出全部歌单(含收藏),显示封面、名称与歌曲数。
- 支持勾选多个歌单,提供「全选 / 清空 / 刷新」。
- 点「下载 MP3」把选中歌单的歌曲下载到右侧输出目录(默认
~/Music/MusicUnlock)。 - 按官方接口获取音频,高码率优先、不可用时自动降级;输出统一为 MP3,并写回歌名 / 歌手 / 专辑 / 封面。
- 官方返回 FLAC 等非 MP3 格式时,自动调用系统 ffmpeg 转码为 MP3(未安装 ffmpeg 时保留原格式并提示)。
- 会员歌曲:登录的账号有会员权限即可下载(请求携带登录态,自动取会员高码率);非会员账号官方只返回试听片段,会明确提示「仅可获取试听片段」并跳过,不会静默下载试听版。
- 灰色歌曲(无版权 / 已下架):网易云在你所在地区没有该歌曲版权,官方接口不返回任何播放地址,即使登录会员也无法下载,会提示「灰色歌曲:无版权或已下架」。
./gradlew run --args="-c ~/Music/网易云 -o ~/Music/转换结果 -d"
| 参数 | 说明 |
|---|---|
-c, --convert [path] ... |
转换路径下的所有加密音乐文件(支持文件或文件夹,可多个) |
-o, --output [dir] |
自定义输出目录(默认 ./output) |
-d, --dedup |
按解密后音频内容去重,优先保留不带 (N) 后缀的文件 |
-v, --view |
打开图形界面(不带参数时默认打开) |
-h, --help |
帮助 |
# 转换单个文件 ./gradlew run --args="-c ~/Music/晴天.ncm -o ~/Music/转换结果" # 批量转换多个文件夹并去重 ./gradlew run --args="-c ~/Music/网易云 ~/Music/QQ音乐 -o ~/Music/转换结果 -d" # 查看帮助 ./gradlew run --args="-h"
注意:去重是对解密后音频做 SHA-256,而不是对加密文件做哈希——同名歌曲即使加密文件不同(元数据/歌曲 ID 不同),解密后音频相同也能正确去重。
- 转换后文件在哪? GUI 默认输出到
~/Music/MusicUnlock,可在右侧「输出目录」查看或更改;命令行默认./output,用-o指定。 - 转换失败怎么办? 队列行内会显示具体原因(如文件已损坏、格式不支持)。解密算法基于公开格式规范,仅适用于合法获取的文件。
- 为什么会显示「重复」? 开启了去重且该文件解密后的音频与队列中其他文件相同,属正常跳过。
- 打包版双击后如何打开? macOS 打开
.dmg后把 MusicUnlock 拖入「应用程序」即可启动;Windows 直接双击单文件MusicUnlock.exe(内嵌 JRE,首次启动自动解压到临时目录运行,退出后自动清理),无参数默认进入图形界面。
./gradlew packageDmg # macOS .dmg ./gradlew createDistributable # Windows exe + 自带 JRE 的应用目录
- macOS 发布物为
.dmg。 - Windows 发布物为单文件
MusicUnlock-<版本>-windows.exe:由 7-Zip SFX 封装,内嵌 JRE,无外部资源文件,双击自动解压到临时目录运行、退出后自动清理。 - 跨平台一键打包见 .github/workflows/build.yml(GitHub Actions 矩阵:macOS + Windows)。
src/main/kotlin/musicunlock/
core/ 多格式解密核心(纯 Kotlin)
NcmDecoder.kt / NcmCipher.kt / NcmMetadata.kt 网易云 NCM
QmcDecoder.kt / QmcKey.kt / QmcCipher.kt / TeaCipher.kt QQ音乐 QMC
KgmDecoder.kt 酷狗 KGM/KGMA/VPR
KwmDecoder.kt 酷我 KWM
AudioSniffer.kt / Formats.kt / MusicDecoder.kt
ncm/ 网易云下载
NeteaseApi.kt 扫码/短信验证码登录(weapi 加密)/ 账号 / 歌单 / 播放地址
BrowserLogin.kt 浏览器登录(CDP 读取登录态 Cookie)
Mp3Downloader.kt 官方下载、MP3 转码、标签写回
service/ MusicConverter(转换编排)、TagWriter(标签写回)
cli/ MainCli(命令行)
ui/ App.kt(双页签)、DownloadPage.kt(网易云下载页)、Theme.kt、FileDialogs.kt
- NCM 解密:基于公开的 .ncm 容器格式规范实现,算法与 unlock-music(MIT)一致
- QMC 系列(密钥派生、TEA、Static/Map/RC4 流密码):unlock-music(MIT)
- KGM/VPR: MyKgmWasm(MIT)与 unlock-music(MIT)
- KWM:unlock-music(MIT)
测试向量来自 unlock-music 项目的 testdata/(MIT)。
本项目采用 MIT License。 第三方算法与依赖声明见 THIRD_PARTY_NOTICES.md。
本项目仅用于学习密码学与文件格式分析,请勿用于任何商业用途或侵犯他人权益。