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

Discord验证机器人报错:'Button'对象无'user'属性求助

Discord验证机器人按钮点击触发AttributeError问题

背景

我开发的Discord验证机器人需要从serverSetups.json读取角色ID来分配权限,JSON文件内容如下:

{
    "1139335633882579027": {
        "mute_role": 1139356364297220167,
        "member_role": 1139338847080165406,
        "invite_link": "https://discord.gg/123"
    },
    "933078112047091753": {
        "mute_role": 937777431975182376,
        "member_role": 937776349001678908,
        "invite_link": "https://discord.gg/123"
    },
    "1028973807240740904": {
        "mute_role": 1139559797268688896,
        "member_role": 1139559797268688896,
        "invite_link": "https://discord.gg/123"
    }
}

机器人逻辑:捕获服务器ID(guild_id)后在JSON中查找对应配置,发送带验证按钮的嵌入消息;用户点击按钮时,根据guild_id从JSON获取member_role的值,为用户分配该角色。

报错情况

点击嵌入消息下的“Verify!”按钮时,触发如下错误:

2023-08-13 22:38:12 ERROR    discord.ui.view Ignoring exception in view <VerifyButton timeout=None children=1> for item <Button style=<ButtonStyle.primary: 1> url=None disabled=False label='Verify!' emoji=None row=None>
Traceback (most recent call last):
  File "C:\Users\Tim\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\discord\ui\view.py", line 427, in _scheduled_task
    await item.callback(interaction)
  File "c:\Users\Tim\OneDrive\Dokumente\Dev\Python_JS\GlobalBot\main.py", line 242, in verify
    user = interaction.user
           ^^^^^^^^^^^^^^^^
AttributeError: 'Button' object has no attribute 'user'

出错代码

当前触发错误的代码:

class VerifyButton(discord.ui.View):
    def __init__(self, role_id):
        super().__init__(timeout=None)
        self.role_id = role_id
 
    @discord.ui.button(label="Verify!", style=discord.ButtonStyle.blurple)
    async def verify(self, interaction: discord.Interaction, button: discord.ui.Button):
        user = interaction.user
        guild = interaction.guild
 
        role = guild.get_role(self.role_id)
        if role:
            await user.add_roles(role, reason="Button Clicked")
            embed = discord.Embed(title="Verifying successful!", description="Vielen Dank, dass du dich verifiziert hast. Du hast nun vollen Zugriff auf den Server!")
        else:
            embed = discord.Embed(title="Verifying Error!", description="Ein Fehler ist aufgetreten beim Hinzufügen der Rolle.")
 
        await interaction.response.send_message(embed=embed, ephemeral=True)
 
@bot.command()
@commands.check(is_allowed)
async def test(ctx):  
    guild_id = None
 
    if ctx.guild:  # Überprüfe, ob ctx.guild existiert
        guild_id = ctx.guild.id
 
    if str(guild_id) in server_setups:
        setup_data = server_setups[str(guild_id)]
        if 'member_role' in setup_data:
            role_id = setup_data['member_role']
            role = ctx.guild.get_role(role_id)
            if role:
                view = VerifyButton(role_id)
                await ctx.send(embed=discord.Embed(title="Wie du dich verifizieren kannst", description="Um Zugriff auf den Server haben zu können, musst du dich verifizieren. Dies ist ganz leicht. Klicke einfach auf den Button unter dieser Nachricht, und schon bist du verifiziert."), view=view)
            else:
                await ctx.send("Rolle nicht gefunden.")
        else:
            await ctx.send("Member-Rolle nicht in den Server-Setups gefunden.")
    else:
        await ctx.send("Server-Setup wurde nicht gefunden.")

对比正常代码

我有一段逻辑相同但直接指定角色ID的代码,不会触发该错误:

class TestMenuButton(discord.ui.View):
    def __init__(self):
        super().__init__(timeout=None)
 
    @discord.ui.button(label="Verify!", style=discord.ButtonStyle.blurple)
    async def test(self, interaction: discord.Interaction, button: discord.ui.Button):
        user = interaction.user
        role_id = 1139338847080165406  # ID der Rolle, die zugewiesen werden soll
 
        role = interaction.guild.get_role(role_id)
        if role:
            await user.add_roles(role, reason="Button Clicked")
            embed = discord.Embed(title="Verifying successfull!", description="Vielen Dank das du dich verifiziert hast. Du hast nun vollen Zugriff auf den Server!")
        else:
            embed = discord.Embed(title="Verifying Error!", description="An error occurred while granting the role.")
 
        await interaction.response.send_message(embed=embed, ephemeral=True)
 

@bot.tree.command(name="verify")
@commands.check(is_allowed)
async def buttonmenu(interaction: discord.Interaction):
    view = TestMenuButton()
    await interaction.response.send_message(embed=discord.Embed(title="Wie du dich verifizieren kannst", description="Um Zugriff auf den Server haben zu können musst du dich Verifizieren. Dies ist ganz leicht. Klicke einfach auf den Button unter dieseer Nachricht, und schon bist du Verifiziert."), view=view)

请问这个错误的原因是什么?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 12:16:13