Repository navigation
v0.32.0
ToneCore v0.32.0
网易云完整接入(eapi + 扫码登录):个人歌单、个性化每日推荐、登录后高音质取链。
为什么这版要换通道:weapi 在本项目里是死的
上一版做的是免登录接入。哥哥要求「参考飞牛音乐扩展实现完整接入,而不是免登录」,
于是我先去实现扫码登录 —— 但踩到一个硬事实。
weapi 三条路全部返回空(实测,不是猜的)
| 尝试 | 结果 |
|---|---|
/weapi/login/qrcode/unikey(裸请求) |
HTTP 200 · 体长 0 |
| 注入匿名设备 cookie 后再试 | HTTP 200 · 体长 0 |
/weapi/register/anonimous(拿 MUSIC_A) |
HTTP 200 · 体长 0 |
三次都是「200 但没有响应体」。如果我只看到状态码 200 就以为通了,会一路做下去然后全部落空。
eapi 则是全通的
换到 interface.music.163.com/eapi/*(飞牛的 NEMbox 取链/歌单实际也走 eapi):
| 端点 | 结果 |
|---|---|
| 取链 v1 | ✅ 拿到真实 URL(br 320000) |
| 歌单详情 | ✅ 热歌榜 200 首 |
login/qrcode/unikey |
✅ 拿到真实 unikey |
| 扫码轮询 | ✅ 正确返回 801「等待扫码」 |
决策:登录、歌单、取链统一走 eapi。
做了什么
1. 扫码登录
POST /api/netease/qr 取二维码(服务端用 qrcode 直接出 dataUrl,前端不必再引库),
前端每 3 秒轮询:
| code | 含义 | 处理 |
|---|---|---|
| 801 | 等待扫码 | 继续等 |
| 802 | 已扫码待确认 | 提示去手机确认 |
| 800 | 二维码过期 | 自动换新,不用再点一次 |
| 803 | 成功 | 吸收 cookie 并落盘 |
设置页新增「网易云账号」卡片。离开页面会停掉轮询(否则定时器泄漏、后台一直打接口)。
2. 个人歌单
/api/netease/playlists + /api/netease/playlist/:id/tracks,需登录。
3. 个性化每日推荐
/api/netease/recommend,返回 personalized 标志标明是否个性化。
(未登录时是全网通用版 —— 上一版就说明了这点,登录后才真正个性化。)
4. 登录后取链
走 eapi 的 song/enhance/player/url/v1,登录后有机会拿到更高音质。
两条必须说清楚的事实
① 未登录时要无损会被静默降级
请求 lossless,响应回来是 exhigh(320k) —— 不是报错,是静默降级。
好在 br/level 会如实反映,代码回读实际值判定音质,所以界面显示的是真实音质,不谎报。
② 凭据不外泄
cookie 含 MUSIC_U 等凭据,落盘在 data/netease-cookie.json。
所有接口只回「是否登录 / 昵称 / 歌单元数据」,绝不吐 cookie 原文,也不写进日志。
验证
npm run build ✅ web + server 均通过
npm test ✅ 15 项全过
新增依赖 qrcode@1.5.4(生产依赖,能扛住 Dockerfile 的 npm prune --omit=dev)+
@types/qrcode(开发依赖)。
需要你实测
- 设置 → 网易云账号 → 扫码登录(这是本次核心,得你拿手机扫)
- 登录成功后确认显示昵称
- 之后每日推荐应变为个性化内容
待办
- 酷我(kw)在线搜索封面:该平台不返回可用封面地址(实测 404)
- 音源状态显示口径
- 锁屏动态歌词:浏览器能力边界,做不到