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

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)
关键修改说明
  1. 参数改为用户ID:不再直接接收discord.Member,改用member_id: int作为参数,避免绑定到单一服务器的Member实例,支持跨服务器操作。
  2. 获取当前服务器的Member实例:对每个循环的服务器,使用await guild.fetch_member(member_id)获取该服务器内的目标用户对象,确保角色操作是针对当前服务器的正确实例。
  3. 完善错误追踪:新增多种异常捕获逻辑,记录每个服务器的失败原因,方便后续排查问题。
  4. 严格前置校验:确认当前服务器的禁言角色存在后,再执行后续操作,避免无效调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 00:20:14