Discord.js 如何检测频道是否对所有用户开放(至少可查看)
检测Discord频道公开查看权限的实现方案
核心原理
Discord的View Channel权限对应的权限位是1 << 10(数值为1024),校验是否对所有用户开放的核心是判断服务器默认角色@everyone的最终查看权限,不需要额外调用第三方接口,基于Discord原生权限模型即可实现计算。
具体实现步骤
- 第一步:获取目标频道的权限重写(permission overwrite)列表,以及所属服务器的@everyone默认角色基础权限
- 第二步:先校验@everyone角色的全局基础权限:如果@everyone在服务器层面已经被授予1024权限,且目标频道没有对@everyone设置否定类型的权限重写,那么频道默认对所有用户开放查看权限
- 第三步:如果@everyone的基础权限被全局否定,再检查目标频道是否单独对@everyone设置了允许类型的
View Channel权限重写,且没有更高优先级的否定规则覆盖 - 第四步:排除非全局规则的干扰:频道针对特定角色、特定用户设置的单独权限不影响「所有用户可访问」的判断,仅@everyone的权限规则会影响全局公开状态
代码示例(Python + discord.py)
def is_channel_public(channel): # 拉取服务器默认的everyone角色 everyone_role = channel.guild.default_role # 计算该角色在目标频道的合并后权限 permissions = channel.permissions_for(everyone_role) # 返回是否具备查看频道权限 return permissions.view_channel
注意:如果直接调用Discord HTTP API实现,需要先拉取频道的
permission_overwrites字段,手动计算@everyone角色的最终权限,计算规则为:最终权限 = (基础权限 & ~deny) | allow,其中deny和allow是权限重写规则中对应@everyone角色的权限数值。
边界情况说明
- 如果你用于请求的机器人本身没有访问目标频道的权限,会无法拉取频道权限配置返回403错误,需要先保证机器人持有
Manage Channels或者View Server Insights权限才能正常拉取权限数据 - 线程、子论坛类的附属频道需要额外校验父频道的权限,附属频道默认继承父频道的权限配置,除非单独设置了独立的权限重写规则
内容的提问来源于stack exchange,提问作者Noxmore
相关产品推荐
相关产品推荐

