Discord 支持为 Slash 命令配置细粒度权限,使命令仅可见于指定的角色(如管理员);该功能需要在 Discord 在开发者门户中手动配置,而不是通过 tree.command 直接实现代码等。
discord 支持为 slash 命令配置细粒度权限,使命令仅可见于指定的角色(如管理员);该功能需要在 discord 在开发者门户中手动配置,而不是通过 `tree.command` 直接实现代码等。
在 Discord 中,Slash 命令的可见性和执行权限由命令的可见性和执行权限决定 应用级权限控制 实现,而不是在 bot 通过代码中的装饰(如 @tree.command()直接限制用户组。这意味着你不能仅仅依靠它 Python 代码(例如 discord.py 的 tree.command)让命令“自动隐藏非管理员”——Discord 客户端将在命令列表中直接过滤掉无权用户的命令,这完全是由 Discord 控制服务端。
✅ 正确的操作路径如下(需要登录) Discord 开发者门户):
- 进入 Discord Developer Portal → 选择您的应用程序
- 进入左侧菜单 Bot → OAuth2 → URL Generator(确保 applications.commands 和 bot scope 已勾选)
- 关键步骤:进入 Server Settings(您的测试服务器)→ Integrations → 找到你的 Bot → 点击 Manage
- 在弹出的「Command Permissions」在面板中,您将看到所有已注册的面板 Slash 命令列表
- 点击对应命令的右侧 ⋯ → Edit Permissions → 增加权限规则,如:
- 选择 Role → 指定 Administrator 角色
- 设置 Permission 为 Enabled(即只有这个角色可以使用和可见)
- (可选)添加 @everyone 并设为 Disabled,完全屏蔽普通用户
? 注意事项:
- 权限变更立即生效,无需重启 bot 或者重新同步命令(但第一次注册命令后需要调用) tree.sync());
- 如果命令没有出现在管理面板上,请确认已成功调用 await tree.sync()(或 guild.sync()),且 bot 具有 applications.commands 权限;
- 权限基于 角色 ID,不支持用户 ID 白名单;如果需要更精细的控制,可以创建专门的管理角色并分配给目标用户;
- 客户端行为:没有权限的用户将完全看不到该命令(不在) / 出现在下拉列表中),而不是点击后报错-这是一个错误- Discord 安全设计。
例子:假设您已注册管理命令:
@tree.command(name="purge", description="Delete messages (Admin only)")
@app_commands.checks.has_role("Admin") # ❌ 这种装饰只验证执行时的权限,不隐藏命令!
async def purge(interaction: discord.Interaction, limit: int = 10):
await interaction.channel.purge(limit=limit)
await interaction.response.send_message("✅ Messages purged.", ephemeral=True)⚠️ 注意:@app_commands.checks.has_role(...) 只有当用户试图执行拦截时,命令本身就无法隐藏。真正的隐藏必须依赖于上述所述的内容。 Discord 后台权限配置。
总结:Slash 命令的“可见性隔离”是 Discord 开发者需要结合代码注册平台级能力 + 双步完成后台权限配置。不要依靠纯代码逻辑来隐藏命令——这不仅是平台的限制,也是安全的最佳实践。