You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord.py斜杠命令踢人权限校验失效问题求助

问题原因与解决方案

为什么权限校验失效?

@commands.has_permissions(kick_members=True) 是Discord.py针对传统前缀命令设计的权限校验装饰器,完全不适用于斜杠命令(@client.tree.command 注册的应用命令)。两类命令分属不同系统,传统命令的权限装饰器无法对斜杠命令生效,因此才会出现任何人都能执行踢人操作的情况。

正确的权限校验方法

针对斜杠命令,有两种常用的权限校验方式:

方式1:使用app_commands内置的权限检查装饰器

直接使用discord.app_commands.checks.has_permissions装饰器,这是专门为应用命令设计的权限校验工具:

@client.tree.command(description = "kick a user")
@app_commands.describe(member = "who am i kicking", reason = "why am i kicking them")
@app_commands.checks.has_permissions(kick_members=True)
async def kick(interaction: discord.Interaction, member : discord.Member, reason: str=None):
    await member.kick(reason=reason)
    await interaction.response.send_message(f'Kicked {member.mention} for {reason}', ephemeral=True)

方式2:在命令内部手动校验权限

如果需要自定义无权限提示等灵活逻辑,可以在函数内直接检查用户的服务器权限:

@client.tree.command(description = "kick a user")
@app_commands.describe(member = "who am i kicking", reason = "why am i kicking them")
async def kick(interaction: discord.Interaction, member : discord.Member, reason: str=None):
    # 检查执行命令的用户是否有踢人权限
    if not interaction.user.guild_permissions.kick_members:
        await interaction.response.send_message("你没有执行踢人操作的权限!", ephemeral=True)
        return
    
    await member.kick(reason=reason)
    await interaction.response.send_message(f'Kicked {member.mention} for {reason}', ephemeral=True)

内容的提问来源于stack exchange,提问作者IndigoFire

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:22:34