You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 03:24:02