编写bot提及响应的on_message事件导致client.commands全部失效如何解决?
问题根因
你自定义on_message事件的操作覆盖了discord.py框架默认的on_message处理逻辑,框架原本内置的前缀匹配、命令触发流程没有被执行,因此所有注册的client.commands都会失效。
排查步骤
- 首先确认是否存在自定义的
on_message事件,且事件内没有调用命令处理相关的内置方法 - 在
on_message开头添加日志打印逻辑print(f"收到消息:{message.content}"),触发命令后查看控制台是否有对应输出,确认命令消息确实被自定义on_message捕获,排除网络异常、权限不足、前缀配置错误等其他问题 - 检查
on_message逻辑中是否存在提前return的语句拦截了命令消息的后续处理
解决方案
有两种常用的修复方案,按需选择即可:
方案1:在自定义on_message末尾添加命令处理调用
在自定义on_message的最后一行添加await client.process_commands(message),手动触发框架内置的命令处理流程,示例代码如下:
@client.event async def on_message(message): # 可以按需添加消息过滤逻辑,比如忽略机器人自己发送的消息 if message.author == client.user: return if client.user.mentioned_in(message): await message.channel.send("Hmmm?") # 调用框架内置命令处理逻辑,必须保留这行 await client.process_commands(message)
注意事项
- 不要在
await client.process_commands(message)执行前添加无差别return语句,否则会导致命令消息被拦截无法处理 - 如果有需要过滤的消息(比如特定频道、特定用户的消息),可以在调用该方法前判断过滤即可
方案2:用监听器注册消息处理逻辑,不覆盖默认on_message
如果不需要修改默认的消息处理流程,只是要新增提到机器人的响应逻辑,可以直接用listen方法注册额外的消息监听器,不需要覆盖默认的on_message事件,不会影响原有命令的触发,示例代码如下:
@client.listen('on_message') async def respond_to_mention(message): if message.author == client.user: return if client.user.mentioned_in(message): await message.channel.send("Hmmm?")
内容的提问来源于stack exchange,提问作者Adaks
相关产品推荐
相关产品推荐

