Discord机器人静音切换命令报错:'Member'无has_roles属性求助
解决Discord.py机器人静音命令的AttributeError问题
你遇到的AttributeError: 'Member' object has no attribute 'has_roles'错误很明确——Discord.py的Member类根本没有has_roles()这个方法,你误用了一个不存在的API调用。
错误原因分析
你原本想用member.has_roles(role)判断成员是否拥有静音角色,但Discord.py中判断成员角色的正确方式是检查角色是否存在于member.roles列表中,或者使用member.get_role(role_id)方法(如果知道角色ID的话)。
修正后的完整代码
我还帮你优化了代码的健壮性,比如增加了静音角色不存在的判断,避免无意义报错:
@client.command() @commands.has_permissions(manage_messages=True) async def mute(ctx, member: discord.Member): # 获取服务器中的Muted角色 muted_role = discord.utils.get(member.guild.roles, name='Muted') # 先检查静音角色是否存在,提前处理异常情况 if not muted_role: await ctx.send("服务器未创建名为'Muted'的角色,请先创建该角色后再使用此命令!") return # 判断成员是否已处于静音状态 if muted_role in member.roles: # 取消静音:移除Muted角色 await member.remove_roles(muted_role) # 使用display_name替代nick,兼容无昵称的成员 await ctx.send(f'{member.display_name} 已被取消静音!') else: # 执行静音:添加Muted角色 await member.add_roles(muted_role) await ctx.send(f'{member.display_name} 已被静音!')
关键修改点
- 替换角色判断逻辑:用
muted_role in member.roles替代错误的member.has_roles(role),这是Discord.py官方推荐的角色检查方式。 - 增加角色存在性验证:如果服务器没有创建Muted角色,机器人会直接提示用户,而不是抛出未知错误。
- 优化用户显示名称:用
member.display_name代替member.nick,因为当成员没有设置昵称时,member.nick会返回None,而display_name会自动优先显示昵称,无昵称则显示用户名,避免消息中出现空白或None。
内容的提问来源于stack exchange,提问作者Onur
相关产品推荐
相关产品推荐

