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

