如何在 Discord 机器人中正确添加角色而不受命令调用者权限限制

落雪大大_6598

落雪大大_6598

2026-07-13

749人浏览

原创

如何在 Discord 机器人中正确添加角色而不受命令调用者权限限制

本教程详解 Discord 机器人添加角色失败的常见原因(尤其是 50013 权限错误),重点说明问题根源在于机器人自身角色位置不足,而非用户权限,并提供完整、安全、可复用的解决方案。

本教程详解 discord 机器人添加角色失败的常见原因(尤其是 50013 权限错误),重点说明问题根源在于**机器人自身角色位置不足**,而非用户权限,并提供完整、安全、可复用的解决方案。

在 Discord 中,Missing Permissions (error code 50013) 这一错误绝非表示命令发起者(如服务器管理员)缺少权限,而是明确指出:机器人账号本身没有执行该操作所需的权限。最常见且易被忽视的原因是——机器人的角色在服务器角色层级(role hierarchy)中低于目标角色。

Discord 的权限模型严格遵循“角色位置优先级”原则:

  • 机器人只能管理位置低于自身角色的其他角色;
  • 机器人只能给成员添加其自身角色能管理的角色(即目标角色 position
  • 即使你是服务器所有者,若机器人角色被拖到“role”之下,add_roles() 仍会因 HTTP 400 失败。

此外,原代码中还存在多个关键逻辑错误,需一并修正:

✅ 错误 1:await user.add_roles(person, role) 用法错误
Member.add_roles() 接收的是 Role 对象(或多个 Role),而非 Member + Role。此处误将目标用户 person 当作参数传入,导致类型错误和语义混乱。正确应为:await person.add_roles(role)。

SearchGPT
SearchGPT

SearchGPT是一款AI工具,OpenAI最新推出的AI搜索引擎。

下载

✅ 错误 2:role 变量在角色创建后未刷新
guild.create_role() 返回新创建的 Role 对象,但后续仍使用旧的 role(可能为 None),导致 role.edit(position=10) 报错。必须捕获创建返回值。

✅ 错误 3:未做基础校验与异常处理
缺少对 person 是否找到、是否为 Member、目标角色是否存在/可管理等判断,用户体验差且调试困难。

✅ 错误 4:“忽略命令用户权限”误解
Discord API 不支持也绝不允许绕过权限检查。所谓“忽略用户权限”是无效诉求;正确做法是:确保机器人具备必要权限(manage_roles),且其角色位置高于目标角色。

以下是修复后的健壮实现(含注释与最佳实践):

import discord
from discord.ext import commands

@bot.command()
@commands.has_permissions(manage_roles=True)  # 可选:要求调用者有管理角色权(提升安全性)
async def giverole(ctx, member: discord.Member, role_name: str = "role"):
    """
    给指定成员添加指定角色(需机器人角色位置高于目标角色)
    示例:!giverole @Alice Moderator
    """
    guild = ctx.guild
    # 步骤1:获取或创建角色
    role = discord.utils.get(guild.roles, name=role_name)

    if role is None:
        try:
            role = await guild.create_role(
                name=role_name,
                color=discord.Color(0x000000),
                reason=f"由 {ctx.author} 通过 !giverole 创建"
            )
            await ctx.send(f"✅ 角色 '{role_name}' 已创建。")
        except discord.Forbidden:
            return await ctx.send("❌ 机器人无权创建角色,请检查是否拥有 `manage_roles` 权限。")

    # 步骤2:确保机器人能管理该角色(关键!)
    if role.position >= ctx.me.top_role.position:
        return await ctx.send(
            f"❌ 无法操作角色 '{role.name}':其位置({role.position})高于或等于机器人最高角色({ctx.me.top_role.position})。\n"
            "请将机器人角色拖至该角色上方后重试。"
        )

    # 步骤3:尝试添加角色
    try:
        await member.add_roles(role, reason=f"由 {ctx.author} 添加")
        await ctx.send(f"✅ 已成功为 {member.mention} 添加角色 `{role.name}`。")
    except discord.Forbidden:
        await ctx.send("❌ 机器人无权修改该成员的角色,请检查:\n• 机器人是否拥有 `manage_roles` 权限\n• 机器人角色是否高于目标角色\n• 目标成员是否为管理员(无法被赋予更高权限角色)")
    except discord.HTTPException as e:
        await ctx.send(f"❌ 操作失败:{e}")

? 关键配置提醒(必须手动完成):

  1. 进入服务器「设置 → 角色」,找到你的机器人角色;
  2. 将其拖动到目标角色(如 "role")的上方(即 position 数值更大);
  3. 确保机器人在「设置 → 频道权限」中已启用 Manage Roles 权限(通常在邀请机器人时勾选 Administrator 或手动授予)。

? 总结:Discord 的权限模型不可绕过,但完全可控。解决问题的核心永远是——提升机器人角色位置 + 显式授予 manage_roles 权限 + 编写防御性代码。无需“忽略用户权限”,只需让机器人具备合法、充分的执行能力。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1611

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

3844

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1609

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

22117

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2727

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2767

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1103

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2143

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.3万人学习