这份文档面向需要直接调用 TSBot 后端的开发者,补充说明项目里的接口分组、鉴权方式、请求体字段、常见返回结构和调用示例。
如果本文档和运行中的 FastAPI OpenAPI 文档不一致,以运行中的 OpenAPI 为准:
http://127.0.0.1:8009/docshttp://127.0.0.1:8009/openapi.json
- 默认后端地址:
http://127.0.0.1:8009 - 如果通过前端同源代理访问,通常走
/api/* - 返回格式:除少数上游透传接口外,基本都返回 JSON
- 常见错误格式:
{"detail":"..."}或{"message":"..."}
如果配置了以下任一环境变量:
TSBOT_API_TOKENTSBOT_API_TOKENS
那么所有非 /admin/* 接口都需要携带 API Token。
支持两种请求头写法:
Authorization: Bearer <token>或:
x-api-token: <token>不会要求 API Token 的路径:
/docs/redoc/openapi.json/admin/*
部分管理员接口会校验 TSBOT_ADMIN_TOKEN。请求头格式:
x-admin-token: <TSBOT_ADMIN_TOKEN>注意:
/admin/status不校验 admin token,只用于检查网易云管理员 cookie 是否已设置- 大部分其他
/admin/*接口都需要 admin token
部分网易云用户态接口需要在请求头里传入用户 cookie:
x-netease-cookie: <cookie字符串>适用接口包括:
/netease/account/netease/likelist/netease/likes/netease/playlists/playlist/detail可选携带,用于访问更完整的歌单信息
用于 /queue、/external/queue、/external/status.queue_preview 等返回。
| 字段 | 类型 | 说明 |
|---|---|---|
id |
integer | 队列项 ID |
track_id |
string | 媒体标识,例如 netease:123456、qqmusic:003abc |
source |
string | 统一来源标识,例如 netease、qqmusic、bilibili |
song_id |
string | 网易云歌曲 ID,仅 netease 时返回 |
song_mid |
string | QQ 音乐歌曲 MID,仅 qqmusic 时返回 |
video_id |
string | B 站视频 ID,仅 bilibili 时返回 |
webpage_url |
string | 原始视频页,仅 bilibili 时返回 |
title |
string | 标题 |
artist |
string | 艺术家 |
album |
string | 专辑名 |
duration |
number | null | 时长,单位秒 |
artwork |
string | 封面图 URL |
source_url |
string | 实际音频播放地址 |
用于 /history、/external/history 返回。
| 字段 | 类型 | 说明 |
|---|---|---|
id |
integer | 历史记录 ID |
played_at |
string | ISO 8601 时间 |
track_id |
string | 媒体标识 |
source |
string | 统一来源标识 |
song_id |
string | 网易云歌曲 ID,仅 netease 时返回 |
song_mid |
string | QQ 音乐歌曲 MID,仅 qqmusic 时返回 |
video_id |
string | B 站视频 ID,仅 bilibili 时返回 |
webpage_url |
string | 原始视频页,仅 bilibili 时返回 |
title |
string | 标题 |
artist |
string | 艺术家 |
album |
string | 专辑名 |
duration |
number | null | 时长,单位秒 |
artwork |
string | 封面图 URL |
source_url |
string | 实际播放 URL |
requested_by |
string | 请求来源,例如 web、external_api、聊天点歌者昵称 |
用于 /lyrics/{queue_item_id} 返回。
{
"lyrics": [
{ "time": 12.34, "text": "歌词内容" }
]
}这个项目里时长字段有两套单位,接入时要特别留意:
- 请求体里的
duration_ms是毫秒 - 队列、历史、播放状态返回里的
duration和current_time是秒
/external/* 是推荐给外部机器人、面板、脚本集成的一组稳定接口,尽量避免第三方直接依赖前端内部用的细碎路由。
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/external/status |
获取播放状态和队列预览 |
GET |
/external/search |
统一搜索网易云、QQ 音乐或 B 站视频 |
POST |
/external/queue |
根据 ID 或关键词加入队列,可选立即播放 |
GET |
/external/queue |
获取队列 |
DELETE |
/external/queue |
清空队列并尝试停止播放 |
DELETE |
/external/queue/{item_id} |
删除单个队列项 |
POST |
/external/queue/{item_id}/play |
播放指定队列项 |
GET |
/external/history |
获取历史播放记录 |
POST |
/external/history/{history_id}/replay |
通过历史记录重新加入队列或立即播放 |
POST |
/external/player/action |
播放、暂停、切歌等控制 |
PUT |
/external/player/volume |
设置音量 |
POST |
/external/player/shuffle |
开关随机播放 |
POST |
/external/player/repeat |
设置循环模式 |
返回播放状态,以及前 10 项队列预览。
示例响应:
{
"state": "playing",
"now_playing_title": "稻香",
"now_playing_source_url": "https://...",
"now_playing_artist": "周杰伦",
"now_playing_album": "魔杰座",
"artwork_url": "https://...",
"track_id": 42,
"current_time": 35.2,
"duration": 223.4,
"volume_percent": 100,
"is_shuffled": false,
"repeat_mode": "none",
"queue_length": 5,
"queue_preview": []
}说明:
- 这里的
track_id实际上是“当前播放的队列项 ID”,不是媒体字符串track_id repeat_mode取值:none、all、one
查询参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
keywords |
string | 是 | 搜索关键词 |
source |
string | 否 | netease、qqmusic 或 bilibili,默认 netease |
limit |
integer | 否 | 默认 20,最大 50 |
page |
integer | 否 | 页码,从 1 开始 |
网易云示例:
curl -H "Authorization: Bearer <token>" \
"http://127.0.0.1:8009/external/search?source=netease&keywords=周杰伦"QQ 音乐示例:
curl -H "Authorization: Bearer <token>" \
"http://127.0.0.1:8009/external/search?source=qqmusic&keywords=林俊杰"B 站示例:
curl -H "Authorization: Bearer <token>" \
"http://127.0.0.1:8009/external/search?source=bilibili&keywords=周杰伦"统一返回结构:
{
"source": "netease",
"keywords": "周杰伦",
"page": 1,
"limit": 20,
"total": 123,
"has_more": true,
"items": [
{
"source": "netease",
"track_id": "netease:123456",
"song_id": "123456",
"title": "稻香",
"artist": "周杰伦",
"album": "魔杰座",
"duration_ms": 223000,
"artwork_url": "https://..."
}
]
}QQ 音乐 items 里会使用 song_mid / album_mid 字段。
B 站 items 里会使用 video_id / webpage_url 字段。
当 source=bilibili 时,返回项还会尽量补充:
description:视频简介摘要likes:点赞数favorites:收藏数coins:投币数
用于外部点歌。支持两种模式:
- 直接传具体歌曲 ID
- 只传关键词,让后端自动取首个搜索结果
请求体字段:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
source |
string | 否 | netease、qqmusic 或 bilibili,默认 netease |
keywords |
string | 否 | 按关键词自动搜索第一条 |
song_id |
string | 否 | 网易云歌曲 ID |
song_mid |
string | 否 | QQ 音乐歌曲 MID |
video_id |
string | 否 | B 站视频 BV 号或 av 号 |
title |
string | 否 | 标题,可不传,后端尽量补全 |
artist |
string | 否 | 艺术家,可不传 |
album |
string | 否 | 专辑名,可不传 |
album_mid |
string | 否 | QQ 音乐专辑 MID |
duration_ms |
integer | 否 | 毫秒 |
cover_url |
string | 否 | 封面图 URL |
level |
string | 否 | 网易云音质等级,默认 auto |
quality |
string | 否 | QQ 音乐音质,默认 320 |
play_now |
boolean | 否 | 是否立即播放,默认 false |
注意:
- 网易云至少需要
song_id或keywords之一 - QQ 音乐至少需要
song_mid或keywords之一 - B 站至少需要
video_id或keywords之一 - 网易云
level支持:auto、standard、higher、exhigh、lossless、hires、jyeffect、sky、dolby、jymaster - QQ 音乐实际入队和播放依赖服务端已配置管理员 QQ 音乐 cookie
- B 站播放时会由后端下载音频到本地缓存后,再交给
voice-service播放
按关键词直接播放示例:
curl -X POST "http://127.0.0.1:8009/external/queue" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"source": "netease",
"keywords": "稻香",
"level": "lossless",
"play_now": true
}'按 QQ 音乐 MID 入队示例:
curl -X POST "http://127.0.0.1:8009/external/queue" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"source": "qqmusic",
"song_mid": "003aAYrm3GE0Ac",
"title": "江南",
"artist": "林俊杰",
"album_mid": "001fNHEf1SFEFN",
"play_now": false
}'按 B 站视频立即播放示例:
curl -X POST "http://127.0.0.1:8009/external/queue" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"source": "bilibili",
"video_id": "BV1QQSDBWEGn",
"title": "【HiRes无损】周杰伦-太阳之子整张专辑 含歌词和单曲 共13首",
"artist": "太阳之子周杰伦专辑",
"play_now": true
}'示例响应:
{
"ok": true,
"source": "netease",
"queue_id": 88,
"trial": false,
"play_now": true,
"track": {
"source": "netease",
"track_id": "netease:123456",
"song_id": "123456",
"title": "稻香",
"artist": "周杰伦",
"album": "魔杰座",
"duration_ms": 223000,
"artwork_url": "https://..."
}
}返回:
{
"count": 2,
"items": []
}items 的元素结构见“QueueItem”。
清空队列,并尝试停止当前播放。
示例响应:
{
"ok": true,
"removed_count": 5,
"playback_stopped": true
}删除单个队列项。
播放已有的某个队列项。
返回最近 200 条历史记录:
{
"count": 200,
"items": []
}items 的元素结构见“HistoryItem”。
查询参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
play_now |
boolean | 否 | 默认 true;false 时只加入队列不立即播放 |
说明:
- 会根据历史项的
track_id自动识别来源 - 目前支持
netease:*、qqmusic:*、bilibili:* - 网易云和 QQ 音乐会重新获取最新播放地址
- B 站会重新解析视频信息,并在需要时重新准备本地缓存音频
请求体:
{
"action": "next"
}支持值:
playpausenextpreviousskipresume,等价于playcontinue,等价于playswitch,等价于next
说明:
next切到下一首;all/one循环模式保留当前队列项,none模式删除当前队列项。手动切歌不受单曲循环限制。skip在所有模式下都会删除当前正在播放或加载的队列项,再自动播放下一首。previous选择队列中仍保留的上一首;列表循环允许从第一首回到最后一首。已删除的曲目可通过历史重播接口重新加入。
请求体:
{
"volume_percent": 120
}范围会被后端强制裁剪到 0..200。
请求体:
{
"enabled": true
}请求体:
{
"mode": "all"
}支持值:
noneallone
自然播放结束时,none 删除已播放条目并继续,队列耗尽后停止;all 保留条目并在末尾回到第一首;one 保留并重新播放当前条目。随机开关与循环模式独立:随机 + all 循环整个随机队列,随机 + one 仍重复当前歌曲。
单曲循环的当前条目被手动删除后,播放结束会继续下一首。明确不可播放的条目(如歌曲下架、无版权)会被跳过并删除,临时接口故障则保留队列供重试。
这组接口是现有 Web 控制台使用的原始播放控制接口,外部接入也可以用,但新的第三方集成更推荐使用 /external/*。
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/voice/status |
获取播放状态 |
PUT |
/voice/volume |
设置音量 |
GET |
/voice/fx |
获取音效参数 |
PUT |
/voice/fx |
设置音效参数 |
POST |
/voice/play |
开始播放或从暂停恢复 |
POST |
/voice/pause |
暂停 |
POST |
/voice/next |
下一首 |
POST |
/voice/skip |
跳过当前曲目并删除队列项 |
POST |
/voice/previous |
上一首 |
POST |
/voice/seek |
调整当前播放进度 |
POST |
/voice/shuffle |
随机播放开关 |
POST |
/voice/repeat |
循环模式 |
字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
state |
string | idle、playing、paused、buffering、error |
now_playing_title |
string | 当前播放标题 |
now_playing_source_url |
string | 当前源地址 |
now_playing_artist |
string | 当前艺术家 |
now_playing_album |
string | 当前专辑 |
artwork_url |
string | 当前封面 |
track_id |
integer | null | 当前队列项 ID |
current_time |
number | 当前进度,秒 |
duration |
number | 总时长,秒 |
volume_percent |
integer | 音量百分比 |
is_shuffled |
boolean | 是否启用随机 |
repeat_mode |
string | none、all、one |
请求体字段都可选:
| 字段 | 类型 | 说明 |
|---|---|---|
pan |
number | 声像 |
width |
number | 声场宽度 |
swap_lr |
boolean | 左右声道互换 |
bass_db |
number | 低频增益 |
reverb_mix |
number | 混响比例 |
请求体:
{
"time": 120.0
}成功响应示例:
{
"ok": true,
"time": 120.0
}说明:
time单位为秒- 如果后端已知当前曲目的总时长,会自动将目标进度限制在
0 ~ duration - 对网易云和 QQ 音乐都会通过
voice-service重新从对应偏移启动解码
| 方法 | 路径 | 说明 |
|---|---|---|
POST |
/queue/netease |
网易云歌曲入队 |
POST |
/queue/qqmusic |
QQ 音乐歌曲入队 |
POST |
/queue/bilibili |
B 站视频入队并在播放时下载音频 |
GET |
/queue |
获取队列 |
DELETE |
/queue |
清空队列 |
POST |
/queue |
通用低层入队 |
DELETE |
/queue/{item_id} |
删除队列项 |
POST |
/queue/{item_id}/play |
播放队列项 |
GET |
/history |
获取历史 |
POST |
/history/{history_id}/replay |
通过历史记录重新点歌 |
请求体:
{
"song_id": "123456",
"title": "稻香",
"artist": "周杰伦",
"album": "魔杰座",
"duration_ms": 223000,
"cover_url": "https://...",
"level": "lossless",
"play_now": true
}说明:
level默认为autoauto会优先请求尽可能高的可播放音质- 指定更高音质时,上游
/song/url/v1会按歌曲和账号能力返回实际可用的level/br
响应:
{
"ok": true,
"id": 123,
"trial": false
}请求体:
{
"song_mid": "003aAYrm3GE0Ac",
"title": "江南",
"artist": "林俊杰",
"play_now": true,
"quality": "320",
"album_mid": "001fNHEf1SFEFN",
"duration_ms": 269000
}请求体:
{
"video_id": "BV1QQSDBWEGn",
"title": "【HiRes无损】周杰伦-太阳之子整张专辑 含歌词和单曲 共13首",
"artist": "太阳之子周杰伦专辑",
"album": "音乐综合",
"duration_ms": 6555000,
"cover_url": "https://i0.hdslb.com/...",
"play_now": true
}说明:
video_id支持 BV 号、av 号,或包含这两者的 B 站视频 URL- 实际播放前会先将音频下载到服务端本地缓存,再交给
voice-service
这是最底层的通用入队接口,不会帮你解析平台歌曲信息。请求体:
{
"track_id": "custom:demo",
"title": "Custom Song",
"artist": "Someone",
"source_url": "https://example.com/demo.mp3"
}查询参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
play_now |
boolean | 否 | 默认 true |
说明:
- 支持
netease:*、qqmusic:*、bilibili:*三类历史记录 - 会重新解析新的播放 URL / 本地缓存,而不是重用旧 URL
- QQ 音乐历史重播仍依赖服务端已配置的管理员 QQ 音乐 cookie
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/search |
网易云搜索,返回原始结构包装在 raw 里 |
GET |
/lyrics/{queue_item_id} |
读取队列项歌词;B 站队列项会在可用时返回视频字幕时间轴,并在配置管理员 B 站登录态时尝试补抓 AI 字幕 |
GET |
/playlist/detail |
按请求头里的 x-netease-cookie 查询歌单详情 |
查询参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
keywords |
string | 是 | 关键词 |
limit |
integer | 否 | 默认 20 |
offset |
integer | 否 | 默认 0 |
响应:
{
"raw": {
"result": {
"songs": []
}
}
}说明:
- 队列项不存在时返回
404 - 网易云会优先尝试服务端管理员 cookie
- QQ 音乐会尝试使用服务端管理员 QQ 音乐 cookie
- B 站队列项会尝试读取视频字幕,并按歌曲标题/歌手倾向选择更合适的语言轨道
- 如果配置了管理员 B 站 Cookie,后端会在公开视频接口拿不到字幕时继续尝试登录态 API 和 Playwright 页面抓取
这些接口需要 x-netease-cookie:
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/netease/account |
当前 cookie 对应账号信息 |
GET |
/netease/likelist |
喜欢歌曲 ID 列表,并尽量补充歌曲详情 |
GET |
/netease/likes |
/netease/likelist 的别名 |
GET |
/netease/playlists |
当前用户歌单 |
/netease/likelist 支持:
| 参数 | 类型 | 说明 |
|---|---|---|
offset |
integer | 起始偏移 |
limit |
integer | 数量,0 表示尽量全部 |
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/netease/qr/key |
申请二维码 key |
GET |
/netease/qr/create |
根据 key 生成二维码 |
GET |
/netease/qr/check |
轮询二维码状态 |
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/netease/search/suggest |
搜索建议 |
GET |
/netease/search/hot |
热搜 |
GET |
/netease/search/default |
默认搜索词 |
GET |
/netease/playlist/categories |
歌单分类 |
GET |
/netease/playlist/hot |
热门歌单分类 |
GET |
/netease/playlist/top |
网友精选歌单 |
GET |
/netease/playlist/highquality |
精品歌单 |
GET |
/netease/playlist/{playlist_id}/detail |
歌单详情 |
GET |
/netease/song/{song_id}/lyric |
歌词 |
GET |
/netease/recommend/playlists |
推荐歌单 |
/netease/playlist/top 支持参数:
| 参数 | 类型 | 说明 |
|---|---|---|
cat |
string | 分类,默认 全部 |
limit |
integer | 默认 50 |
offset |
integer | 默认 0 |
/netease/playlist/highquality 支持参数:
| 参数 | 类型 | 说明 |
|---|---|---|
cat |
string | 分类,默认 全部 |
limit |
integer | 默认 20 |
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/netease/song/url |
通过服务端已保存的管理员 cookie 获取歌曲播放 URL |
查询参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
id |
string | 是 | 歌曲 ID |
level |
string | 否 | 默认 auto,支持 auto、standard、higher、exhigh、lossless、hires、jyeffect、sky、dolby、jymaster |
响应会额外返回:
requested_level:本次请求的标准化音质level:上游实际返回的音质等级br:上游实际返回的码率
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/bilibili/search/videos |
搜索 B 站视频,返回统一后的结果结构 |
关键参数:
| 路径 | 参数 | 说明 |
|---|---|---|
/bilibili/search/videos |
keywords |
搜索词 |
/bilibili/search/videos |
limit |
默认 20,最大 50 |
/bilibili/search/videos |
page |
默认 1 |
返回项里的核心字段:
video_id:BV 号或 av 号title:视频标题artist:UP 主名称album:视频分区或分类description:简介摘要duration_ms:时长,毫秒artwork_url:封面 URLlikes:点赞数favorites:收藏数coins:投币数webpage_url:原始 B 站视频页
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/qqmusic/search |
完整搜索接口 |
GET |
/qqmusic/search/songs |
简化歌曲搜索 |
GET |
/qqmusic/song/{song_mid}/url |
获取播放 URL |
GET |
/qqmusic/song/{song_mid}/lyric |
获取歌词 |
GET |
/qqmusic/playlist/{playlist_id} |
歌单详情 |
GET |
/qqmusic/playlist/{playlist_id}/songs |
歌单歌曲列表 |
GET |
/qqmusic/playlist/{playlist_id}/name |
歌单名称 |
GET |
/qqmusic/album/{album_mid} |
专辑详情 |
GET |
/qqmusic/album/{album_mid}/name |
专辑名称 |
GET |
/qqmusic/singer/{singer_mid} |
歌手信息 |
GET |
/qqmusic/mv/{vid} |
MV 信息 |
GET |
/qqmusic/album/{album_mid}/cover |
专辑封面 URL |
关键参数:
| 路径 | 参数 | 说明 |
|---|---|---|
/qqmusic/search |
keywords |
搜索词 |
/qqmusic/search |
search_type |
默认 0,歌曲 |
/qqmusic/search |
limit |
默认 50 |
/qqmusic/search |
page |
默认 1 |
/qqmusic/search/songs |
keywords |
搜索词 |
/qqmusic/song/{song_mid}/url |
quality |
默认 320 |
/qqmusic/song/{song_mid}/lyric |
parse |
true 时返回解析后的结构 |
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/qqmusic/login/qr/key |
获取 QQ 音乐登录二维码 |
GET |
/qqmusic/login/qr/check |
检查二维码状态 |
POST |
/qqmusic/login/cookie |
在当前进程内设置 QQ 音乐 cookie |
GET |
/qqmusic/login/status |
当前进程内登录状态 |
POST |
/qqmusic/login/refresh |
刷新登录状态 |
GET |
/qqmusic/user/info |
当前登录用户信息 |
GET |
/qqmusic/user/playlists |
当前登录用户歌单 |
/qqmusic/login/qr/check 查询参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
qr_key |
string | 是 | 二维码 key |
ptqrtoken |
string | 是 | 扫码 token |
pt_login_sig |
string | 否 | 登录签名 |
/qqmusic/login/cookie 请求体:
{
"cookie": "uin=...; qm_keyst=...; ..."
}注意:
/qqmusic/login/cookie只把 cookie 写进当前进程内的 QQ 音乐客户端状态,不会持久化到数据库- 如果你要长期保存管理员 QQ 音乐 cookie,应该使用
/admin/qqmusic/*
| 方法 | 路径 | 是否需要 admin token | 说明 |
|---|---|---|---|
GET |
/admin/status |
否 | 是否已保存网易云管理员 cookie |
GET |
/admin/account |
是 | 当前管理员网易云账号信息 |
POST |
/admin/cookie |
是 | 写入网易云管理员 cookie |
GET |
/admin/qr/key |
是 | 获取管理员二维码 key |
GET |
/admin/qr/create |
是 | 生成管理员二维码 |
GET |
/admin/qr/check |
是 | 轮询并保存管理员 cookie |
POST |
/admin/ts/description |
是 | 设置 TeamSpeak 客户端简介 |
GET |
/admin/debug/cookie |
是 | cookie 指纹 |
GET |
/admin/debug/config |
是 | 配置指纹和关键配置 |
GET |
/admin/debug/runtime |
是 | 运行时路径信息 |
GET |
/admin/debug/song_url |
是 | 调试网易云歌曲 URL 解析 |
POST /admin/cookie 请求体:
{
"cookie": "MUSIC_U=...; __csrf=..."
}POST /admin/ts/description 请求体:
{
"description": "TSBot online"
}GET /admin/debug/song_url 查询参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
id |
string | 是 | 网易云歌曲 ID |
| 方法 | 路径 | 是否需要 admin token | 说明 |
|---|---|---|---|
GET |
/admin/qqmusic/status |
是 | 是否已保存管理员 QQ 音乐 cookie |
POST |
/admin/qqmusic/cookie |
是 | 写入管理员 QQ 音乐 cookie |
POST |
/admin/qqmusic/qr/confirm |
是 | 将扫码授权后的 auth_url 换成最终 cookie 并保存 |
POST /admin/qqmusic/cookie 请求体:
{
"cookie": "uin=...; qm_keyst=..."
}POST /admin/qqmusic/qr/confirm 请求体:
{
"auth_url": "https://graph.qq.com/..."
}| 方法 | 路径 | 是否需要 admin token | 说明 |
|---|---|---|---|
GET |
/admin/bilibili/status |
是 | 是否已保存管理员 B 站 cookie,以及 Playwright 是否可用 |
GET |
/admin/bilibili/account |
是 | 当前管理员 B 站账号信息 |
POST |
/admin/bilibili/cookie |
是 | 写入管理员 B 站 cookie |
POST |
/admin/bilibili/qr/start |
是 | 创建 B 站二维码登录会话并返回二维码图片 |
GET |
/admin/bilibili/qr/check |
是 | 轮询二维码登录状态,授权成功时保存管理员 cookie |
POST /admin/bilibili/cookie 请求体:
{
"cookie": "SESSDATA=...; bili_jct=..."
}GET /admin/bilibili/status 响应示例:
{
"admin_cookie_set": true,
"playwright_available": true,
"playwright_dependency_installed": true
}POST /admin/bilibili/qr/start 响应示例:
{
"session_id": "5f8f5c4e...",
"qrcode_key": "bfb1d1caaffe7fac02522b3b32089d70",
"qr_url": "https://account.bilibili.com/...",
"qr_image_base64": "iVBORw0KGgoAAA..."
}GET /admin/bilibili/qr/check 查询参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
session_id |
string | 是 | POST /admin/bilibili/qr/start 返回的登录会话 ID |
- 配置
TSBOT_API_TOKEN - 调用
/external/search - 调用
/external/queue - 轮询
/external/status - 需要切歌时调用
/external/player/action
如果你开启了 TSBOT_API_TOKEN,又还要继续使用前端:
- 后端设置
TSBOT_API_TOKEN - 前端构建前设置
VITE_API_TOKEN - 如果还要用管理员操作,再设置
TSBOT_ADMIN_TOKEN
建议额外配置:
- 网易云管理员 cookie:
/admin/cookie - QQ 音乐管理员 cookie:
/admin/qqmusic/cookie
否则以下能力可能受限:
- 获取实际播放 URL
- 播放 VIP / 试听 / 登录态相关资源
- 拉取部分用户歌单或用户信息
常见 HTTP 状态:
| 状态码 | 含义 |
|---|---|
400 |
参数缺失或格式不正确 |
401 |
缺少或错误的 API token |
403 |
缺少或错误的 admin token,或歌曲不可播放 |
404 |
资源不存在 |
402 |
常用于“歌曲需要 VIP/付费” |
500 |
服务内部错误 |
502 |
上游音乐接口异常 |
503 |
上游暂时不可用 |
额外说明:
- 上游网易云和 QQ 音乐部分接口返回结构较复杂,某些
/netease/*和/qqmusic/*路由会直接返回上游原始结构 - 如果你只是做外部控制集成,优先使用
/external/*