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

Discord.py实现仅命令作者可点击按钮及代码问题排查

Discord机器人仅命令作者可点击按钮实现方案

原有问题

实现目标:交互按钮仅允许触发对应命令的发起用户点击,非发起用户点击时机器人返回错误提示。原有代码无法正常运行,代码如下:

@bot.command()
async def button(ctx):
    await ctx.send(content="test", components=[Button(style=ButtonStyle.blue, label="Default Button", custom_id="button")])
    interaction = await bot.wait_for("button_click", check = lambda i: i.custom_id == "button")
    if interaction.user == ctx.author:
     await ctx.send("successful test")

原有代码问题点

  • check逻辑仅校验了按钮自定义ID,未过滤其他消息的同名按钮点击事件,容易出现逻辑串扰
  • 未对非作者的点击操作做任何响应,触发Discord交互3秒超时规则,客户端会弹出交互失败提示
  • 缺少非作者点击的错误提示分支,且第一次点击触发wait_for后就会结束监听,非作者误点后作者无法再正常触发按钮
  • 交互触发后未直接响应交互事件,而是通过上下文发送普通消息,点击用户无法收到即时反馈

修复后可运行代码

@bot.command()
async def button(ctx):
    # 发送携带按钮的消息,保存消息对象用于后续校验
    btn_msg = await ctx.send(
        content="test",
        components=[Button(style=ButtonStyle.blue, label="Default Button", custom_id="auth_button")]
    )

    while True:
        # 监听当前消息上的目标按钮点击事件
        interaction = await bot.wait_for(
            "button_click",
            check=lambda i: i.custom_id == "auth_button" and i.message.id == btn_msg.id
        )

        if interaction.user.id != ctx.author.id:
            # 非作者点击,返回仅点击者可见的错误提示
            await interaction.respond(content="你不是该命令的发起者,无权操作此按钮", ephemeral=True)
        else:
            # 作者点击,返回成功响应后退出监听
            await interaction.respond(content="successful test")
            break

实现说明

  • 所有Discord交互必须在触发后3秒内调用respond()方法返回响应,否则会被判定为交互失败
  • 非作者点击时返回的消息设置ephemeral=True,属于仅点击用户可见的临时消息,不会在公屏刷屏
  • 增加消息ID校验,避免监听到其他消息上同ID的按钮事件
  • 采用循环监听逻辑,非作者点击不会终止监听流程,作者后续点击依然可以正常触发功能
  • 按钮自定义ID建议设置专属标识,不要用过于通用的名称(比如原来的button),降低事件串扰概率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:15:41