kita / notes

约 2 分钟

艾特机器人发张图,守望先锋插件跳出来发帮助

群里的操作是:@机器人,发一张图,想让它看看图里是什么。

机器人的回应:守望先锋查分插件弹出来,发了一长串指令帮助。

那个插件的"自动发送帮助"我根本没开。

这类问题通常出在匹配条件上

插件在群里"看到"消息的方式有两种:订阅特定事件,或者匹配消息内容。

我遇到的是后者。插件里写着一段判断逻辑,本意大概是"用户发了它看不懂的东西时,给个帮助提示"。但判断条件写宽了,于是只要消息里出现某种模式,它就认领。

宽到什么程度?常见的有几种:

  • 判断"消息里有图片" → 那么所有带图的消息都会命中
  • 判断"消息里没有它认识的指令" → 那么任意一句话都会命中
  • 用正则匹配关键词,但正则写得太松(比如没有加边界)

这类 bug 的隐蔽性在于:它在开发者自己的测试场景里不会暴露。 自己测的时候发的都是正经指令,触发的是预期分支;只有别人拿完全无关的消息进来,才会撞到这个宽条件。

顺带说下"我没开这个功能"

用户的直觉是"我没开这个开关,它凭什么发"。

但这里的开关和触发是两层东西。配置里的开关控制的是"要不要自动发帮助",代码里的匹配逻辑控制的是"什么情况下算作需要帮助"。开关关了,走的可能是另一条分支——而那条分支也在发帮助。

这就是为什么"我明明没开"和"它确实发了"能同时成立。排查的时候不能只看配置,得去代码里找所有会发这条消息的地方。

修复方向

具体怎么改的我不太记得了,但方向是清楚的:把触发条件收紧。

  • 要么加上更严格的上下文判断(比如必须同时满足"消息里有图"且"图里没识别出内容")
  • 要么干脆改成"只在用户明确发指令时才响应",不要自动认领

插件在群里接收消息,正确的做法是"不打扰"优先。 一个插件因为判断条件太宽而时不时冒出来说话,比它少响应几次要糟糕得多——前者会让群里的人觉得机器人疯了。

← 回到全部笔记