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

如何验证Slash Command成员权限?权限校验失效求助

解决Discord斜杠命令权限校验与错误提示问题

问题核心

  • 传统前缀命令的@commands.has_permissions()装饰器不适用于斜杠命令(App Commands),需改用App Commands专属的权限校验工具。
  • 斜杠命令的错误无法通过on_command_error事件捕获,必须使用专门的斜杠命令错误监听事件。

修正方案

1. 替换权限校验装饰器

将前缀命令用的权限装饰器替换为斜杠命令专用的版本:
把@commands.has_permissions(manage_messages = True)改为@app_commands.checks.has_permissions(manage_messages=True)。

2. 修正错误处理事件

改用on_app_command_error事件监听斜杠命令错误,并匹配对应错误类型:

@bot.event
async def on_app_command_error(interaction: discord.Interaction, error: app_commands.AppCommandError):
    if isinstance(error, app_commands.MissingPermissions):
        await interaction.response.send_message("你没有足够的权限执行此操作!", delete_after=3)

3. 优化Clear命令的消息删除逻辑

用批量删除替代循环删除,提升执行效率:

@bot.tree.command(guild=discord.Object(id=1264715762199691446), name="clear", description="删除指定数量的消息。")
@app_commands.checks.has_permissions(manage_messages=True)
@app_commands.describe(nombre="要删除的消息数量。")
async def clear(interaction: discord.Interaction, nombre: int):
    # 批量删除14天内的消息(Discord API限制)
    await interaction.channel.purge(limit=nombre)
    # 发送操作完成提示
    await interaction.response.send_message(f"**<:trash:1264750959372927057> 已删除__{nombre}__条消息。**", delete_after=3)

关键说明

  • 斜杠命令的权限校验必须依赖app_commands.checks下的装饰器,否则权限校验完全不生效。
  • on_app_command_error是专门处理斜杠命令错误的事件,错误类型需从app_commands模块中调用(如app_commands.MissingPermissions)。
  • 使用purge()批量删除消息比循环逐条删除更高效,且符合Discord API的调用规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:32:12