如何验证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
相关产品推荐
相关产品推荐

