如何通过discord.py获取指定Guild内机器人的全部权限
discord.py 获取指定Guild内机器人权限的实现方法
拿到对应Guild对象之后,不用绕路查API,直接基于内置属性就能完成权限查询,核心逻辑是先定位机器人在该服务器的成员身份,再读取绑定在成员身份上的权限值,具体操作如下:
- 第一步:直接调用Guild对象内置的
me属性,拿到机器人在当前服务器的Member实例
这个属性是框架自带的缓存值,不需要额外发起异步查询,在v1.x、v2.x全版本通用,直接写成bot_member = target_guild.me即可。 - 第二步:根据场景选择对应权限查询方式
- 如果需要获取机器人的全局服务器权限(即叠加所有分配给机器人的角色权限后的总权限,不受单个频道的权限覆写规则影响),直接读取
bot_member.guild_permissions属性,返回的是标准的Permissions对象,每一个权限项都可以通过属性名直接判断状态,比如通过bot_member.guild_permissions.manage_channels可以直接判断有没有管理频道的权限。 - 如果需要获取机器人在某特定频道内的实际生效权限(即叠加角色权限、频道权限覆写规则后的最终可执行权限),调用
bot_member.permissions_in(target_channel)方法,传入对应的频道对象即可拿到计算后的权限结果。
- 如果需要获取机器人的全局服务器权限(即叠加所有分配给机器人的角色权限后的总权限,不受单个频道的权限覆写规则影响),直接读取
可直接复用的示例代码
# 已提前获取到的目标Guild对象 target_guild bot_member = target_guild.me # 读取机器人在该服务器的全局权限 bot_global_perms = bot_member.guild_permissions # 遍历输出所有权限状态 for perm_name, has_perm in bot_global_perms: status = "已开启" if has_perm else "未开启" print(f"[{perm_name}] 权限状态: {status}")
常见踩坑提醒
- 权限是绑定在服务器成员/角色上的属性,Guild对象本身不会存储机器人的权限值,不要尝试在Guild的属性列表里找权限相关字段。
- 如果机器人被授予了Discord的服务器管理员权限,所有权限项都会被判定为开启状态,这是Discord平台本身的权限判定逻辑,不是代码读取异常。
- 分片运行的机器人不需要额外手动匹配成员身份,
guild.me会自动匹配当前运行实例的机器人账号对应的成员记录。
内容的提问来源于stack exchange,提问作者Moondancer
相关产品推荐
相关产品推荐

