discord.py机器人单条消息多次触发重复回复问题如何修复
问题根因
现有代码存在两处逻辑缺陷导致重复回复:
- @机器人的分支执行完回复操作后,没有中断后续代码执行,程序会继续进入违禁词校验逻辑,因此消息同时@机器人且包含违禁词时会触发两次回复
- 违禁词遍历逻辑中,每匹配到一个违禁词就会发送一次回复,匹配后没有终止循环,因此单条消息包含N个违禁词时就会发送N次回复
修复方法
核心处理原则:任意一个触发条件命中、发送完对应回复后,立刻终止后续所有判断逻辑,不再执行剩余校验。
修复后完整代码如下:
import random import discord banned = ['x', 'y', 'z'] insults = ['x', 'y', 'z'] mentions = ["x", "y", "z"] @client.event async def on_ready(): await client.change_presence(status=discord.Status.online, activity=discord.Game('x')) print('Bot is ready') print('We have logged in as {0.user}'.format(client)) @client.event async def on_message(message): if message.author == client.user: return # 优先处理@机器人场景 if client.user.mentioned_in(message): # @everyone/@here不触发回复 if not message.mention_everyone: await message.channel.send(random.choice(mentions)) # 回复完成直接终止函数,不再执行后续违禁词校验 return # 提前将消息内容转小写,避免循环内重复转换 msg_content = message.content.lower() # 遍历违禁词,匹配到第一个就触发回复并终止循环 for word in banned: if word in msg_content: await message.channel.send(random.choice(insults)) # 跳出循环,不再检查剩余违禁词 break
调整说明
- 调整了@场景的判断逻辑,命中有效@(非@全体)并发送回复后直接
return,从执行路径上切断后续违禁词校验,彻底避免双触发问题 - 违禁词校验时,匹配到第一个命中的词发送回复后立刻
break终止循环,不会继续遍历剩余违禁词,解决多违禁词重复回复问题 - 如果需要调整触发优先级(比如优先校验违禁词、再校验@),只需要调换两个判断块的先后顺序即可,保持「触发即终止」的逻辑就不会出现重复回复。
内容的提问来源于stack exchange,提问作者Liquid
相关产品推荐
相关产品推荐

