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

