You need to enable JavaScript to run this app. 非rewrite版discord.py授予用户Muted角色时触发'str'对象无id属性报错
优惠活动
大模型
产品
解决方案
定价
更多

非rewrite版discord.py授予用户Muted角色时触发'str'对象无id属性报错

报错触发原因
  • 旧版discord.py(非rewrite分支)的Member.add_roles()方法不支持直接传入角色名称的字符串参数,它要求传入的是discord.Role类型的对象。
  • 从报错堆栈可以看到,方法内部会遍历传入的角色参数,读取每个角色的.id属性来生成提交给Discord API的请求数据。你直接传入字符串"Muted",字符串没有id属性,因此触发AttributeError: 'str' object has no attribute 'id'错误。
适配旧版discord.py的解决方案
  • 先从当前服务器的角色列表中,检索出名称为"Muted"的discord.Role对象,再传给add_roles()方法即可。
  • 可以使用discord内置的get工具快速查找角色,修改后的完整代码如下:
from discord.utils import get

@client.command(pass_context=True)
@commands.has_any_role("Admin")
async def mute(ctx, user: discord.Member):
    # 检索当前服务器的Muted角色对象
    muted_role = get(ctx.message.server.roles, name="Muted")
    # 处理角色不存在的异常场景
    if not muted_role:
        await client.send_message(ctx.message.channel, "当前服务器未配置名为「Muted」的角色")
        return
    await user.add_roles(muted_role, atomic=False)
  • 如果不想额外导入工具类,也可以手动遍历服务器角色列表查找目标角色,逻辑完全等价:
muted_role = None
for role in ctx.message.server.roles:
    if role.name == "Muted":
        muted_role = role
        break
  • 额外注意:需要确保机器人拥有管理角色权限,且机器人自身的最高角色等级高于Muted角色,否则会触发权限类报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 03:06:02