命令发出去没反应,是被 AI 拦了
给课程表插件加了个新命令 /绑定课表,测试的时候直接在群里发:
/绑定课表
没反应。不是报错,是什么都没有——既不进网页,也不回话。
日志里没有这条命令
按惯例去翻容器日志,grep 命令名,一条记录都没有。
这就有点意思了:如果命令进了处理器但执行失败,至少会留个 traceback 或者异常。完全不出现,说明它没走到那儿。
我怀疑是命令根本没被识别。去看插件那边的注册方式:
@filter.command("绑定课表")
async def bind_course(self, event: AstrMessageEvent):
...
filter.command —— 然后我想起来 AstrBot 的命令机制里有个前提:命令需要经过唤醒词或 @ 机器人才会进入命令过滤器。
在群里发 /绑定课表,没有 @机器人,也没有唤醒前缀,这条消息就被当成普通聊天内容,直接丢给模型了。模型收到一句"绑定课表",回你一段客套话,或者干脆不理——反正命令处理器那边是干净的,什么都没收到。
换成 regex 就通了
修法很直接:不用 filter.command,改用 filter.regex。
@filter.regex(r"^/?绑定课表")
async def bind_course(self, event: AstrMessageEvent):
...
filter.regex 是直接匹配消息文本的,不依赖唤醒机制。正则里我留了个 /? 可选斜杠——用户有时候带斜杠发,有时候不带,两种都认。
改完重启,再发 /绑定课表,网页链接出来了。
这个坑为什么值得记
它和普通"改代码"不太一样:没有任何报错信息。日志干净、容器正常、插件加载正常,就是命令没反应。
如果不知道 filter.command 有唤醒前提,很容易往"插件没加载""配置没生效""端口不通"这些方向查——我一开始也确实先确认了插件有没有正常加载。
判断的切入点其实很朴素:命令没进处理器这件事,日志会告诉你。查不到任何执行痕迹,就不要在"执行出错"上找原因了,先确认它有没有被执行。
后来我把这条也写进了交接文档,因为同一批插件里还不止一个用的是 filter.command。