Discord.py按钮交互失败问题求助:如何实现仅编辑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

