You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Discord.py机器人执行消息添加反应无响应且无控制台报错问题求助

Discord.py机器人执行消息添加反应无响应且无控制台报错问题求助

嗨,我帮你排查下这个问题,看你的代码里有几个关键的地方出错了,导致机器人既不添加反应也没报错:

1. 错误获取发送后的消息对象

在Slash命令里,await interaction.response.send_message()不会返回可直接操作的discord.Message对象,你赋值给message的其实是一个交互响应的占位对象,调用它的add_reaction自然不会生效。正确的做法是发送响应后,用await interaction.original_response()来获取实际发送到频道的消息实例:

await interaction.response.send_message(embed=embed)
# 先发送响应,再获取真实的消息对象
message = await interaction.original_response()
await message.add_reaction(emoji=vote)

2. Emoji格式错误

你用的vote = 'U+2705'不是有效的emoji格式,机器人无法识别这个字符串作为表情符号。你需要换成Unicode转义字符或者直接用emoji本身:

# 两种正确写法选一种即可
vote = '\u2705'
# 或者直接写表情符号
vote = '✅'

3. 错误处理函数的参数错误

你的错误处理函数用了ctx作为第一个参数,但Slash命令的错误处理上下文是discord.Interaction,不是传统前缀命令的ctx。而且要指定错误类型为app_commands.AppCommandError,不然可能捕获不到错误:

@timeout_vote.error
async def timeout_vote_error(interaction: discord.Interaction, error: app_commands.AppCommandError):
    if isinstance(error, app_commands.MissingAnyRole):
        # 用ephemeral=True让错误提示只给触发命令的用户看,避免频道刷屏
        await interaction.response.send_message(content='You must be verified to complete this command', ephemeral=True)
    # 额外添加else分支打印其他错误到控制台,方便后续排查
    else:
        print(f"Unexpected error: {error}")

另外还有个小细节:timeout.display_avatar永远不会是None——每个用户都有默认头像,所以你代码里的那个判断可以直接去掉,直接写embed.set_thumbnail(url=timeout.display_avatar.url)就行。

把这些修改之后,你的投票命令应该就能正常添加反应,也能正确捕获并反馈错误啦!

备注:内容来源于stack exchange,提问作者kinsv

火山引擎 最新活动