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

