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

Discord机器人报错AttributeError:'User'对象无'roles'属性求解决

解决Discord机器人AttributeError: 'User' object has no attribute 'roles'报错

问题根源

报错指向message.author.roles,核心原因:

  • message.author返回的是User对象,代表Discord全局用户身份,不包含特定服务器的角色信息
  • 只有Member对象(用户在当前服务器的实例)才拥有roles属性,你代码里已经通过member = message.guild.get_member(message.author.id)获取了正确的Member对象,但未正确使用。

修正方案

1. 修复角色检查的核心错误

将错误的角色获取代码:

role = discord.utils.get(message.author.roles, id=[REDACTED])

替换为直接从服务器角色列表获取目标权限角色:

target_perm_role = discord.utils.get(message.guild.roles, id=[REDACTED])

同时将后续判断条件if role in member.roles:改为if target_perm_role in member.roles:

2. 优化代码逻辑(可选)

  • 增加机器人自消息过滤,避免循环响应
  • 简化Member对象获取,直接用message.author转换(消息来自服务器时,message.author可直接转为Member)

修正后的完整代码

import discord

client = discord.Client(intents=discord.Intents.all())

@client.event
async def on_message(message):
    # 过滤机器人自身消息,避免循环
    if message.author.bot:
        return
    
    # 获取当前服务器的Member对象(直接转换更简洁)
    member = message.author
    
    # 获取需要的角色:权限角色和静音角色
    target_perm_role = discord.utils.get(message.guild.roles, id=[REDACTED])  # 替换为你的权限角色ID
    muted_role = discord.utils.get(message.guild.roles, id=[REDACTED])        # 替换为你的静音角色ID
    
    # 检查用户是否拥有权限角色
    if target_perm_role in member.roles:
        if message.content == '/hello':
            await message.channel.send('Hello!')
        elif message.content.startswith('/mute'):
            try:
                # 获取被提及的用户并转为Member对象
                user_to_mute = message.mentions[0]
                mute_member = message.guild.get_member(user_to_mute.id)
                
                # 检查是否已静音
                if muted_role not in mute_member.roles:
                    await mute_member.add_roles(muted_role)
                    await message.channel.send(f'{user_to_mute.mention} 已被静音')
                else:
                    await message.channel.send(f'{user_to_mute.mention} 已经处于静音状态')
            except IndexError:
                await message.channel.send('请提及要静音的用户')
            except Exception as e:
                await message.channel.send(f'静音操作失败: {str(e)}')

client.run('[REDACTED]')  # 替换为你的机器人Token

额外说明

  • 确保机器人拥有管理角色的权限,否则无法执行添加角色操作
  • 确认Intents配置正确,已启用members和messages权限(代码中Intents.all()已包含)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:10:16