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

Discord.py:解决斜杠命令按钮关联用户的全局变量冲突问题

解决Discord斜杠命令按钮用户ID覆盖与custom_id获取问题

核心问题复盘

你用全局变量存储用户ID导致新用户提交申请时覆盖旧ID,后续按钮操作全部指向新用户;同时错误地试图通过视图类的self.custom_id获取按钮ID,引发属性错误。

分步解决方案

1. 给每个按钮绑定唯一的用户ID标识

创建按钮时,将提交申请的用户ID拼接成唯一的custom_id,用前缀区分同意/拒绝操作,避免冲突:

# 假设user_id是提交申请的用户ID(比如interaction.user.id)
@discord.ui.button(label="Accept", style=discord.ButtonStyle.green, custom_id=f"accept_{user_id}")
@discord.ui.button(label="Reject", style=discord.ButtonStyle.red, custom_id=f"reject_{user_id}")

2. 在按钮回调中正确提取用户ID

不要用self.custom_id,从交互对象的组件属性中获取custom_id,再拆分出用户ID:

async def callback(self, interaction: discord.Interaction):
    # 从交互组件中获取按钮的custom_id
    button_custom_id = interaction.component.custom_id
    # 拆分出用户ID(比如从"accept_123456789"中提取123456789)
    target_user_id = int(button_custom_id.split("_")[1])
    target_user = interaction.guild.get_member(target_user_id)
    
    # 处理同意/拒绝逻辑
    if button_custom_id.startswith("accept_"):
        # 给用户分配角色
        role = interaction.guild.get_role(你的角色ID)
        await target_user.add_roles(role)
        await interaction.response.send_message(f"已同意 <@{target_user_id}> 的申请", ephemeral=True)
    elif button_custom_id.startswith("reject_"):
        await interaction.response.send_message(f"已拒绝 <@{target_user_id}> 的申请", ephemeral=True)

3. 彻底抛弃全局变量

所有与申请相关的用户标识都通过custom_id绑定到按钮上,每个申请生成的按钮组都对应唯一的用户,从根源上避免ID覆盖问题。

4. 属性错误的原因说明

之前的AttributeError是因为ApplyButtons视图类本身没有custom_id属性,按钮的custom_id属于交互触发的组件对象,必须通过interaction.component.custom_id获取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 21:22:18