discord.py开发Discord Bot命令重复执行与脏话过滤逻辑冲突问题
故障原因
你的on_message事件逻辑存在流程错误:
- 你将
await client.process_commands(message)写在了违禁词遍历的else分支里,每遍历1个违禁词,只要当前词没有命中消息内容,就会触发1次命令解析执行 - 你的违禁词库刚好有7个词条,触发命令的正常消息本身不包含违禁词,所以7次遍历都会走到
else分支,等于连续调用了7次命令处理,最终导致命令被重复执行7次 - 而发送违禁词时会命中
if分支,不会走到else调用命令处理,因此不会出现重复触发的问题
修复方案
调整on_message事件的执行逻辑:
- 先过滤机器人自身发送的消息,避免无效检测和自触发
- 遍历违禁词时只要命中任意一个,就执行删除消息、发送提示的操作,之后直接结束事件回调,不再处理后续逻辑
- 所有违禁词都未命中时,仅在遍历结束后调用1次命令处理方法
修复后的代码示例:
@client.event async def on_message(message): # 先过滤机器人自己发的消息,避免循环触发 if message.author.bot: return msg = message.content has_badword = False for x in badwords: if x in msg: has_badword = True break if has_badword: await message.delete() await message.channel.send("Please do not use this word ever") return # 确认无违禁词后,只调用一次命令处理 await client.process_commands(message)
内容的提问来源于stack exchange,提问作者hARASİVa
相关产品推荐
相关产品推荐

