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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 18:42:44