1142 字
6 分钟
博客播放器如何播放网易云完整歌曲(聚合音源解析真实音频直链)

博客侧边栏放了个网易云歌单播放器(APlayer 系),但点播放总是只有几十秒就停,甚至直接报错——因为歌单列表里的播放地址是第三方 meting API 的解析端点,而它返回的不是完整歌曲,而是被网易云防盗链打掉的空响应或试听片段。本文记录如何用聚合音源在播放前解析出真实音频直链。

问题:公开 meting API 的 url 端点失效了#

以常用的 api.injahow.cn/meting 为例:

# 歌单列表(playlist)还能用,能拿到歌曲元数据:
GET https://api.injahow.cn/meting/?server=netease&type=playlist&id=6941867750
# → 返回 500+ 首歌的 name / artist / pic / lrc / url
# 但每首歌的 url 是解析端点,不是真实音频:
"url": "https://api.injahow.cn/meting/?server=netease&type=url&id=29027453"
# 直接请求这个 url 端点:
GET https://api.injahow.cn/meting/?server=netease&type=url&id=29027453
# → 200 但 body 为空(0 字节)

也就是说:歌单列表(元数据)还活着,但”拿播放地址”这一步已经被网易云防盗链打掉了。播放器拿到空 url,audio.src 无效,自然播不出来。

曾经的方案:GDAPI(已失效)#

之前用 lx-music「星海音乐源」同款的 GDAPI(music-api.gdstudio.xyz)解析:

GET https://music-api.gdstudio.xyz/api.php?use_xbridge3=true&loader_name=forest&need_sec_link=1&sec_link_scene=im&theme=light&types=url&source=netease&id=29802488&br=320

这个方法用了很久,但 2026-09 起 GDAPI 域名 DNS 解析失败(music-api.gdstudio.xyz 挂掉),每首歌解析都失败。而播放器原来的兜底逻辑是”解析失败自动跳下一首”——整个歌单 500+ 首全部失败时,就会无限切歌,体验极差。

现在的方案:全豆要聚合音源#

「全豆要」是一个 lx-music 生态的聚合音源插件(lick563/quandouyao-music-source),内部聚合了多个免 key 解析接口。其中「溯音163」对网易云完全可用:

# 溯音163 单曲解析(网易云):
GET https://oiapi.net/api/Music_163?id=29027453
# 返回:
{
"code": 0,
"message": "获取成功",
"data": [
{
"name": "crossing field",
"id": 29027453,
"singers": [{ "name": "LiSA" }],
"url": "https://m701.music.126.net/.../xxx.mp3" # 真实音频直链
}
]
}

实测响应头:

access-control-allow-origin: *
content-type: application/json; charset=utf-8

浏览器 fetch 直接可用,无需代理、无需 key。拿到的 url 是网易云 CDN(m701.music.126.net)的带签名直链,<audio> 直接播放就是完整歌曲。

插件的网易调用逻辑(从 v1.0.7 源码提取):

const res = await httpGet("https://oiapi.net/api/Music_163", { id });
if (res?.code === 0 && res?.data) {
let item = res.data;
if (Array.isArray(item)) item = item[0];
if (item?.url) return item.url; // 真实直链
}

注意:插件里还有个 SUYIN_QQ_KEY(oiapi-ef6133b7-...)是 QQ 音乐专用的,网易接口不需要 key。

接入播放器(最小改动)#

播放器逻辑里,加载某首歌时先判断来源:如果 track.source 是 meting 的 url 端点(api.injahow.cn/meting 且带 type=url),就从 url 参数里抽出音乐 id,调聚合音源拿真实直链,再赋给 audio:

// 1. 解析出网易云音乐 id(injahow 列表不返回 id 字段,藏在 url 端点参数里)
const idMatch = /[?&]id=(\d+)/.exec(track.source);
if (!idMatch) return track.source; // 非 meting 源直接用原值
// 2. 用聚合音源解析真实直链(带缓存,同一首歌不重复请求)
const api = `https://oiapi.net/api/Music_163?id=${idMatch[1]}`;
const resp = await fetch(api);
const data = await resp.json();
if (data.code === 0 && data.data?.[0]?.url) {
return data.data[0].url; // 真实音频直链
}
throw new Error("解析失败"); // 交给调用方停止,不跳歌

要点:

  • 解析失败要直接报错停止,不要回退原值触发 error 跳歌——GDAPI 挂掉那次的教训就是”全歌单失败 → 无限切歌”。现在解析失败播放器停在当前状态显示错误,不会刷屏切歌。
  • 缓存解析结果(Map<id, url>):列表里 500 首歌不会一次性全解析,只在用户点某首时解析一次,重复播放走缓存。
  • 只在 meting 源上做解析:本地 / custom 曲目别碰。
  • 解析是异步的,audio.src 赋值要放在 await 之后。

为什么不用别的方案#

方案结论
换一个公共 meting 镜像实测多个(qjqq.cn、zhheo、godyu 等)多数已挂或同样返回空,不稳定
自建 NeteaseCloudMusicApi要服务器 / 要维护,博客是纯静态 Pages,没必要
网易官方 API music.163.com/api/song/enhance/player/url返回真实直链但无 CORS 头,浏览器 fetch 跨域被拒
溯音163(oiapi.net)免 key、CORS *、静态站点直连,最省事

聚合音源来自 lx-music 生态(lick563/quandouyao-music-source,AGPL-3.0),它内部还有多个备用音源(长青、念心、汽水等),溯音163 失效时可以按同样格式换。注意第三方接口随时可能失效,播放器要保留”解析失败停止”的兜底。

效果#

  • 侧边栏播放器点任意一首 → 溯音163 解析出真实直链 → 完整播放到结尾
  • 元数据(歌名/封面/时长)仍来自 injahow 列表,不用动
  • 纯前端实现,静态托管零后端
博客播放器如何播放网易云完整歌曲(聚合音源解析真实音频直链)
https://tsangasuna.pages.dev/posts/netease-play-full/
作者
TsangAsuna
发布于
2026-09-17
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取