kita / notes

约 2 分钟

弹幕三分钟才到,我在风控上绕了一圈

「我发了条弹幕,模型一分多钟没理我。」

这是我的原话。当时的第一判断是模型慢——毕竟前面刚花了不少时间在压语音合成的耗时上。但去翻日志,发现弹幕压根还没被捕获到:

18:18:35  捕获事件 type=danmaku
18:21:03  捕获事件 type=danmaku
18:24:20  捕获事件 type=danmaku

三条记录之间隔着将近三分钟。也就是说,我发完弹幕之后,插件要等到下一个轮询周期才会看见它。不是不回,是还不知道有这条弹幕。

报错一直在刷

日志里有一行反复出现:

[B站直播] 弹幕接口疑似被 B站风控,5s 后重试:
弹幕服务器信息获取失败: code=-352 message=-352

而且退避时间是递增的:5s → 30s → 60s → 120s → 240s。插件是在正常降级——主通道失败就退避重试,退避的间隙靠"历史弹幕轮询"兜底。问题是退避涨到 240 秒之后,兜底轮询也被拖到了一分多钟一次。

-352 是 B 站的风控码,最常见的解释是登录态有问题。我用配置里的 SESSDATA 打了两个接口验证,第一个是用户信息:

Cookie 有效性: isLogin = True | 用户名: <我的用户名>

登录态完全正常。 第二个是报错里那个接口,也就是 getDanmuInfo:

弹幕接口: -352 -352

同一个 Cookie,nav 能过、getDanmuInfo 被拒。所以不是登录态失效,是这个特定接口对当前环境有额外校验——大概率是 Cookie 里缺了 buvid3 之类的设备标识字段,我只填了 SESSDATA。

插件的说明里写着答案

我准备去改插件源码的时候,顺手把配置项的说明读完了:

bilibili_web_backend   可选:history / laplace / blivedm / builtin
hint: 推荐 builtin。builtin 为 B站直连;
      history 只使用历史弹幕轮询,不请求 websocket 弹幕服务器信息,
      适合 getDanmuInfo -352 风控时使用

作者早就把这种情况写进去了。 builtin 会去请求那个被风控的接口,失败后按递增退避重试——把时间全浪费在撞墙上。history 模式干脆不请求它,直接用历史弹幕轮询。

改成 history,重启,日志变成:

[B站直播] 已启动 history-only 弹幕监听: interval=3.0s

三分钟变成三秒。

剩下的

轮询毕竟不是推送,延迟从"三分钟"降到"三秒"已经够用,但理论上还是有一个轮询周期的滞后。想彻底回到实时推送,得把 Cookie 补全——从浏览器 F12 里复制整条 Cookie 字符串(不只是 SESSDATA 那一项),把 buvid3、bili_jct 这些一起带上,让 getDanmuInfo 能过。这个我还没试。

这次真正浪费时间的不是排查,是没把配置说明读完。那份 hint 写得很直白,连"适合 getDanmuInfo -352 风控时使用"这种话都给了,我在前面查 Cookie、查接口、翻源码,绕了一大圈。

插件作者踩过的坑,通常已经写在配置说明里了。以后遇到奇怪的默认行为,先把说明念一遍。

← 回到全部笔记