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.")
关键修复点说明
- 修正错误处理参数顺序:将
kick_error函数的参数调整为(ctx, error),确保Discord.py能正确传递上下文和错误对象。 - 替换用户获取方式:用
ctx.user替代ctx.message.author,适配Slash命令的上下文结构。 - 更换权限检查器:使用
@app_commands.checks.has_permissions替代原装饰器,确保权限校验逻辑适配Slash命令体系。 - 规范响应调用:Slash命令推荐使用
ctx.response.send_message,更贴合官方API的交互逻辑。
额外提示
如果需要同时校验机器人自身的踢人权限,可添加以下装饰器:
@app_commands.checks.bot_has_permissions(kick_members=True)
内容的提问来源于stack exchange,提问作者Jack142
相关产品推荐
相关产品推荐

