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

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} 已被静音!')

关键修改点

  1. 替换角色判断逻辑:用muted_role in member.roles替代错误的member.has_roles(role),这是Discord.py官方推荐的角色检查方式。
  2. 增加角色存在性验证:如果服务器没有创建Muted角色,机器人会直接提示用户,而不是抛出未知错误。
  3. 优化用户显示名称:用member.display_name代替member.nick,因为当成员没有设置昵称时,member.nick会返回None,而display_name会自动优先显示昵称,无昵称则显示用户名,避免消息中出现空白或None。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:55:43