# BetterGI 直播联动 监听 B 站直播间弹幕,管理观众排队、积分、扫码上号、BetterGI 配置组与自动每日一条龙、队伍管理、点歌和 TTS 播报。 ## 环境 - **Python**: 项目虚拟环境 `.venv` 或 `.venv-tts`(Python 3.11+) - **Node.js**: 构建前端用 - **BetterGI**: 自动化脚本引擎,路径在 `config/config.json` 中配置 ```powershell # 安装 Python 依赖 .venv\Scripts\python.exe -m pip install -r requirements.txt # 下载 TTS 模型(约 1.2GB,仅需一次) .venv-tts\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 / `tts` TTS 状态窗口 / `all` 启动排队/Web 和内置 mpv 点歌(推荐) | | `--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 — 音乐监听与点歌 观众可通过弹幕点歌,内置 mpv 播放器负责播放、续播和状态维护;旧版 `music_monitor.py` 仍保留用于兼容历史配置,但不再作为独立进程启动。 `request_player.commands`:点歌触发词,默认 `["点歌", "dg"]`。 ### llm_reply — AI 弹幕回复(默认关闭) 把观众弹幕交给 LLM 自动回复,回复同时走弹幕+TTS 通道(后台「AI回复」页可配置,支持测试)。 直播前台 `/` 现显示绮良良像素桌宠。`web/uploads/kirara_walk_front.png`、`kirara_walk_back.png`、`kirara_walk_left.png`、`kirara_walk_right.png` 分别提供正面、背面、左侧、右侧四帧无尾巴走路动画;桌宠只沿水平或垂直方向游走,步态帧随移动距离切换,停下时切回正面静止帧。每隔 60–90 秒开始一次移动,持续 10–15 秒,移动速度为 21–35 像素/秒。旁边的黄、蓝、红进度环按体力、清洁、心情从外到内套叠,尺寸为 40×40 像素,以方格绘制阶梯状轮廓,不显示文字。角色与状态环一起沿游戏镂空区外的上、右、下区域游走。体力、清洁和心情均为 0–100,首次为 100;每 15 秒查询一次 B 站直播间状态,只有确认直播中才累计时间,每累计一小时体力和清洁各减 10。查询短暂失败时沿用最近状态最多 60 秒;服务停机期间不补扣。两项同时低于 40 时心情每小时减 5,同时高于 80 时每小时加 3。AI 回复应以 `[开心]`、`[很开心]`、`[平静]`、`[生气]` 或 `[很生气]` 开头,分别令心情 +1、+3、0、-1、-3;标签不会发到弹幕或 TTS。状态保存在 `data/kirara_pet.json`(若 `queue.data_dir` 被修改,则保存在对应数据目录)。 走路结束后绮良良转为正面静止姿势。每隔 120–150 秒随机触发一次送快递、看书或看手机待机动作,持续 15–20 秒。三种待机和睡觉动作各使用一套由 ImageGen 生成的独立四帧完整角色 PNG 素材(`web/uploads/kirara_idle_*.png`)。心情低于 50 时立即停止行走和普通待机并进入睡眠;进食和洗澡礼物动画优先于睡觉,播放完再回到睡觉姿势,心情恢复后重新安排游走和待机。 体力或清洁降到 60 及以下时,桌宠每 60 秒显示一次跟随角色的像素气泡。体力从饭团、薯条提示中随机选一句,清洁从人气票、粉丝团灯牌提示中随机选一句;两项都低时轮流提示,数值为 0 的需求优先。气泡在数值 60/40/20 时分别显示 5/10/30 秒,中间线性过渡,数值 0 时常驻,恢复到 60 以上即停止该项提示。 礼物恢复规则固定为:每个饭团或薯条增加 5 点体力(桌宠的饱食度);每个人气票或粉丝团灯牌增加 5 点清洁。直播事件中的“灯牌”简写也按粉丝团灯牌处理。其他礼物不改变这两项数值。礼物数量乘以每个礼物的 5 点恢复量;数值仍限制在 0–100。 进食和洗澡动画按礼物的名义恢复量排播,每 1 点播放 5 秒;即使数值已达 100,单个上述礼物仍完整播放 25 秒。进食有饭团和团子两种素材,洗澡有海绵擦洗和花洒冲洗两种素材,播放时各自轮流使用。动画期间桌宠暂停游走,结束后重新安排下一次移动;刷新前台不会重放已有礼物,但打开页面后的首件新礼物会正常播放。四组透明像素素材位于 `web/uploads/kirara_eat_rice.png`、`kirara_eat_dango.png`、`kirara_bath_sponge.png` 和 `kirara_bath_shower.png`。 - **协议抽象**(`app/llm_client.py`):`provider` 支持 - `openai` — OpenAI `/chat/completions` 兼容协议,覆盖 DeepSeek、通义千问(DashScope 兼容模式)、Kimi、智谱 GLM、硅基流动、OpenRouter、vLLM、LM Studio 及 Ollama 的 OpenAI 兼容端点 - `ollama` — Ollama 原生 `/api/chat`(本地部署免鉴权) - `anthropic` — Anthropic `/v1/messages`(Claude 系列) - 新增协议:继承 `BaseLLMProvider` 实现 `chat()` 后在 `PROVIDERS` 注册即可 - **指令自动忽略**:排队/上号/点歌/自定义规则等会触发指令的弹幕在指令分发层被识别,不会发送给 LLM;`ignore_prefixes`(默认 `//`)开头的弹幕同样忽略 - **安全与限流**:`replies_per_minute` 全局每分钟上限、`per_user_cooldown_sec` 单人冷却、`blacklist_uids` 黑名单、`max_reply_chars` 回复截断、并发保护(在途请求未完成时新弹幕直接跳过) 主要字段:`enabled`(开关)、`base_url`/`api_key`/`model`、`system_prompt`(人设)、`context_turns`(上下文轮数)。 ### 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-tts\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/mpv_player.py` 和排队调度负责 | | `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`