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
相关产品推荐
相关产品推荐

