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
相关产品推荐
相关产品推荐

