Files
Live-streaming/README.md
T
2026-08-15 14:43:56 +08:00

207 lines
6.7 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**: conda 环境 `Live-streaming``E:\Programs\Anaconda3\envs\Live-streaming\python.exe`
- **Node.js**: 构建前端用
- **BetterGI**: 自动化脚本引擎,路径在 `config/config.json` 中配置
```powershell
# 安装 Python 依赖
E:\Programs\Anaconda3\envs\Live-streaming\python.exe -m pip install -r requirements.txt
# 下载 TTS 模型(约 1.2GB,仅需一次)
E:\Programs\Anaconda3\envs\Live-streaming\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` |
### 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 — 内置指令别名
11 个内置指令,每个可单独启用/禁用、自定义别名:
| key | 默认别名 | 功能 |
|-----|----------|------|
| `queue` | 排队 | 加入排队队列 |
| `signin` | 签到 | 每日签到 |
| `login` | 上号 | 队首触发扫码上号 |
| `confirm_yes` | 是 | 确认账号正确 |
| `confirm_no` | 不是 | 确认账号不正确,重新扫码 |
| `run` | 执行, 跑, 开始 | 执行配置组(需带参数) |
| `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
# 编译检查
E:\Programs\Anaconda3\envs\Live-streaming\python.exe -m py_compile app/danmu_queue.py
```
核心文件:
| 文件 | 功能 |
|------|------|
| `app/main.py` | 入口,启动 Web 服务和子模块 |
| `app/danmu_queue.py` | 弹幕监听、指令处理、队列管理、BGI 控制、TTS、Web API |
| `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`