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

Discord机器人添加on_message事件后原有所有命令失效原因求助

故障根因
  • 你怀疑的ctx与message对象冲突不成立:commands.Context是框架对Message对象的上层封装,二者本身设计为协同工作,不存在兼容性问题。
  • 问题本质是discord.py的事件覆盖逻辑:框架默认实现的on_message事件内置了命令分发流程,会自动执行await bot.process_commands(message),把匹配到前缀的消息交给对应命令处理函数。
  • 当你通过@bot.event装饰器重写自定义on_message时,会完全覆盖框架原本的事件实现,原有的命令分发逻辑不会被触发,因此所有已配置的命令都会失效。
修复方案

只需要在自定义on_message的业务逻辑末尾,手动补上命令分发的调用即可,不需要修改原有命令的实现,也不需要调整ctx相关的代码。
修改后的可运行代码参考:

@bot.event
async def on_message(message):
    # 跳过机器人自身发送的消息,避免逻辑循环
    if message.author.id == bot.user.id:
        return
    msg_content = message.content.lower()

    curseWord = ['badword', 'badword2']
    
    if any(word in msg_content for word in curseWord):
        await message.delete()
        embed=discord.Embed(title="No No Word", description="Hey! Those words arent allowed here!", color=0x00FFFF)
        await message.channel.send(embed=embed)
    # 核心补充:将消息传递给命令处理器,恢复原有命令的触发能力
    await bot.process_commands(message)

keep_alive()
bot.run(os.getenv('TOKEN'))
注意事项
  • await bot.process_commands(message) 必须放在跳过机器人自身消息的判断之后,否则会重复处理机器人发送的消息,造成无意义的循环逻辑。
  • 不要将该调用放到脏话检测的条件判断分支内部,否则当消息触发脏话删除逻辑时,后续的命令匹配流程会被阻断。
  • 如果后续需要增加消息忽略规则(比如屏蔽特定频道、用户的消息),需要保证规则判断完成后,再执行process_commands调用,避免有效命令被误拦截。

内容的提问来源于stack exchange,提问作者ColeTMK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 06:45:03