kita / notes

约 3 分钟

弹幕收到了,它就是不吭声

我用小号在直播间发了条「你好啊」,然后盯着面板的弹幕缓存看。

弹幕进来了,缓存从 0 变成 1。但旁边那几个数字全部是 0:

pending: 0 | used_this_minute: 0 / 6 | last_reply_at: 0.0

弹幕收得到,回应一次都没触发过。我第一反应是 Cookie 不行——SESSDATA 只填了登录态那一串,没带别的字段。但日志里弹幕是一条条进来的,说明读取没问题。

第一层:没有「出口」

日志里有一行一直被我忽略:

[B站直播] 已收到弹幕,但未绑定自动回应会话,也未能自动获取 Bot 自己的 QQ。
请在目标聊天发送 /bili_live_bind_here。

这行才是关键。插件的机制是:拿到弹幕后,把它当成一条普通消息塞进 AstrBot 的处理流水线——由流水线去调模型、合成语音,而不是自己直接调。塞进去得有个"会话出口",也就是 session_id。没有这个出口,它收到弹幕也只能扔掉。

_get_bili_reply_session() 的取值顺序是这样的:

configured = str(self.config.get("bili_live_auto_reply_session_id") or "").strip()
if configured:
    return configured

先看配置项,再读 KV(/bili_live_bind_here 命令写进去的那个),最后才尝试自动推断 Bot 自己的 QQ 私聊。前两条我都是空的,第三条更不可能——我这台机器上根本没接 QQ。

而那个官方命令 /bili_live_bind_here,和 VTS 那个 /vts_auth 一样,只在 aiocqhttp 平台注册,网页聊天发不出去。所以命令这条路是死的。

我直接去数据库里翻现成的会话地址。UMO 的格式长这样:

webchat:FriendMessage:webchat!astrbot!<session_uuid>

preferences 表的 scope='umo' 记录里抄一条,写进 bili_live_auto_reply_session_id(得直接改配置文件再重启,用面板保存会触发热重载,把 VTS 连接弄断——这个我也踩了)。

改完再发弹幕,日志变了:

读空气判定本批弹幕无需自动回应: reason=low_signal events=1

第二层:它在评估我这条弹幕值不值得回

low_signal 这三个字,说的是弹幕的"信息量"。插件有个开关叫读空气降噪:

bili_live_auto_reply_air_guard_enabled: true
bili_live_auto_reply_air_guard_model_enabled: true
bili_live_auto_reply_air_guard_threshold: 2.5

它用模型给每条弹幕打分,低于 2.5 就不回——设计意图是别对满屏的「666」挨个回一句。这想法是对的,问题是我测试时发的都是短句:「你好啊」「hi」「听不见」「快快快快快快快」。这些在打分器眼里全是噪音,一条都过不了。

我把阈值翻出来看,又试了两条有内容的弹幕,比如「介绍一下你自己吧」,这次就过了。但为了把链路先跑通,我把读空气关掉了:

{"bili_live_auto_reply_air_guard_enabled": false,
 "bili_live_auto_reply_air_guard_model_enabled": false}

关掉之后每条弹幕都会走完整流程。这是测试期的做法,真开播还是得开回来——不然一条弹幕回一句,语音合成排队都排不完。

两件事叠在一起

这次排查最费时间的地方在于:两个独立的拦截串在同一条链路上,而且第二层要修好第一层之后才会露出来。我一开始以为"SESSDATA 不完整"是主因,在 Cookie 上折腾了很久。

后来我学乖了——弹幕不回的时候,先看 pending 和 used_this_minute 这两个数。如果它们全是 0,说明弹幕根本没进回应队列,问题在"触发判断"上;如果 pending 有数但 used_this_minute 不动,那就是后面合成或发送卡住了。分界线很干净。

← 回到全部笔记