Disnake Python:Discord机器人重复响应及交互异常修复咨询
Discord机器人按钮重复响应与交互确认错误修复方案
问题根源
- 重复响应问题:
wait_for('button_click')的校验逻辑仅限制了操作人,未绑定当前发送的消息,旧消息的按钮被点击时仍会触发当前等待逻辑,导致重复执行unwarn_slash。 - 交互确认错误:先调用
ctx.edit_original_message已完成交互确认,后续再执行responce.response.defer()会触发“交互已被确认”的HTTP错误。
修复后的代码
if i[0] == 0 or row[0] < i[0]: message = await ctx.send(embed=emb, components=[disnake.ui.Button(label='Remove the warning', style=ButtonStyle.secondary)]) try: # 校验逻辑增加消息匹配,确保只响应本次发送的按钮 response = await client.wait_for( 'button_click', check=lambda interaction: interaction.author == ctx.author and interaction.message.id == message.id, timeout=60 ) except asyncio.TimeoutError: await message.edit(components=[]) return if response.component.label == 'Remove the warning': await unwarnslash.unwarn_slash(ctx, member) # 通过交互对象修改消息,避免重复确认 await response.response.edit_message(components=[]) elif row[0] >= i[0]: await ctx.send(embed=emb) await kickslash.kick_slash(ctx, member, 'Exceeded the number of warnings')
关键修改说明
- 绑定消息的校验逻辑:在
wait_for的check中增加interaction.message.id == message.id,确保只有当前消息的按钮点击才会触发后续逻辑,避免旧消息干扰。 - 正确处理交互响应:使用
response.response.edit_message直接修改消息组件,替代ctx.edit_original_message+defer的组合,避免重复确认交互导致的错误。 - 修正变量名拼写:将
responce改为标准拼写response,避免潜在的代码混淆。
内容的提问来源于stack exchange,提问作者reToster0
相关产品推荐
相关产品推荐

