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

Discord机器人无踢人权限时未正确响应交互问题

问题原因及修复方案

核心问题解析

  • 错误处理函数参数顺序错误:@kick.error装饰的函数参数顺序应为(ctx, error),而非代码中的(error, ctx),导致权限缺失错误无法被正确捕获,进而触发“应用未响应”。
  • 上下文对象调用错误:Slash命令的上下文是ApplicationContext,不存在ctx.message.author属性,需改用ctx.user获取命令执行者。
  • 权限检查装饰器不匹配:原代码使用的@has_permissions是针对前缀命令的检查器,Slash命令需使用专属的@app_commands.checks.has_permissions才能正确校验用户权限。

修复后的完整代码

from discord import app_commands, MissingPermissions, Member
from discord.ext import commands

@bot.tree.command(description="Kickar alguém", guild_ids=[1041057700823449682])
@app_commands.checks.has_permissions(kick_members=True)
@app_commands.describe(member="Seleciona o membro", reason="O motivo do kick (podes deixar vazio)")
async def kick(
    ctx: app_commands.Context, 
    member: Member,
    reason: str = None
):
    if reason is None:
        reason = "és idiota"
    await ctx.response.send_message(f"Kickaste {member} com sucesso :)")
    await member.send(f'Foste kickado de {ctx.guild} porque {reason}.')
    await ctx.guild.kick(member)

@kick.error
async def kick_error(ctx: app_commands.Context, error: app_commands.AppCommandError):
    if isinstance(error, app_commands.MissingPermissions):
        await ctx.response.send_message(f"Desculpa {ctx.user.mention}, não tens permissões para isso!")
    # 可选:统一处理其他未知错误
    else:
        await ctx.response.send_message("Ocorreu um erro ao executar o comando.")

关键修复点说明

  1. 修正错误处理参数顺序:将kick_error函数的参数调整为(ctx, error),确保Discord.py能正确传递上下文和错误对象。
  2. 替换用户获取方式:用ctx.user替代ctx.message.author,适配Slash命令的上下文结构。
  3. 更换权限检查器:使用@app_commands.checks.has_permissions替代原装饰器,确保权限校验逻辑适配Slash命令体系。
  4. 规范响应调用:Slash命令推荐使用ctx.response.send_message,更贴合官方API的交互逻辑。

额外提示

如果需要同时校验机器人自身的踢人权限,可添加以下装饰器:

@app_commands.checks.bot_has_permissions(kick_members=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:15:42