开放接口文档
v1.0 · 稳定版

开放接口文档

聚合网易云、QQ、酷狗三大音源的标准化访问能力。本站设计的页面默认可用,外部网站经域名白名单授权后可调用。

音源数量 3 个
接口能力 6 项
请求方式 POST
返回格式 JSON
限流策略 60 次/分钟/IP
1

接口概览

本服务对外提供三大音源(网易云、QQ、酷狗)的标准化访问能力,包含以下 6 项能力:

搜索歌曲
/api/open/music/search
按关键词搜索,支持分页
获取播放地址
/api/open/music/url
返回可直接播放的音频 URL
获取歌词
/api/open/music/lrc
返回 LRC 格式歌词
获取封面图片
/api/open/music/pic
返回专辑封面图片 URL
获取歌单详情
/api/open/music/list
返回歌单内全部歌曲列表
获取用户歌单
/api/open/music/userlist
返回指定用户的公开歌单列表
统一请求方式 所有接口均使用 POST 表单提交(Content-Type: application/x-www-form-urlencoded),响应统一为 application/json
2

鉴权与访问控制

本接口采用域名白名单鉴权,无需 API Key。调用方网站域名需由服务端管理员预先加入白名单,明明主页设计的网站(同源调用)默认放行,无需加入白名单

鉴权原理

服务端会自动读取请求中的 OriginReferer HTTP 头来识别调用方域名,按以下优先级校验:

  1. 同源放行:调用方域名 = 本站域名(如明明主页设计的网站 /page/* 调用本站接口),自动通过
  2. 本地放行localhost / 127.0.0.1(本地开发环境)自动通过
  3. 白名单校验:其他外部域名必须在白名单内才能调用
同源默认生效 明明主页设计创建的网站(路径为 /page/{id})与主站同域,无需任何配置即可直接调用本接口。
白名单规则(仅外部网站)
规则说明
精确匹配白名单填 example.com,则 example.com 可调用
子域名匹配白名单填 example.com,则 sub.example.comapi.example.com 也可调用
端口无关校验仅比较 hostname,不区分端口
大小写不敏感域名统一转小写后比较
未授权访问 若请求域名不在白名单内(且非同源),返回 403
{"code": -1, "error": "域名未授权: your-domain.com"}
请联系服务端管理员,将您的域名加入白名单(管理后台 → 接口菜单)。
跨域支持(CORS)

服务端已开启 CORS,允许浏览器直接跨域调用。响应头包含:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers: Content-Type

对于 OPTIONS 预检请求,服务端会直接返回 204 No Content

3

频率限制

为保障服务稳定性,开放接口对每个调用方 IP 进行限流。注意:限流的是接口调用次数,不是播放歌曲数。正常播放一首歌仅需 2-4 次调用(搜索 + 获取地址 + 可选歌词/封面),实际听歌完全不受影响。

维度限制
时间窗口60 秒
最大请求数60 次 / IP / 分钟
限流对象仅 /api/open/music/* 接口调用
不限流实际音频流播放(走 CDN 直连)
超限响应 超出限制后返回 429
{"code": -1, "error": "请求过于频繁,请稍后再试"}

建议客户端实现请求队列和缓存(搜索结果可缓存 10-30 分钟,播放地址可缓存 1 小时),加了缓存后重复播放同一首歌不消耗调用次数。

5

获取播放地址

POST /api/open/music/url
请求参数
参数类型必填说明
idstring歌曲 ID(来自搜索结果的 url_idid
typestring音源:wy · qq · kg
signstring签名(搜索结果中带 sign 字段时需回传)
响应示例
{
  "code": 1,
  "data": {
    "url": "https://xxxcdn.com/xxx.mp3"
  }
}
关于音频地址
  • 返回的 URL 通常为各音源官方 CDN 地址,可直接用于 <audio> 播放
  • 部分音源返回 HTTP 地址,建议在页面中升级为 HTTPS 后使用
  • 播放地址有时效性(通常 30 分钟~数小时不等),过期后需重新获取
  • 部分歌曲因版权原因可能返回空 URL(VIP / 下架歌曲)
6

获取歌词

POST /api/open/music/lrc?t=1
请求参数
参数类型必填说明
idstring歌曲 ID(来自搜索结果的 lyric_id
typestring音源:wy · qq · kg
songstring歌曲 ID(与 id 相同,部分音源需要)
signstring签名
响应示例
{
  "code": 1,
  "data": {
    "lyric": "[00:12.00]故事的小黄花 [00:15.00]从出生那年就飘着...",
    "tlyric": ""
  }
}
字段类型说明
lyricstring原文歌词(LRC 格式)
tlyricstring翻译歌词(外文歌曲时返回,无翻译则为空)
7

获取封面图片

POST /api/open/music/pic
请求参数
参数类型必填说明
picstring封面 ID(来自搜索结果的 pic_id
typestring音源:wy · qq · kg
响应示例
{
  "code": 1,
  "data": {
    "url": "https://p1.music.126.net/xxx.jpg"
  }
}

返回的 URL 可直接用于 <img> 标签的 src

8

获取歌单详情

POST /api/open/music/list
请求参数
参数类型必填说明
idstring歌单 ID
typestring音源:wy · qq · kg
响应说明

返回歌单内的全部歌曲列表,字段结构与搜索接口一致(含 songIdsongNameartistNamealbumNamealbumCover 等并行数组)。

歌单 ID 获取方式 网易云/QQ/酷狗的网页版歌单 URL 中均包含歌单 ID。例如网易云歌单链接 https://music.163.com/#/playlist?id=3778678 中,3778678 即为歌单 ID。
9

获取用户歌单

POST /api/open/music/userlist
请求参数
参数类型必填说明
uidstring用户 UID(各音源平台的用户 ID)
typestring音源:wy · qq · kg
响应示例
{
  "playlist": [
    {
      "id": "123456",
      "name": "我喜欢的音乐",
      "coverImgUrl": "https://xxx.jpg",
      "creator": {
        "nickname": "用户昵称",
        "avatarUrl": "https://xxx.jpg"
      }
    }
  ]
}
注意 该接口仅返回用户公开的歌单。若用户设置了隐私保护,可能返回空列表。
10

错误码说明

HTTP 状态码业务 code含义处理建议
2001成功
2000 / -1上游业务错误检查参数 / 上游服务异常
400参数缺失检查必填参数
403-1域名未授权联系管理员加白名单
429-1请求过频降低频率,添加缓存
502-1上游连接失败稍后重试
504-1上游超时稍后重试
通用错误响应格式
{
  "code": -1,
  "error": "错误描述信息"
}
11

完整调用示例

JavaScript(浏览器环境)
// 1. 搜索歌曲
async function searchSongs(keyword) {
  const params = new URLSearchParams({
    name: keyword,
    type: 'wy',       // wy=网易云 qq=QQ音乐 kg=酷狗
    page: '1',
    limit: '30',
    format: '1'
  })
  const res = await fetch('https://your-domain.com/api/open/music/search', {
    method: 'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    body: params.toString()
  })
  const data = await res.json()
  return data.code === 1 ? data.data : []
}

// 2. 获取播放地址
async function getPlayUrl(songId, type, sign) {
  const params = new URLSearchParams({ id: songId, type })
  if (sign) params.append('sign', sign)
  const res = await fetch('https://your-domain.com/api/open/music/url', {
    method: 'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    body: params.toString()
  })
  const data = await res.json()
  return data.code === 1 ? data.data.url : ''
}

// 3. 完整流程:搜索 → 播放
;async function playSong(keyword) {
  const songs = await searchSongs(keyword)
  if (songs.length === 0) return

  const song = songs[0]
  const url = await getPlayUrl(song.url_id, 'wy', song.sign)
  if (url) {
    const audio = new Audio(url)
    audio.play()
  }
}
PHP 调用示例
<?php
function searchMusic($keyword, $type = 'wy') {
    $url = 'https://your-domain.com/api/open/music/search';
    $data = http_build_query([
        'name' => $keyword,
        'type' => $type,
        'page' => 1,
        'limit' => 30,
        'format' => 1
    ]);

    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => $data,
        CURLOPT_HTTPHEADER => ['Content-Type: application/x-www-form-urlencoded'],
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 10
    ]);
    $response = curl_exec($ch);
    curl_close($ch);

    return json_decode($response, true);
}

$result = searchMusic('周杰伦');
print_r($result);
Python 调用示例
import requests

def search_songs(keyword, source='wy'):
    url = 'https://your-domain.com/api/open/music/search'
    data = {
        'name': keyword,
        'type': source,
        'page': 1,
        'limit': 30,
        'format': 1
    }
    resp = requests.post(url, data=data, timeout=10)
    return resp.json()

result = search_songs('周杰伦')
print(result)
12

常见问题

Q1:如何申请域名白名单?

联系服务端管理员,在管理后台「接口」菜单中添加您的域名即可。添加后立即生效,无需重启服务。

Q2:本地开发(localhost)能调用吗?

可以。localhost / 127.0.0.1 已默认放行,无需加入白名单。但浏览器在 localhost 环境可能不发送 Origin 头,会改用 Referer 识别。

Q3:为什么有些歌曲返回的播放地址为空?

常见原因:① VIP 付费歌曲;② 因版权下架;③ 地区限制。这是上游音源的限制,非接口问题。

Q4:播放地址有时效性吗?

有。不同音源的 CDN 地址有效期不同,通常 30 分钟到数小时不等。建议每次播放时实时获取,不要长期缓存播放地址。

Q5:可以商用吗?
版权声明 本接口仅提供音乐元数据检索和播放地址转发能力,不存储任何音频文件。所有音频内容版权归原始音源平台及创作者所有。商业使用请确保已获得相应授权,本服务不对上游内容的合法性承担责任。
Q6:接口返回 525 错误怎么办?

525 表示上游音乐服务暂时不可用(SSL 握手失败),通常是上游服务器临时故障,稍后重试即可。

Q7:如何获取歌单 ID?

在网易云/QQ/酷狗的网页版或客户端打开歌单,URL 中的数字 ID 即为歌单 ID。例如 music.163.com/#/playlist?id=3778678 的歌单 ID 是 3778678

Q8:支持哪些音源?
网易云
type=wy
搜索 / 播放 / 歌词 / 封面 / 歌单 / 用户歌单
QQ
type=qq
搜索 / 播放 / 歌词 / 封面 / 歌单 / 用户歌单
酷狗
type=kg
搜索 / 播放 / 歌词 / 封面 / 歌单 / 用户歌单