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

