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

Disnake Python:Discord机器人重复响应及交互异常修复咨询

Discord机器人按钮重复响应与交互确认错误修复方案

问题根源

  1. 重复响应问题:wait_for('button_click')的校验逻辑仅限制了操作人,未绑定当前发送的消息,旧消息的按钮被点击时仍会触发当前等待逻辑,导致重复执行unwarn_slash。
  2. 交互确认错误:先调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 01:53:15