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

