mirror of
https://github.com/ZHANGTIANYAO1/teamspeak-music-bot.git
synced 2026-10-01 20:42:50 +08:00
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
18 KiB
18 KiB
TSMusicBot 设计文档
日期: 2026-03-29 状态: 已批准
概述
TSMusicBot 是一个从零构建的 TeamSpeak 音乐机器人,支持播放网易云音乐和 QQ 音乐。机器人作为 TeamSpeak 客户端连接服务器,用户可通过精美的 WebUI 或 TeamSpeak 内文字命令进行操控。安装体验为一键式,面向不懂代码的用户。
1. 架构设计
整体架构
单体架构(Monolith),所有组件运行在一个 Node.js 进程中。
┌─────────────────────────────────────────────────────────────────┐
│ TSMusicBot (单体进程) │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌───────────────────────┐ │
│ │ WebUI 层 │ │ TS 命令层 │ │ Bot 管理器 │ │
│ │ │ │ │ │ │ │
│ │ Vue.js SPA │ │ !play !next │ │ BotInstance #1 │ │
│ │ Express API │ │ !pause !vol │ │ BotInstance #2 │ │
│ │ WebSocket │ │ !queue !skip │ │ BotInstance #N │ │
│ └──────┬───────┘ └──────┬───────┘ └───────────┬───────────┘ │
│ │ │ │ │
│ └─────────────────┴──────────────────────┘ │
│ │ │
│ ┌────────────┴────────────┐ │
│ │ 核心服务层 │ │
│ │ │ │
│ │ ┌───────────────────┐ │ │
│ │ │ 播放引擎 │ │ │
│ │ │ FFmpeg 解码 │ │ │
│ │ │ Opus 编码 │ │ │
│ │ │ 播放队列管理 │ │ │
│ │ └───────────────────┘ │ │
│ │ │ │
│ │ ┌───────────────────┐ │ │
│ │ │ 音乐源服务 │ │ │
│ │ │ 网易云 API │ │ │
│ │ │ QQ音乐 API │ │ │
│ │ │ 搜索/歌单/专辑 │ │ │
│ │ └───────────────────┘ │ │
│ │ │ │
│ │ ┌───────────────────┐ │ │
│ │ │ TS 协议层 │ │ │
│ │ │ TCP 命令通道 │ │ │
│ │ │ UDP 语音通道 │ │ │
│ │ │ (无加密) │ │ │
│ │ └───────────────────┘ │ │
│ └─────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 数据层 │ │
│ │ SQLite (用户数据/播放记录) + JSON (配置/Cookie) │ │
│ └──────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
六大核心模块
- TS 协议层 — 实现 TeamSpeak 3 客户端协议(参考 TSLib),包括 TCP 命令通道(登录、频道操作、文字消息)和 UDP 语音通道(Opus 音频包发送)。不实现加密。
- 播放引擎 — 通过 FFmpeg 子进程解码音频源(MP3/FLAC/AAC),输出 PCM 数据,再用 node-opus 编码为 Opus 格式,按 20ms 帧发送到 TS 语音通道。管理播放队列、循环模式、音量控制。
- 音乐源服务 — 内嵌启动 NeteaseCloudMusicApi 和 QQMusicApi 服务,提供统一的搜索、获取歌曲 URL、歌单、专辑、歌词等接口。处理账号登录(扫码/短信/Cookie)和 Cookie 自动刷新。
- WebUI + API — Express 提供 REST API 和静态文件服务(Vue.js SPA)。WebSocket 实现实时状态推送(当前播放、队列变化、在线用户)。
- Bot 管理器 — 管理多个 BotInstance 的生命周期。每个实例拥有独立的 TS 连接、播放引擎和队列。支持通过 WebUI 创建/删除/配置实例。
- TS 命令层 — 监听 TS 频道文字消息,解析命令(如 !play、!next、!vol),权限检查后转发给对应的 BotInstance 执行。支持自定义命令前缀和别名。
数据流
用户点歌 (!play 晴天 或 WebUI 搜索)
→ 命令层/API 层调用音乐源服务搜索歌曲
→ 音乐源服务从网易云/QQ音乐 API 获取歌曲 URL
→ 播放引擎: FFmpeg 下载并解码为 PCM → Opus 编码
→ TS 协议层: 通过 UDP 将 Opus 音频包发送到 TS 服务器
→ WebSocket: 推送播放状态更新到 WebUI
2. WebUI 设计
设计风格
参考 YesPlayMusic(Apple Music 风格),核心设计要素:
- 深色主题为默认,支持浅色主题切换
- 毛玻璃导航栏和播放栏 (
backdrop-filter: blur(20px)) - 专辑封面彩色阴影效果(
node-vibrant动态提取主色) - 大字号标题(22-42px),Barlow + PingFang SC / Microsoft YaHei 字体
- 圆角卡片(10-14px radius),充足留白
- 流畅微交互(hover scale 1.04, active scale 0.96, 0.3s transitions)
- 沉浸式歌词页 — 全屏、模糊背景、动态色彩
整体布局
- 固定毛玻璃导航栏(56px,顶部):Logo、导航链接(发现/搜索/歌单/播放历史)、Bot 状态指示、管理入口
- 主内容区:10vw 水平内边距,Bot 实例切换器 + 主要内容 + 右侧边栏(队列/频道信息)
- 固定毛玻璃播放栏(56px,底部):当前歌曲信息、播放控制、音量/队列/歌词入口
页面清单
- 发现(首页) — 推荐歌单、热门排行、正在播放状态、快速搜索入口
- 搜索 — 跨平台搜索(网易云/QQ音乐切换),结果展示歌曲/歌单/专辑/歌手
- 歌单详情 — 歌单封面、歌曲列表、一键播放全部、逐首添加到队列
- 歌词页 — 沉浸式全屏歌词,动态背景(专辑色彩提取),逐行高亮
- 播放历史 — 播放记录,按时间/平台筛选,快速重播
- 设置/管理 — Bot 实例管理、TS 服务器连接配置、音乐账号登录(扫码/短信/Cookie)、命令前缀设置、频道行为配置
3. TeamSpeak 命令系统
用户在 TeamSpeak 频道内发送文字消息控制机器人。默认命令前缀 !,可在 WebUI 中自定义。支持私聊和频道消息两种触发方式。
播放控制
| 命令 | 说明 |
|---|---|
!play <歌名/URL/ID> |
搜索并播放歌曲(默认网易云,加 -q 切 QQ 音乐) |
!play -q <歌名> |
从 QQ 音乐搜索并播放 |
!pause |
暂停播放 |
!resume |
恢复播放 |
!stop |
停止播放并清空队列 |
!next / !skip |
下一首 |
!prev |
上一首 |
!vol <0-100> |
设置音量 |
!now |
显示当前播放歌曲信息 |
队列管理
| 命令 | 说明 |
|---|---|
!add <歌名/URL/ID> |
添加歌曲到队列尾部(不立即播放) |
!queue / !list |
显示当前播放队列 |
!clear |
清空播放队列 |
!remove <序号> |
移除队列中指定位置的歌曲 |
!mode <seq|loop|random|rloop> |
切换播放模式:顺序/单曲循环/随机/随机循环 |
歌单 & 专辑
| 命令 | 说明 |
|---|---|
!playlist <歌单ID/URL> |
加载歌单并开始播放 |
!album <专辑ID/URL> |
加载专辑并开始播放 |
!fm |
开启私人 FM 模式(网易云) |
社交互动
| 命令 | 说明 |
|---|---|
!vote |
发起投票切歌(频道内过半数同意即跳过) |
!lyrics |
在频道消息中显示当前歌词片段 |
管理命令
| 命令 | 说明 |
|---|---|
!move <频道名/ID> |
移动机器人到指定频道 |
!follow |
机器人跟随你到你所在的频道 |
!help |
显示命令帮助列表 |
命令系统特性
- 命令前缀可自定义(默认
!),在 WebUI 设置页修改 - 命令别名可配置(如
!p→!play) - 搜索结果多首时,回复序号选择
- 支持私聊和频道消息两种触发方式
权限系统
- 所有人: play, add, queue, now, lyrics, vote, help
- 管理员: stop, clear, move, vol, mode, follow
- 管理员通过 TS Server Group 或 WebUI 配置指定
- WebUI 管理页面需要密码登录
4. 技术栈
后端
| 依赖 | 用途 |
|---|---|
| Node.js 20 LTS | 运行时 |
| TypeScript 5.x | 开发语言 |
| Express 4.x | Web 框架 |
| ws | WebSocket |
| better-sqlite3 | SQLite 数据库 |
| FFmpeg (子进程) | 音频解码 |
| @discordjs/opus 或 opusscript | Opus 编码 |
| 自研 TS3 协议 (参考 TSLib) | TeamSpeak 连接 |
| Node.js crypto + tweetnacl | Ed25519 身份 |
| NeteaseCloudMusicApi (内嵌) | 网易云音乐 API |
| QQMusicApi (内嵌) | QQ 音乐 API |
| pino | 日志 |
前端
| 依赖 | 用途 |
|---|---|
| Vue 3 + Composition API | UI 框架 |
| Vite 5.x | 构建工具 |
| Vue Router 4 | 路由 |
| Pinia | 状态管理 |
| SCSS + CSS Variables | 样式 / 主题 |
| node-vibrant | 专辑封面主色提取 |
| Iconify | 图标 (按需加载) |
| axios | HTTP 客户端 |
| Barlow + 系统中文字体 | 排版 |
数据存储
- SQLite (better-sqlite3): 用户数据、播放记录、Bot 实例信息
- JSON 文件: 应用配置(方便手动编辑)、音乐平台 Cookie
5. 项目结构
TSMusicBot/
├── package.json
├── tsconfig.json
├── config.json # 用户配置(JSON,可手动编辑)
│
├── src/ # 后端源码
│ ├── index.ts # 入口:启动所有服务
│ │
│ ├── ts-protocol/ # TeamSpeak 3 客户端协议实现(无加密)
│ │ ├── connection.ts # TCP/UDP 连接管理
│ │ ├── identity.ts # TS3 身份生成与管理
│ │ ├── commands.ts # TS3 命令编解码
│ │ ├── voice.ts # 语音数据包发送/接收
│ │ └── client.ts # 高层 TS3 Client 封装
│ │
│ ├── audio/ # 音频处理
│ │ ├── player.ts # 播放引擎(FFmpeg → Opus → TS)
│ │ ├── queue.ts # 播放队列管理
│ │ └── encoder.ts # Opus 编码封装
│ │
│ ├── music/ # 音乐源服务
│ │ ├── provider.ts # 统一音乐源接口
│ │ ├── netease.ts # 网易云适配器
│ │ ├── qq.ts # QQ音乐适配器
│ │ ├── auth.ts # 账号认证(扫码/短信/Cookie)
│ │ └── api-server.ts # 内嵌 API 服务启动器
│ │
│ ├── bot/ # Bot 核心
│ │ ├── instance.ts # BotInstance(一个TS连接+播放引擎)
│ │ ├── manager.ts # 多实例管理器
│ │ └── commands.ts # TS 文字命令解析与执行
│ │
│ ├── web/ # Web 服务
│ │ ├── server.ts # Express + 静态文件 + WebSocket
│ │ ├── api/ # REST API 路由
│ │ │ ├── bot.ts # Bot 管理接口
│ │ │ ├── music.ts # 搜索/歌单/歌曲接口
│ │ │ ├── player.ts # 播放控制接口
│ │ │ └── auth.ts # 登录认证接口
│ │ └── websocket.ts # WebSocket 事件推送
│ │
│ └── data/ # 数据层
│ ├── database.ts # SQLite 封装
│ ├── config.ts # JSON 配置读写
│ └── migrations/ # 数据库迁移脚本
│
├── web/ # 前端源码 (Vue.js SPA)
│ ├── index.html
│ ├── vite.config.ts
│ ├── src/
│ │ ├── App.vue
│ │ ├── main.ts
│ │ ├── router/ # 路由定义
│ │ ├── stores/ # Pinia 状态管理
│ │ ├── views/ # 页面组件
│ │ │ ├── Home.vue # 发现/首页
│ │ │ ├── Search.vue # 搜索
│ │ │ ├── Playlist.vue # 歌单详情
│ │ │ ├── Lyrics.vue # 沉浸式歌词
│ │ │ ├── History.vue # 播放历史
│ │ │ └── Settings.vue # 设置/管理
│ │ ├── components/ # 可复用组件
│ │ │ ├── Player.vue # 底部播放栏
│ │ │ ├── Navbar.vue # 顶部导航栏
│ │ │ ├── Queue.vue # 播放队列面板
│ │ │ ├── SongCard.vue # 歌曲卡片
│ │ │ └── CoverArt.vue # 带彩色阴影的封面组件
│ │ ├── composables/ # 组合式函数
│ │ │ ├── useWebSocket.ts # WebSocket 连接
│ │ │ └── usePlayer.ts # 播放器状态
│ │ └── styles/ # 全局样式
│ │ ├── variables.scss # CSS 变量 / 主题
│ │ └── global.scss # 全局样式
│ └── public/
│
├── scripts/ # 部署脚本
│ ├── install.sh # Linux 一键安装
│ ├── install.bat # Windows 一键安装
│ └── docker/
│ ├── Dockerfile
│ └── docker-compose.yml
│
└── data/ # 运行时数据(gitignore)
├── tsmusicbot.db # SQLite 数据库
├── cookies/ # 音乐平台 Cookie
└── logs/ # 日志文件
6. 部署与安装
Windows
- 安装包 (.exe): 使用 pkg 打包 Node.js + 应用为单个 .exe,FFmpeg 作为附带二进制文件,Inno Setup 生成安装程序。双击安装 → 桌面快捷方式 → 双击启动 → 自动打开浏览器。
- 便携版 (.zip): 解压即用,包含所有依赖,双击
start.bat启动。
Linux
- 一键脚本:
curl -fsSL https://get.tsmusicbot.com | bash— 自动检测系统、安装 Node.js/FFmpeg、下载 TSMusicBot、配置 systemd 服务、启动。 - Docker:
docker run -d -p 3000:3000 tsmusicbot/tsmusicbot— 镜像基于 node:20-slim,内含 FFmpeg,映射./data持久化。
首次运行引导 (Setup Wizard)
4 步引导流程,在 WebUI 中完成:
- 欢迎 — 设置 WebUI 管理员密码、选择语言(中/英)、选择主题(深色/浅色)
- 连接 TS 服务器 — 输入服务器地址、端口、昵称、默认频道,点击"测试连接"验证
- 音乐账号(可选) — 扫码/短信/Cookie 登录网易云或 QQ 音乐账号,跳过则只能播放免费歌曲
- 完成 — Bot 已连接到 TS 服务器,跳转到主界面
端口配置
- WebUI 默认端口:
3000(可在 config.json 中修改) - 内嵌网易云 API 端口:
3001(内部使用,不对外暴露) - 内嵌 QQ 音乐 API 端口:
3002(内部使用,不对外暴露)
7. 功能清单 (V1)
播放功能
- 搜索并播放歌曲(网易云/QQ音乐)
- 播放/暂停/停止/上一首/下一首
- 音量调节 (0-100)
- 4 种播放模式:顺序、单曲循环、随机、随机循环
播放列表
- 加载网易云/QQ音乐歌单
- 加载专辑
- 创建临时播放队列(添加/移除/清空/查看)
- 私人 FM 模式(网易云)
频道管理
- 自动跟随用户切换频道
- 无人时自动暂停
- 自动回到默认频道(可配置延迟)
- 手动移动到指定频道
社交互动
- 频道描述/Bot 头像更新为当前歌曲信息
- 投票切歌(频道内过半数同意)
- 频道内显示歌词片段
多实例
- 一个 WebUI 管理多个 Bot 实例
- 每个实例独立连接不同 TS 服务器或频道
- 独立的播放队列和配置
账号认证
- 扫码登录(网易云/QQ音乐)
- 短信登录(网易云)
- Cookie 手动导入
- Cookie 自动刷新
8. 未来演进
- 当音频编码出现性能瓶颈时,将 Opus 编码迁移到 Worker Threads
- 可扩展的音乐源插件系统(支持添加更多平台)
- 移动端 WebUI 适配