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

使用nextcord批量修改Discord成员昵称报403权限缺失错误

问题说明

使用Python基于nextcord库开发Discord机器人,目标是按序号批量为服务器成员设置昵称,运行时抛出错误:
nextcord.errors.Forbidden: 403 Forbidden (error code: 50013): Missing Permissions
已在开发者门户为机器人配置修改昵称、管理成员权限,也尝试过给机器人分配服务器管理员角色,问题仍未解决,原实现代码如下:

import nextcord
from nextcord.ext import commands

bot = commands.Bot(intents = nextcord.Intents.all())
prefix = "!"

@bot.event
async def on_ready():
    print(f"Logged in as {bot.user}")

@bot.event
async def on_message(message):
    if message.content[0] == prefix:
        content = message.content[1:]

        if content == "all_nick":
            value = 1
            for member in bot.get_all_members():
                await member.edit(nick = "Member " + str(value))
                value += 1

bot.run("BOT_TOKEN_HERE")
故障原因与修复方案

这个错误不全是权限开关没开导致的,代码逻辑缺陷、Discord平台的硬规则限制都会触发50013,具体问题点和修复方式如下:

1. 平台规则类问题(开管理员也没用)

Discord的权限体系除了开关类权限,还有角色层级校验规则:

  • 机器人的角色在服务器角色列表中的排序,必须高于所有待修改昵称成员的最高角色,哪怕机器人有管理员权限,只要目标成员的角色排序比机器人高,就无权修改对方昵称。
  • 服务器所有者的昵称不允许任何机器人/普通管理员修改,遍历到所有者时必然报50013。
  • 机器人自身的昵称无法通过遍历成员的逻辑修改,会触发权限错误。

2. 原代码逻辑缺陷

  • bot.get_all_members()会拉取机器人加入的所有服务器的全部成员,而非当前触发命令的服务器成员,跨服务器修改昵称没有对应权限,直接报错。
  • 没有过滤私信场景、机器人自身发送的消息,容易出现误触发、循环调用问题。
  • 没有做异常捕获,只要有一个成员修改失败,整个批量流程就会直接中断。
  • 短时间内连续发起接口请求,很容易触发Discord速率限制,导致临时接口封禁。
  • 没有提前校验机器人在当前服务器的实际权限,配置错误时没有明确提示。

修复后可运行代码

import nextcord
from nextcord.ext import commands
import asyncio

# 注意:需在开发者门户开启Server Members Intent、Message Content Intent两个特权意图
bot = commands.Bot(intents=nextcord.Intents.all())
prefix = "!"

@bot.event
async def on_ready():
    print(f"Logged in as {bot.user}")

@bot.event
async def on_message(message):
    # 跳过机器人自身发送的消息,避免循环触发
    if message.author.bot:
        return
    # 跳过私信场景的命令触发
    if not message.guild:
        return
    
    if message.content.startswith(prefix):
        content = message.content[1:].strip()
        if content == "all_nick":
            # 前置校验机器人是否有管理昵称权限
            if not message.guild.me.guild_permissions.manage_nicknames:
                await message.channel.send("缺少管理昵称权限,请检查角色配置")
                return
            bot_top_role_pos = message.guild.me.top_role.position
            serial_num = 1
            # 仅遍历当前触发命令的服务器成员
            for member in message.guild.members:
                # 跳过服务器所有者、机器人账号
                if member == message.guild.owner or member.bot:
                    serial_num += 1
                    continue
                # 跳过角色层级不低于机器人的成员
                if member.top_role.position >= bot_top_role_pos:
                    await message.channel.send(f"跳过成员{member.name}:角色层级不低于机器人,无修改权限")
                    serial_num += 1
                    continue
                try:
                    await member.edit(nick=f"Member {serial_num}")
                    serial_num += 1
                    # 加1秒间隔避免触发速率限制
                    await asyncio.sleep(1)
                except Exception as e:
                    await message.channel.send(f"修改成员{member.name}昵称失败:{str(e)}")
                    continue
            await message.channel.send("批量昵称修改操作执行完毕")
    await bot.process_commands(message)

bot.run("BOT_TOKEN_HERE")

部署前必做配置

  • 打开Discord开发者门户,进入对应机器人的Bot设置页,找到Privileged Gateway Intents分类,打开Server Members Intent和Message Content Intent两个开关并保存,否则无法获取完整成员列表、无法读取普通消息内容。
  • 进入目标服务器的角色设置,把机器人对应的角色拖动到角色列表的高位,确保排序在所有待修改昵称的成员的角色上方,保存配置。
  • 不要尝试给服务器所有者设置昵称,平台层面禁止该操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:18:15