主题
从音乐平台直接下 FLAC:vkey 直链那套
想在 NAS 上给自己攒一个无损音乐库,常见路子有三种:第三方站点抓(音质不可控)、B 站/视频站转录(有损,还可能风控)、或者官方客户端(不给文件)。
其实有个更干净的做法:音乐平台的网页播放器本身就是走直链播放的,拿到那条直链,就能拿到原始文件。好处是音质有保证(FLAC 就是 FLAC)、速度快(腾讯 CDN)、没有额外风控。
代价是:它是会员权益,需要你有账号登录态;而且接口不是公开文档,随时可能变。
先说清楚前提
- 需要付费会员(无损音质是会员权益)。非会员请求 FLAC 直链会返回 404,不是"没找到",是"不给你"
- 需要网页版的登录 cookie
- 这套方法只适合自己账号范围内给自己备份。批量分发是另一回事,别混为一谈
三个名字容易搞混的 ID
这是这套流程里最容易出错的地方。搜索结果里你会看到三个长得像的东西:
| 名字 | 用途 |
|---|---|
songmid | 歌曲在库里的标识,搜索/详情用 |
media_mid | 文件名里要用的那个,直链的组成成分 |
mid(搜索结果里的) | 实测等于 media_mid |
直链的构造只认 media_mid,不是 songmid。 我一开始两个混用,症状特别迷惑:请求返回 200 但文件大小 0,或者干脆 403。因为 CDN 那边根本不认识你拼出来的文件名。
第一步:拿 cookie
网页版登录后,从浏览器开发者工具里取 Cookie(关键是 uin 和那几个会话票据)。存到文件里,别贴在命令行历史里。
第二步:搜歌,拿 media_mid 和音质信息
搜索接口会返回每首歌的可用音质和文件大小:
json
{
"mid": "...",
"file": {
"size_128mp3": 3568592,
"size_320mp3": 8921480,
"size_flac": 25165824,
"size_hires": 0
}
}这里有个免费的判断:size_flac 是不是 0。
size_flac > 0→ 这首歌有无损版本,可以试size_flac == 0→ 这个条目没有无损(可能是原曲只有有损母带,也可能是条目权限问题)
先按 size_flac > 0 筛一遍,能省掉一大堆注定失败的请求。
第三步:取 vkey,拼直链
请求播放地址时,用一个音质前缀 + media_mid + 扩展名的模板:
F000<media_mid>.flac → 无损
M800<media_mid>.mp3 → 320k
M500<media_mid>.mp3 → 128k完整直链长这样(参数顺序不敏感):
https://dl.stream.qqmusic.qq.com/F000<media_mid>.flac
?vkey=<vkey>&guid=<guid>&uin=<uin>&fromtag=66返回里如果 result != 0(常见 104003),含义是这个版本不可用——不是网络问题,别重试。
第四步:字节校验(这一步别跳)
直链拿回来之后,必须校验大小。因为失败的形式太多了:会员到期、vkey 过期、文件名拼错,都可能返回一个内容错误的文件(甚至是 HTML 错误页)。
python
expected = song["file"]["size_flac"]
got = download(url, path)
assert got == expected, f"大小不符: 期望 {expected}, 实际 {got}"
os.remove(path) if got != expected else None我栽过一次:批量下 110 多首,其中 3 首"下载成功"但其实是 0 字节空文件——因为没校验,直到播放器扫描媒体库才发现。
下载失败的三种情况,和应对
1. size_flac == 0 + result=104003
这个条目没有无损。换条目:同一首歌在库里经常有多个版本(不同专辑、不同艺人组合、精选集)。换个版本试试,成功率不低。
实测案例:某首歌原条目(双艺人合作那种)不可用,换成只挂一个艺人的版本就下到了。同一个"歌",库里可能有三四条。
2. 只有 320k 没有 FLAC
老歌(尤其 90 年代前后)常见。母带就是有损的,平台也没有无损。这种情况接受 320k 就行,别死磕。
3. 文件名/URL 用了 songmid
返回 403 或 0 字节。改回 media_mid。
归档结构
按「来源 + 年份/主题 + 艺人」分层,文件名统一 序号 歌名 - 艺人.flac:
music/
2025总汇/
周深/001 灯火里的中国 - 周深.flac
林俊杰/003 江南 - 林俊杰.flac
我喜欢精选/
梁静茹/001 勇气 - 梁静茹.flac好处:播放器扫媒体库时艺人/专辑信息能自动识别;后续补歌时按目录核对缺哪些很方便。
我的实际选择:为什么放弃 B 站转录
先用过一段时间"视频站转录成 mp3"的路子,结论是不值得:
- 音质最多 320k,而且经过二次压制
- 有风控,需要带 cookie、要慢速重试、偶尔 412
- 文件名是视频标题("【4K】某某现场版"),后期要批量改名
- 还经常下到翻唱/改编版,不是原曲
vkey 直链这条路,一次跑通之后就是"输入 media_mid → 得到原始文件",干净得多。
检查清单
- 会员登录态 cookie 就位
- 搜索拿
media_mid(注意不是songmid) - 先按
size_flac > 0筛 - 用
F000<media_mid>.flac模板取 vkey - 校验字节数,不符就删掉重试/换条目
- 失败先换条目,别急着判定"这歌下不了"
一句话版本:直链文件名用
media_mid不用songmid;size_flac=0和result=104003都是"这版本不可用",解法是换条目,不是重试。