Discord.py开发tempmute临时禁言命令报Unknown Role错误如何解决
报错原因排查
核心报错「Unknown Role」的根本原因
- 创建角色后未接收返回的角色对象
你调用ctx.guild.create_role会返回新创建的角色实例,但代码中没有将返回值赋值给LMUTED变量,创建完成后LMUTED仍然是None,后续操作传入空值就会触发未知角色错误。
- 创建角色后未接收返回的角色对象
- 角色操作方法参数错误
member.add_roles方法本身是给当前成员对象添加角色,不需要额外传入member作为第一个参数,多余参数会导致API解析异常,请求无效角色ID。
- 角色操作方法参数错误
- 移除角色方法调用错误
ctx对象没有remove_roles方法,移除成员角色需要调用member.remove_roles。
- 移除角色方法调用错误
- 时间参数处理错误
你用*time接收时间参数,得到的是元组类型,无法直接做数值计算,需要修正参数定义为数值类型。
- 时间参数处理错误
修复方案
首先你需要先导入asyncio用于异步计时,修正后的完整代码如下:
import asyncio import random import discord from discord.ext import commands # 类内的命令代码 @commands.command() @commands.has_permissions(ban_members=True) async def tempmute(self, ctx, member: discord.Member = None, time: int = None): if not member: await ctx.send(embed=discord.Embed(title='Вы должны указать участника!', color=random.choice(colors))) return if not time: await ctx.send("请指定禁言时长(单位:分钟)") return # 查找禁言角色 LMUTED = discord.utils.get(ctx.guild.roles, name='LMUTED') if not LMUTED: perms = discord.Permissions(send_messages=False) # 接收创建的角色对象 LMUTED = await ctx.guild.create_role( name='LMUTED', colour=discord.Colour(0x0000FF), permissions = perms ) # 给所有文本频道设置禁言角色的权限,否则禁言不生效 for channel in ctx.guild.text_channels: await channel.set_permissions(LMUTED, send_messages=False) await ctx.send(f'Я создал роль `{LMUTED.name}`!') # 修正add_roles参数 await member.add_roles(LMUTED) await ctx.send(f'Я замьютил {member.mention} на {time}分钟!') # 异步等待对应时长 await asyncio.sleep(time * 60) # 修正移除角色的调用方法 await member.remove_roles(LMUTED)
额外注意事项
- 确保机器人的角色位置高于
LMUTED角色,否则无法给成员分配/移除该角色 - 机器人需要拥有
管理角色和管理频道权限,才能正常创建角色、修改频道权限 - 长时计时建议用持久化存储(如数据库)记录禁言到期时间,避免机器人重启后到期自动解言失效
内容的提问来源于stack exchange,提问作者Forevor Base
相关产品推荐
相关产品推荐

