高效稳定的 Bilibili 直播间 AI 场控机器人管理系统,基于 Vue 3 + GoFrame 构建,支持多直播间并发管理、AI 智能弹幕互动、优先级消息队列处理。
AuthAllowed的机器人账号可登录管理后台,避免越权| 层 | 技术 | 说明 |
|---|---|---|
| 前端框架 | Vue 3 + TypeScript | 组合式 API、文件路由 |
| UI 组件库 | PrimeVue 4 | Material Design 风格 |
| 构建工具 | Vite 7 | HMR、组件自动导入 |
| 路由 | Vue Router 4 (Hash 模式) | unplugin-vue-router 文件路由 |
| HTTP 客户端 | Axios | 请求/响应拦截器、JWT 注入 |
| 后端框架 | GoFrame v2 | Go 语言企业级 Web 框架 |
| ORM | GORM + SQLite | 轻量级嵌入式数据库 |
| 实时通信 | WebSocket (gorilla/websocket) | B站直播间弹幕监听 |
| AI 能力 | CNB SDK (go-cnb) | 大模型聊天补全接口 |
| 容器化 | Docker / Docker Compose | 多阶段构建 |
bili-bot/ ├── src/ # 前端源码 │ ├── api/ # API 客户端模块 │ │ ├── anchor.ts # 主播相关接口(含场控启停) │ │ ├── auth.ts # 认证接口(登录/用户信息) │ │ ├── bot.ts # 机器人账号接口(登录/列表) │ │ └── config.ts # 全局配置接口 │ ├── pages/ # 页面组件(文件路由) │ │ ├── index.vue # 首页仪表盘 │ │ ├── login.vue # 扫码登录页面 │ │ ├── anchors.vue # 主播管理与场控控制 │ │ ├── bot-accounts.vue # 机器人账号管理 │ │ └── config.vue # 全局配置管理 │ ├── plugins/ # Vue 插件 │ │ ├── index.ts # 插件注册入口 │ │ └── primevue.ts # PrimeVue 配置 │ ├── router/ # 路由配置 + JWT 守卫 │ ├── styles/ # 全局样式(暗色主题) │ ├── utils/request.ts # Axios 封装(baseURL、拦截器) │ ├── App.vue # 根组件(顶部导航栏 + Toast) │ └── main.ts # 应用入口 │ ├── cloud-functions/ # 后端源码(Go) │ ├── index.go # 程序入口 main() │ ├── api/ # API 接口定义层(请求/响应结构体) │ │ ├── auth/ # 认证鉴权接口定义 │ │ └── bili/ # B站业务接口定义 │ ├── internal/ │ │ ├── boot/boot.go # 启动初始化(目录创建、数据库迁移) │ │ ├── cmd/cmd.go # HTTP 服务配置(路由/中间件/Swagger) │ │ ├── consts/ # 常量 + AI Prompt 人设 │ │ ├── controller/ # 控制器层(HTTP 处理函数) │ │ ├── logic/ # 业务逻辑层(核心实现) │ │ │ ├── bili/ │ │ │ │ ├── bili.go # BiliApi 实例、Cookie 持久化、配置 CRUD │ │ │ │ ├── bili_account.go # Bot 账号管理 │ │ │ │ ├── bili_room.go # 主播/房间管理 │ │ │ │ ├── live_manager.go # ★ 直播场控管理器(WebSocket) │ │ │ │ └── message_queue.go # ★ 优先级消息队列 + AI 对话引擎 │ │ │ ├── auth/jwt.go # JWT 双令牌签发/验证 │ │ │ └── cnb/cnb.go # CNB AI 平台集成 │ │ ├── middleware/jwt.go # JWT 认证中间件 │ │ ├── models/orm_models/ # 数据模型(Bot / Room / Config 三张表) │ │ ├── service/ # 服务接口层(依赖注入) │ │ └── utils/ # 工具类(密钥/Cookie/JWT 底层) │ └── storage/ # 运行时存储 │ ├── private/bili-bot.db # SQLite 数据库文件 │ └── public/web/ # 前端构建产物 │ ├── docker-compose.yml # Docker Compose 编排 ├── Dockerfile # 多阶段构建(Node + Go + Debian Slim) ├── vite.config.mts # Vite 配置(代理、路径别名、构建输出) ├── package.json # 前端依赖与脚本 └── tsconfig.json # TypeScript 配置
# 1. 安装前端依赖并启动开发服务器
npm install
npm run dev # 访问 http://localhost:3000
# 2. 另一个终端:启动后端服务(默认端口 9204)
cd cloud-functions && go run index.go
开发环境下前端通过 Vite proxy 将
/api请求代理到后端http://127.0.0.1:9204首次启动时扫码登录的第一个账号会自动添加为可登录账号
# 使用 Docker Compose 一键启动
docker compose up -d
# 或自定义端口启动
BILI_BOT_PORT=9204 docker compose up -d
# 前端构建 → 输出到 cloud-functions/web/
npm run build
# 后端构建 → 单二进制文件
cd cloud-functions && CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -o bili-bot ./index.go
系统采用 事件驱动 + 优先级队列 架构处理直播间实时事件:
┌─────────────┐ ┌─────────────────┐ ┌──────────────────┐ │ HTTP API │────▶│ LiveManager │────▶│ WebSocket Client │ │ 启停/查询 │ │ 全局单例 │ │ 每房间独立连接 │ └─────────────┘ └─────────────────┘ └──────────────────┘ │ ▼ ┌─────────────────────┐ │ 优先级消息队列 │ │ P1(高) P2(中) P3(低) │ └─────────────────────┘ │ ▼ ┌─────────────────────┐ │ CNB AI 大模型调用 │ │ 生成回复 → 发送弹幕 │ └─────────────────────┘
| 优先级 | 事件类型 | 处理策略 |
|---|---|---|
| P1 高 | @机器人的弹幕、价值 ≥500 元的礼物 | 立即单独处理 |
| P2 中 | 普通弹幕、普通礼物 | 立即单独处理 |
| P3 低 | 用户进房、点赞 | 满10条或每2秒批量合并处理 |
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/v1/auth/qrcode/generate | 生成管理端登录二维码 |
| POST | /api/v1/auth/login/qrcode | 扫码登录(返回 JWT 双令牌) |
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/v1/bli/config | 获取全部全局配置 |
| PUT | /api/v1/bli/config | 批量更新全局配置 |
| GET | /api/v1/bli/config/default-prompt | 获取系统默认提示词配置 |
| POST | /api/v1/bli/ai/expand-prompt | AI扩写提示词内容 |
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/v1/bli/qrcode/generate | 生成 Bot 登录二维码 |
| POST | /api/v1/bli/qrcode/login | 查询 Bot 登录状态 |
| GET | /api/v1/bli/accounts | 获取全部 Bot 账号列表 |
| DELETE | /api/v1/bli/account/{id} | 删除指定 Bot 账号 |
| PATCH | /api/v1/bli/account/{id}/auth-allowed | 更新账号允许登录状态 |
| POST | /api/v1/bli/account/{uid}/send-danmaku | 使用指定机器人发送测试弹幕到目标直播间 |
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/v1/bli/anchor/info/by/code | 通过身份码新增/更新主播 |
| GET | /api/v1/bli/anchor | 获取全部主播列表 |
| DELETE | /api/v1/bli/anchor/{id} | 删除主播 |
| PUT | /api/v1/bli/anchor/{id}/bot | 绑定/解绑场控机器人 |
| POST | /api/v1/bli/room/{id}/start | 启动直播间场控 |
| POST | /api/v1/bli/room/{id}/stop | 停止直播间场控 |
| GET | /api/v1/bli/room/{id}/status | 查询场控运行状态 |
| GET | /api/v1/bli/room/status/list | 所有运行中的直播间ID列表 |
| PUT | /api/v1/bli/room/{id}/prompt | 更新直播间AI提示词配置 |
| 路径 | 用途 |
|---|---|
/swagger | Swagger API 文档(Scalar UI) |
/* | 静态文件服务(前端页面) |
使用 SQLite + GORM,三张核心表:
Bot 表 — 机器人账号
| 字段 | 类型 | 说明 |
|---|---|---|
| ID | uint64 PK | 自增主键 |
| Uid | int64 UNIQUE | B站 UID |
| Info | JSON | 用户详细信息 |
| AuthAllowed | bool | 是否允许登录管理后台,至少保留一个开启的账号 |
| Cookies | JSON | 登录 Cookie 凭证 |
Room 表 — 直播间
| 字段 | 类型 | 说明 |
|---|---|---|
| ID | uint64 PK | 自增主键 |
| RoomId | int64 UNIQUE | B站房间号 |
| BotId | int64 FK | 关联的机器人 UID |
| Code | string UNIQUE | B站身份码 |
| Info | JSON | 主播详细信息 |
| San | int | san值 |
| Level | int | 等级 |
| PromptBotRole | text | 直播间自定义AI角色设定,空则使用全局默认 |
| PromptAnchorStyle | text | 直播间自定义主播风格/直播内容设定,空则使用全局默认 |
| PromptCustomRules | text | 直播间自定义回复规则,空则使用全局默认 |
Config 表 — 全局配置(键值对)
| 字段 | 类型 | 说明 |
|---|---|---|
| Key | string UNIQUE | 配置键名 |
| Value | text | 配置值 |
| Desc | string | 配置描述 |
预置配置项:
CNB_TOKEN — CNB 平台 API 访问令牌CNB_REPO_SLUG — CNB 平台仓库标识DANMAKU_MAX_LENGTH — 弹幕最大长度(汉字,默认40,B站官方上限)GLOBAL_PROMPT_BOT_ROLE — 全局默认AI角色设定GLOBAL_PROMPT_ANCHOR_STYLE — 全局默认主播风格/直播内容设定GLOBAL_PROMPT_CUSTOM_RULES — 全局默认自定义回复规则关系图:
Room (N) ──BotId──> (1) Bot 一个 Bot 可服务多个直播间 Room.Code ──身份码──> B站开放平台 Bot.Cookies ──凭证──> B站 API 调用 Config.Key/Value ──> CNB AI 平台集成
npm run dev # 启动开发服务器 (localhost:3000)
npm run build # TypeScript 类型检查 + 生产构建
npm run type-check # 仅执行类型检查
npm run lint # ESLint 检查并自动修复
npm run preview # 预览生产构建结果
go run index.go # 本地运行
go test ./... # 运行全部测试
go build -o bili-bot ./index.go # 构建二进制文件
gf gen ctrl # 新增API定义后自动生成控制器代码
gf gen service # 编写完 logic 后同步 service 接口定义
欢迎参与贡献!无论是 Bug 修复、新功能开发还是文档改进,都非常感谢。
详细的贡献规范、开发流程和常见贡献方向请参考 CONTRIBUTING.md 文档。
如果发现 Bug 或有功能建议,请通过 Issue 提交,尽量包含以下信息:
基于 MIT License 开源。
Copyright (c) 2026 xqitw