Skip to content

从音乐平台直接下 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(关键是 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 → 得到原始文件",干净得多。

检查清单 ​

  1. 会员登录态 cookie 就位
  2. 搜索拿 media_mid(注意不是 songmid)
  3. 先按 size_flac > 0 筛
  4. 用 F000<media_mid>.flac 模板取 vkey
  5. 校验字节数,不符就删掉重试/换条目
  6. 失败先换条目,别急着判定"这歌下不了"

一句话版本:直链文件名用 media_mid 不用 songmid;size_flac=0 和 result=104003 都是"这版本不可用",解法是换条目,不是重试。