Discord Bot自身反应触发wait_for异常问题求助
问题分析与解决方案
这个问题的根源很明确:你的wait_for('reaction_add')没有设置任何过滤条件,会捕获所有频道内的表情添加事件——包括机器人自己给消息添加的👍和👎!
机器人执行代码时会先发送embed,然后依次添加两个表情:先加👍,再加👎。这两个操作都会触发reaction_add事件,而wait_for会优先捕获到这两个事件中的一个(大部分时候是后添加的👎),所以直接进入了BAD分支。只有极端情况下用户的反应比机器人的表情添加速度快,才会触发正确的分支,这就是为什么只有1/10概率正常运行。
修正后的代码
给wait_for添加一个check参数,过滤掉机器人自身的反应,同时确保反应是针对目标消息的:
embed_msg = await ctx.channel.send(embed=embed) await embed_msg.add_reaction('👍') await embed_msg.add_reaction('👎') # 定义过滤条件:只捕获目标消息上、非机器人的反应 def check(reaction, user): return reaction.message.id == embed_msg.id and user != self.bot.user reaction, user = await self.bot.wait_for('reaction_add', check=check) if str(reaction.emoji) == '👍': print('GOOD ! ') elif str(reaction.emoji) == '👎': print('BAD !') return
额外优化(可选)
如果你只想让发起命令的用户触发这个反应逻辑,可以在check里加上对ctx.author的判断,避免其他用户误操作:
def check(reaction, user): return ( reaction.message.id == embed_msg.id and user == ctx.author and user != self.bot.user )
这样修改后,机器人只会捕获目标消息上、由命令发起者添加的表情,彻底解决了机器人自身反应干扰的问题。
内容的提问来源于stack exchange,提问作者Lucas Grandjean
相关产品推荐
相关产品推荐

