Files
Live-streaming/README.md
T

227 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`