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

discord.py v2按钮添加用户反应问题求助

解决方案

针对你遇到的三个问题,以下是具体的修改方案和代码:

问题分析与解决

1. 机器人添加反应而非用户

Discord API不允许机器人以用户身份添加反应,因此无法直接让机器人替用户完成这个操作。你可以选择两种方案:

  • 引导用户手动给消息添加反应
  • 由机器人添加反应(明确这是机器人的操作,而非用户)

2. 按钮显示"This interaction failed"

这是因为组件交互必须在3秒内得到响应,你的代码缺少交互响应步骤,只需添加响应逻辑即可解决。

3. 已点击用户禁用按钮(对其他用户仍可用)

通过维护已点击用户的集合,在交互检查阶段拦截已点击用户的操作,同时不修改全局按钮状态,保证其他用户正常使用。

修改后的代码

class BananaButton(discord.ui.View):
    def __init__(self):
        super().__init__(timeout=None)  # 设置为持久化视图,可选
        self.clicked_users = set()  # 存储已点击按钮的用户ID

    async def interaction_check(self, interaction: discord.Interaction) -> bool:
        # 检查用户是否已经点击过按钮
        if interaction.user.id in self.clicked_users:
            await interaction.response.send_message("你已经点击过这个按钮了!", ephemeral=True)
            return False
        return True

    @discord.ui.button(label="Give Banana", emoji='🍌', style=discord.ButtonStyle.blurple)
    async def banana(self, interaction: discord.Interaction, button: discord.ui.Button):
        # 响应交互,解决失败提示问题
        await interaction.response.defer(ephemeral=True)
        
        # 方案1:引导用户手动添加反应
        await interaction.followup.send("请手动给这条消息添加🍌反应!", ephemeral=True)
        
        # 方案2:机器人添加反应(如果需要)
        # await interaction.message.add_reaction('🍌')
        
        # 将当前用户标记为已点击
        self.clicked_users.add(interaction.user.id)

使用示例

发送带按钮的嵌入消息:

@bot.command()
async def send_banana(ctx):
    embed = discord.Embed(title="Banana Request", description="点击按钮参与!")
    view = BananaButton()
    await ctx.send(embed=embed, view=view)

补充说明

  • 如果需要持久化已点击用户数据(机器人重启后不丢失),可以将clicked_users集合存储到数据库或本地文件中
  • ephemeral=True表示发送的消息仅当前用户可见,不会打扰其他成员

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 23:34:52