我写了个 TeamSpeak 音乐机器人:TSBot
写在前面
NeteaseTSBot 一个基于 TeamSpeak 的音乐机器人;
之前常见的组合基本都是:
TS3AudioBotNeteaseCloudMusicApi- 一些第三方插件
问题是那套东西后面越来越难维护,尤其是我之前用的那套 NeteaseCloudMusicApi 相关方案,后面连项目都弄丢了,也没有新版能继续用。继续在老东西上修修补补没太大意义,所以我就自己重新写了一套。
先放地址:

这个项目是干嘛的
TSBot 是一个基于 TeamSpeak 的音乐机器人,voice-service 主客户端连接现在已经支持 TS6。
目前主要提供这些东西:
- TeamSpeak 语音播放
- 播放队列和基础控制,比如暂停、继续、上一首、下一首、音量、随机、循环
- 网易云音乐搜索 / 歌单 / 喜欢 / 歌词,通过外部
NeteaseCloudMusicApi服务接入 - QQ 音乐搜索 / 歌单 / 歌词 / 播放链接,后端内建适配
- Web 控制台,用来搜索、管理队列、看歌词和做一些设置
不是单纯只靠命令的 bot,我这里单独做了网页控制台,日常操作会方便很多。
项目结构
这个项目现在分成 3 个部分:
backend/:Python / FastAPI 后端,负责队列、搜索、网易云与 QQ 音乐接口、控制语音服务voice-service/:Rust 语音服务,负责连接 TeamSpeak、播放音频,并通过 gRPC 给后端调用web/:Vue3 + Vite 前端,用来做 Web 控制台
整体关系大概是这样:
text
1 | [web (Vue3)] <--HTTP--> [backend (FastAPI)] <--gRPC--> [voice-service (Rust)] --> TeamSpeak (TS3/TS6) |
为什么要这样拆
这个项目一开始就是冲着“解耦性”去做。
主要解决:
- 语音和业务解耦:
voice-service只负责连接 TeamSpeak 和播放音频,通过 gRPC 暴露控制接口 - 网易云作为可替换依赖:后端通过
TSBOT_NETEASE_API_BASE对接外部NeteaseCloudMusicApi,以后要换实现也比较好改 - 前后端和语音服务独立迭代:哪一层出问题就查哪一层,不至于一个地方坏了全都跟着炸
这个东西本质上不是为了“堆功能”,主要还是为了后面能继续维护。

目前支持
TeamSpeak / TS6
voice-service的主客户端连接已经适配 TeamSpeak 服务器登录、进频道、收发文字消息和音频播放- 当前可用于 TS3 / TS6 服务器
- 代码里还保留了一条 legacy
ServerQueryfallback,只是做一些旧兼容,不是 TS6 的 HTTP(S) Query 接口
网易云音乐
这里不直接调网易云官方接口,而是通过自己部署的 NeteaseCloudMusicApi 服务转发。
所以如果你要用网易云这部分,需要自己准备:
NeteaseCloudMusicApiTSBOT_NETEASE_API_BASE
QQ 音乐
QQ 音乐这边不需要额外部署独立 API 服务,后端已经内建了适配。
目前已经做了:
- 搜索
- 歌曲详情
- 歌单详情
- 歌词
- 专辑 / 歌手 / MV 信息
有些依赖登录态的能力,比如用户歌单或者更稳定的播放链接,还是需要vip Cookie,而且cookie几天就刷新,目前没找到办法。
Web 控制台
前端:
- 搜索歌曲
- 浏览歌单
- 管理播放队列
- 控制播放状态
- 看歌词
- 设置 Cookie 或一些平台配置
系统要求
- Linux,推荐 Ubuntu 20.04+
- Python: 3.8+
- Node.js: 16+
- Rust: 1.70+
音乐源:
- 网易云音乐:需要单独部署
NeteaseCloudMusicApi - QQ 音乐:后端内建适配,但部分登录态能力需要管理员 Cookie
部署这块
这篇不展开写部署步骤,仓库里已经放了这些文档:
HOWTOSTART.md:部署和运行说明LOGGING.md:日志系统说明web/README.md:前端相关说明
另外也放了常见的启动脚本,像:
nohup-start.shnohup-stop.shnohup-status.sh
如果后面有空我再单独写一篇部署记录。
最后
目前这个项目还在继续改,后面大概还是会往下面这些方向补:
- 前端体验
- 平台适配
- 部署流程
- 一些历史兼容问题
不多说,地址再放一次:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Yumi's Blog!
评论
TwikooLivere


