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

discord.py中延迟(defer)交互后,如何编辑带按钮的原始消息?

解决discord.py斜杠命令中按钮编辑原消息失败的问题

你遇到的核心问题是错误保存了interaction.response.defer()的返回对象——这个对象是Discord发送的临时"思考中"提示消息,而非后续followup.send()生成的带按钮的目标消息。因此按钮点击时编辑该对象,只会修改临时消息或生成新响应,而非你期望的原消息。


步骤1:修正命令代码,保存正确的消息对象

将followup.send()的返回值保存为要编辑的目标消息,而非defer()的返回值:

@group.command(name="completion", description="Text completion and code generation from a prompt")
@app_commands.describe(prompt="The text generation prompt - no default", temperature="Sampling temperature - 0.5")
async def completion(self, interaction, prompt: str, temperature: float = 0.5):
    await interaction.response.defer(thinking=True)
    api_json = await completion(prompt, temperature)
    embed = discord.Embed()
    embed.set_author(name=f"Text Completion  ·  {temperature}/1")
    embed.description = f"**{prompt}** {api_json}"
    # 保存followup发送的消息对象,这才是要编辑的目标
    target_msg = await interaction.followup.send(embed=embed, view=Regen(prompt, temperature, target_msg))

步骤2:修正按钮类的编辑逻辑

按钮中使用保存的target_msg编辑原消息,同时正确处理按钮交互的超时问题:

class Regen(discord.ui.View):
    def __init__(self, prompt, temperature, target_msg):
        super().__init__(timeout=None)
        self.prompt = prompt
        self.temperature = temperature
        self.target_msg = target_msg

    @discord.ui.button(label="Regenerate", style=discord.ButtonStyle.blurple, emoji="<:regen:1060690906547765409>")
    async def regen(self, interaction: discord.Interaction, button: discord.ui.Button):
        try:
            # 先回应按钮交互,避免超时
            await interaction.response.defer(ephemeral=True)
            # 获取新的生成内容
            api_json = await completion(self.prompt, self.temperature)
            # 构建新的Embed
            embed = discord.Embed()
            embed.set_author(name=f"Text Completion  ·  {self.temperature}/1")
            embed.description = f"**{self.prompt}** {api_json}"
            # 编辑原followup消息
            await self.target_msg.edit(embed=embed)
            # 可选:给用户临时提示
            await interaction.followup.send("内容已重新生成", ephemeral=True)
        except Exception as e:
            print(e)
            await interaction.followup.send(f"生成失败:{str(e)}", ephemeral=True)

关键说明

  • interaction.response.defer()仅用于告知Discord"正在处理,请勿超时",其返回对象不是最终的用户可见消息。
  • 只有interaction.followup.send()的返回值才是你需要编辑的、带按钮的目标消息。
  • 按钮交互的defer是独立流程,用于避免按钮点击超时,和编辑原消息的操作互不干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 06:20:45