Discord机器人重置昵称遇403权限错误(50013)求助
问题
开发了一款用于重置服务器成员昵称的Discord机器人,运行时触发discord.errors.Forbidden: 403 FORBIDDEN (error code: 50013): Missing Permissions错误。机器人已配置管理员权限,但无法完成所有成员的昵称重置,推测是因为无法修改服务器所有者(本人)的昵称导致的。询问该功能是否可行及解决办法。
代码示例
@bot.command() @commands.has_permissions(change_nickname=True) async def reset(ctx): for member in ctx.guild.members: await member.edit(nick=None)
完整回溯信息
Traceback (most recent call last): File "C:\Users\Maxos\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\core.py", line 229, in wrapped ret = await coro(*args, **kwargs) File "A:\Py_bot\main.py", line 21, in reset await member.edit(nick='Боб') # reset their nickname File "C:\Users\Maxos\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\member.py", line 880, in edit data = await http.edit_member(guild_id, self.id, reason=reason, **payload) File "C:\Users\Maxos\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\http.py", line 738, in request raise Forbidden(response, data) discord.errors.Forbidden: 403 Forbidden (error code: 50013): Missing Permissions The above exception was the direct cause of the following exception: Traceback (most recent call last): File "C:\Users\Maxos\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\bot.py", line 1349, in invoke await ctx.command.invoke(ctx) File "C:\Users\Maxos\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\core.py", line 1023, in invoke await injected(*ctx.args, **ctx.kwargs) # type: ignore File "C:\Users\Maxos\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\core.py", line 238, in wrapped raise CommandInvokeError(exc) from exc discord.ext.commands.errors.CommandInvokeError: Command raised an exception: Forbidden: 403 Forbidden (error code: 50013): Missing Permissions
解决方案
功能可行性说明
Discord内置权限规则明确:服务器所有者的昵称无法被任何机器人(即使拥有管理员权限)修改,你的推测完全正确。此外,机器人也无法修改角色层级高于自身的成员昵称。
具体解决步骤
- 跳过服务器所有者:遍历成员时加入判断,直接跳过服务器所有者账号,避免触发权限错误。
- 添加错误捕获:用
try-except包裹昵称修改操作,即使遇到其他无法修改的成员(如角色层级更高的用户),机器人也能继续运行,不会直接崩溃。
修改后的代码示例
@bot.command() @commands.has_permissions(change_nickname=True) async def reset(ctx): for member in ctx.guild.members: # 跳过服务器所有者 if member.id == ctx.guild.owner_id: continue # 捕获权限错误,避免机器人崩溃 try: await member.edit(nick=None) except discord.Forbidden: print(f"无法修改成员 {member.name} 的昵称:权限不足")
内容的提问来源于stack exchange,提问作者Noani61
相关产品推荐
相关产品推荐

