Discord机器人跨服务器全局禁言遇Unknown Role报错求解
问题分析
报错NotFound: 404 Not Found (error code: 10011): Unknown Role的核心原因是:
- 命令中接收的
member参数是执行命令所在服务器的discord.Member实例 - 循环到其他服务器时,尝试给这个跨服务器的
member实例添加当前循环服务器的禁言角色,Discord API会错误地在member所属的原服务器(命令执行服务器)中查找该角色——而该角色只存在于当前循环的服务器中,因此返回404。
修复后的代码
import json import discord from discord.ext import commands # 加载服务器配置(确保你已正确处理文件读取) with open('serverSetups.json', 'r') as f: server_setups = json.load(f) @bot.command() async def globalMute(ctx, member_id: int): mute_role_given = 0 failed_guilds = [] for guild in bot.guilds: guild_id_str = str(guild.id) if guild_id_str not in server_setups: continue setup_data = server_setups[guild_id_str] mute_role_id = setup_data.get('mute_role') if not mute_role_id: continue # 获取当前服务器的禁言角色 mute_role = guild.get_role(mute_role_id) if not mute_role: failed_guilds.append(f"{guild.name}(禁言角色不存在)") continue # 获取当前服务器内的目标成员实例(必须用当前服务器的Member对象操作) try: guild_member = await guild.fetch_member(member_id) except discord.NotFound: failed_guilds.append(f"{guild.name}(用户不在此服务器)") continue except discord.Forbidden: failed_guilds.append(f"{guild.name}(机器人无权限获取成员信息)") continue # 尝试添加禁言角色 try: await guild_member.add_roles(mute_role, reason="Global Mute") mute_role_given += 1 except discord.Forbidden: failed_guilds.append(f"{guild.name}(机器人无权限添加角色)") continue except Exception as e: failed_guilds.append(f"{guild.name}(未知错误:{str(e)})") continue # 发送结果反馈 result_msg = f"用户 <@{member_id}> 已在 {mute_role_given} 个服务器被添加禁言角色\n" if failed_guilds: result_msg += "\n未成功的服务器:\n" + "\n".join(f"- {item}" for item in failed_guilds) await ctx.send(result_msg)
关键修改说明
- 参数改为用户ID:不再直接接收
discord.Member,改用member_id: int作为参数,避免绑定到单一服务器的Member实例,支持跨服务器操作。 - 获取当前服务器的Member实例:对每个循环的服务器,使用
await guild.fetch_member(member_id)获取该服务器内的目标用户对象,确保角色操作是针对当前服务器的正确实例。 - 完善错误追踪:新增多种异常捕获逻辑,记录每个服务器的失败原因,方便后续排查问题。
- 严格前置校验:确认当前服务器的禁言角色存在后,再执行后续操作,避免无效调用。
内容的提问来源于stack exchange,提问作者シBxrcode
相关产品推荐
相关产品推荐

