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

