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

Discord.py按钮交互失败问题求助:如何实现仅编辑Embed而不发送任何响应

解决Discord按钮交互仅编辑Embed却触发"交互失败"的问题

我懂你遇到的这个坑——Discord的交互系统有个硬性要求:任何按钮、选择器这类交互必须被明确响应,哪怕你只是想编辑原消息不想发新内容。直接空响应或者不响应,客户端肯定会弹出"this interaction failed"的提示。

怎么正确处理?

当你的需求只是修改触发按钮的那条带Embed的消息时,有两种简单的方式可以响应交互,同时完全不产生额外内容:

  • 用defer()指定更新原消息
    调用await event.defer(update_message=True),这相当于告诉Discord:"我要更新触发这个交互的原消息,不用等新内容了",客户端就不会显示失败提示。

  • 发送deferred_update_message类型的响应
    直接用await event.respond(type=discord.InteractionResponseType.deferred_update_message),效果和上面一致,明确告知Discord我们的操作是更新原消息,而非发送新内容。

修改后的代码示例

把你原来代码里的await event.respond()替换成上面的任意一种方式就行,我还帮你调整了代码里的小问题(比如重复判断和不当的return):

@commands.command()
async def assist(self, ctx):
    embed = discord.Embed(title='Commands', description='sdgsdgsdgds', color=0x0099ff)
    message = await ctx.send(embed=embed, components=self.buttons)
    while True:
        event = await self.client.wait_for('button_click')
        # 不在当前频道的话跳过,别直接退出循环
        if event.channel != ctx.channel:
            continue
        response = event.component.id
        if response is None:
            await event.channel.send('Something went wrong. Please try again.')
            continue
        if response == '1':
            # 更新原消息的Embed内容
            await message.edit(embed=discord.Embed(title='New', description='HDFGSFGS'))
            # 正确响应交互,避免失败提示
            await event.defer(update_message=True)
            # 也可以换成这行:
            # await event.respond(type=discord.InteractionResponseType.deferred_update_message)

为啥原来的做法不行?

你之前用的await event.respond()不带参数时,默认会尝试发送一个空的普通消息,但Discord不允许完全空的普通响应,所以才会触发交互失败。而我们用的defer(update_message=True)或者指定类型的响应,是Discord专门为"更新原消息"这种场景设计的,完美匹配你的需求。

内容的提问来源于stack exchange,提问作者shiveringrat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 23:02:41