227 lines
8.0 KiB
Markdown
227 lines
8.0 KiB
Markdown
# BetterGI 直播联动
|
||
|
||
监听 B 站直播间弹幕,管理观众排队、积分、扫码上号、BetterGI 配置组与自动每日一条龙、队伍管理、点歌和 TTS 播报。
|
||
|
||
## 环境
|
||
|
||
- **Python**: 项目虚拟环境 `.venv`(Python 3.11)
|
||
- **Node.js**: 构建前端用
|
||
- **BetterGI**: `0.63.0+`,路径在 `config/config.json` 中配置
|
||
|
||
```powershell
|
||
# 安装 Python 依赖
|
||
py -3.11 -m venv .venv
|
||
.venv\Scripts\python.exe -m pip install -r requirements.txt
|
||
|
||
# 下载 TTS 模型(约 1.2GB,仅需一次)
|
||
.venv\Scripts\python.exe -c "from huggingface_hub import snapshot_download; snapshot_download('Qwen/Qwen3-TTS-12Hz-0.6B-Base')"
|
||
|
||
# 安装前端依赖并构建
|
||
cd frontend\admin
|
||
npm install
|
||
npm run build
|
||
```
|
||
|
||
## 启动
|
||
|
||
```powershell
|
||
.venv\Scripts\python.exe app\main.py --role all --host 0.0.0.0 --port 5191
|
||
```
|
||
|
||
| 参数 | 默认值 | 说明 |
|
||
|------|--------|------|
|
||
| `--role` | `all` | `queue` 仅排队/Web / `music` 仅音乐监听 / `tts` TTS 状态窗口 / `all` 同时启动全部(推荐,否则音乐页面不会随 SMTC 更新) |
|
||
| `--host` | `0.0.0.0` | 绑定地址 |
|
||
| `--port` | `8086` | 端口 |
|
||
|
||
启动后日志会打印本机和局域网访问地址,例如 `http://192.168.31.80:5191/admin`。
|
||
|
||
## 配置文件
|
||
|
||
配置文件统一为 `config/config.json`,支持热加载,保存后无需重启。
|
||
|
||
### bilibili — 直播间连接
|
||
|
||
| 字段 | 说明 |
|
||
|------|------|
|
||
| `room_id` | 直播间号(短号也可) |
|
||
| `sessdata` | B 站 Cookie SESSDATA,用于监听弹幕和发送回复 |
|
||
| `bili_jct` | CSRF token,发弹幕必须。和 SESSDATA 配套获取 |
|
||
|
||
获取方式:浏览器登录 B 站 → F12 → Application → Cookies → bilibili.com → 复制 `SESSDATA` 和 `bili_jct`。
|
||
|
||
> **注意**:`sessdata` 和 `bili_jct` 属于敏感登录凭证,不要分享本文件。缺少 `bili_jct` 时只能收弹幕不能回复。
|
||
|
||
### queue — 排队积分
|
||
|
||
| 字段 | 默认值 | 说明 |
|
||
|------|--------|------|
|
||
| `initial_points` | 10 | 新用户初始积分 |
|
||
| `signin_points` | 10 | 每日签到获得积分 |
|
||
| `max_points` | 30 | 积分上限 |
|
||
| `points_per_minute` | 1 | 队首每分钟扣除积分 |
|
||
| `admin_window_seconds` | 180 | 队首上号窗口(超时过号) |
|
||
| `default_group` | 薄荷 | 队列空时默认运行的 BetterGI 配置组 |
|
||
|
||
### global — 全局
|
||
|
||
| 字段 | 说明 |
|
||
|------|------|
|
||
| `admin_uids` | 管理员 UID 列表(一级用户,可用重置等特权指令) |
|
||
| `log_level` | 日志级别:`DEBUG` / `INFO` / `WARNING` |
|
||
|
||
### daily — 自动每日
|
||
|
||
| 字段 | 默认值 | 说明 |
|
||
|------|--------|------|
|
||
| `one_dragon_template` | 默认配置 | BGI 一条龙模板名称 |
|
||
| `managed_one_dragon_name` | 直播系统自动每日 | 每次覆盖生成并启动的托管配置名称 |
|
||
| `ley_line_craft_resin_before` | true | 地脉模式执行前是否合成树脂 |
|
||
| `commission_use_current_party` | true | 委托前读取游戏当前队伍名并写入 AutoCommissionNova 的战斗与元素采集队伍配置 |
|
||
| `current_party_read_timeout_sec` | 45 | 当前队伍 OCR 读取超时秒数 |
|
||
|
||
自动每日流程为“领取邮件 → 合成树脂 → 可选其他任务 → 领取尘歌壶奖励 → 领取每日奖励”。秘境俗称维护在 `config/domain_aliases.json`,修改后无需重启。
|
||
|
||
完整的 BGI 模板、战斗策略和三个配置组配置方法见 [自动每日与队伍管理](docs/自动每日.md)。
|
||
|
||
### broadcast — 弹幕播报与 TTS
|
||
|
||
| 字段 | 默认值 | 说明 |
|
||
|------|--------|------|
|
||
| `enable_danmu_reply` | true | 指令回复发到直播间 |
|
||
| `enable_system_danmu` | true | 系统通知发到直播间 |
|
||
| `enable_tts` | false | TTS 语音播报(需先下载模型) |
|
||
| `danmu_interval_sec` | 5 | 弹幕发送间隔 |
|
||
| `tts_provider` | none | `none` / `faster-qwen3-tts` / `dots-tts` |
|
||
|
||
### commands — 内置指令别名
|
||
|
||
14 个内置指令,每个可单独启用/禁用、自定义别名和允许角色:
|
||
|
||
| key | 默认别名 | 功能 |
|
||
|-----|----------|------|
|
||
| `queue` | 排队 | 加入排队队列 |
|
||
| `signin` | 签到 | 每日签到 |
|
||
| `login` | 上号 | 队首触发扫码上号 |
|
||
| `confirm_yes` | 是 | 确认账号正确 |
|
||
| `confirm_no` | 不是 | 确认账号不正确,重新扫码 |
|
||
| `run` | 执行, 跑, 开始 | 执行配置组(需带参数) |
|
||
| `daily` | 自动每日 | 启动托管的一条龙每日任务,可选秘境、地脉或委托模式 |
|
||
| `switch_party` | 切换队伍, 更换队伍 | 修改并执行配置组“切换队伍” |
|
||
| `edit_party` | 修改队员, 更换队员 | 校验四名角色后修改并执行配置组“修改队员” |
|
||
| `leave` | 退出 | 退出队列 |
|
||
| `reset` | 重置 | 一级用户重启原神和 BGI |
|
||
| `points` | 积分 | 查询积分 |
|
||
| `queue_list` | 队列 | 查看排队情况 |
|
||
| `help` | 帮助 | 显示帮助 |
|
||
|
||
### rules — 弹幕触发规则
|
||
|
||
```json
|
||
{
|
||
"keyword": "开始",
|
||
"match_type": "exact",
|
||
"groups": ["子探测单元"],
|
||
"cooldown": 60,
|
||
"admin_only": false,
|
||
"reply": "收到,开始执行子探测单元任务"
|
||
}
|
||
```
|
||
|
||
- `match_type`:`contains` / `exact` / `startswith` / `regex`
|
||
- 匹配后直接启动 `groups` 指定的 BetterGI 配置组
|
||
|
||
### music_monitor — 音乐监听与点歌
|
||
|
||
监听 Windows 系统媒体会话(SMTC),观众可通过弹幕点歌。
|
||
|
||
`request_player.commands`:点歌触发词,默认 `["点歌", "dg"]`。
|
||
|
||
### system — 系统定时任务
|
||
|
||
| 字段 | 说明 |
|
||
|------|------|
|
||
| `enable_startup_shortcut` | 开机自启 |
|
||
| `auto_reboot_time` | 每日自动重启时间 |
|
||
| `launch_bilibili_live_time` | 定时启动直播姬 |
|
||
| `launch_genshin_time` | 定时启动原神 |
|
||
|
||
## 后台管理
|
||
|
||
```
|
||
http://127.0.0.1:5191/admin
|
||
```
|
||
|
||
| 页面 | 功能 |
|
||
|------|------|
|
||
| 总览 | 运行状态、排队人数、服务健康、快捷操作 |
|
||
| 配置 | B 站连接、BetterGI 路径、队列参数、前台视觉 |
|
||
| 规则 | 弹幕触发规则 + 内置指令别名管理 |
|
||
| 队列 | 当前排队列表,支持移出、加减分、清空 |
|
||
| 用户 | 所有用户积分管理,支持加减分、踢出、删除 |
|
||
| 媒体 | 弹幕播报开关、TTS 配置与测试、音乐监听 |
|
||
| 日志 | 系统日志 + BetterGI 日志 |
|
||
| JSON | 原始 JSON 编辑 |
|
||
|
||
后台每 3 秒自动刷新,数据实时同步。
|
||
|
||
## 开发
|
||
|
||
### 前端
|
||
|
||
```powershell
|
||
cd frontend\admin
|
||
npm run build # 构建到 web/admin/
|
||
```
|
||
|
||
源码:`frontend/admin/src/main.js`(Vue3 单文件组件),`styles.css`。
|
||
|
||
### 后端
|
||
|
||
```powershell
|
||
# 编译检查
|
||
.venv\Scripts\python.exe -m py_compile app/danmu_queue.py
|
||
```
|
||
|
||
核心文件:
|
||
| 文件 | 功能 |
|
||
|------|------|
|
||
| `app/main.py` | 入口,启动 Web 服务和子模块 |
|
||
| `app/danmu_queue.py` | 弹幕监听、指令处理、队列管理、BGI 控制、TTS、Web API |
|
||
| `app/bettergi_daily.py` | 自动每日配置生成、秘境别名和队伍参数更新 |
|
||
| `app/bettergi_current_party.py` | 当前队伍读取托管配置组、状态协议和防串读校验 |
|
||
| `app/music_monitor.py` | SMTC 音乐监听与点歌调度 |
|
||
| `app/core/runtime_paths.py` | 运行时路径解析 |
|
||
|
||
## 打包
|
||
|
||
```powershell
|
||
# 轻量包(不含 TTS)
|
||
.\build.bat
|
||
|
||
# 完整包(含 TTS/GPU 依赖)
|
||
.\build.bat -FullTts
|
||
```
|
||
|
||
输出:`dist/LiveStreaming/LiveStreaming.exe`。
|
||
|
||
## 数据文件
|
||
|
||
| 路径 | 内容 |
|
||
|------|------|
|
||
| `data/users.json` | 用户账号与积分 |
|
||
| `data/queue_state.json` | 排队状态(启动时清空) |
|
||
| `data/ref_audio.wav` | TTS 参考音频 |
|
||
| `data/music_state.json` | 音乐播放状态 |
|
||
| `data/song_requests.json` | 点歌队列 |
|
||
| `logs/danmu_queue.log` | 主程序日志 |
|
||
|
||
## 弹幕链路排查
|
||
|
||
1. 确认 `config.json` 中 `room_id` 正确(浏览器打开直播间,URL 中数字)
|
||
2. 确认 `sessdata` 有效:看日志是否有 `SESSDATA有效, 账号=xxx`
|
||
3. 确认 WebSocket 连接:看日志是否有 `认证成功,开始监听弹幕`
|
||
4. 发弹幕测试:在直播间发 `帮助`,日志应出现 `[弹幕] 用户(uid): 帮助`
|
||
5. 如连接断线(`WinError 10013`),用管理员权限启动程序
|
||
6. DEBUG 统计:日志每 60 秒输出 `[弹幕统计] 收到N个raw | 解析N个包 | OP_MESSAGE=N | 提取弹幕=N`
|