如何用discord.py实现Discord机器人踢人功能?报错求助
问题分析与解决
报错核心原因是Slash Command(@client.tree.command())的回调函数参数使用错误:
- 你同时传入了传统前缀命令用的
ctx和Slash Command专属的interaction,且interaction的位置与类型标注不符合Discord.py的规则。 - Discord.py中,Slash Command的回调函数第一个参数必须是
discord.Interaction对象,不需要额外的ctx参数。
修正后的代码
from typing import Optional import discord from discord import app_commands @client.tree.command(name="kick", description="Kicks the specified member") @app_commands.describe(member='The member you want to kick', reason='Reason for kicking the member') async def kick(interaction: discord.Interaction, member: discord.Member, reason: Optional[str] = "No reason provided"): """Kicks the specified member from the server""" # 检查命令执行者的踢人权限 if not interaction.user.guild_permissions.kick_members: await interaction.response.send_message("你没有踢人权限!", ephemeral=True) return # 检查机器人自身的踢人权限 if not interaction.guild.me.guild_permissions.kick_members: await interaction.response.send_message("我没有踢人权限,请给我分配相应权限!", ephemeral=True) return # 禁止踢自己或管理员 if member == interaction.user: await interaction.response.send_message("你不能踢自己!", ephemeral=True) return if member.guild_permissions.administrator: await interaction.response.send_message("我不能踢管理员!", ephemeral=True) return try: await member.kick(reason=reason) # 假设你已实现generate_unix_time_code函数返回秒级Unix时间戳 await interaction.response.send_message(f"已将 {member.mention} 踢出服务器\n执行者:{interaction.user.mention}\n原因:{reason}\n时间:<t:{generate_unix_time_code()}:F>") except discord.Forbidden: await interaction.response.send_message(f"无法踢出 {member.mention},权限不足!", ephemeral=True) except discord.HTTPException as e: await interaction.response.send_message(f"踢人失败:{str(e)}", ephemeral=True)
关键修改说明
- 参数调整:
- 移除多余的
ctx参数,将interaction作为第一个参数并正确标注类型。 - 调整参数顺序:把必填的
member放在前面,reason设为可选参数并赋予默认值,符合Slash Command的参数规则。
- 移除多余的
- 权限校验:新增用户与机器人的权限检查,避免无权限时直接报错。
- 异常处理:捕获
Forbidden(权限不足)和HTTPException(其他HTTP错误),给出友好提示。 - 信息修正:用
interaction.user替代ctx.author获取命令执行者,用member.mention实现@提及效果。
额外注意事项
- 确保
generate_unix_time_code()返回正确的秒级Unix时间戳,否则时间显示会异常。 - 机器人启动时需执行
client.tree.sync()同步Slash Command,否则命令可能无法在服务器中显示。
内容的提问来源于stack exchange,提问作者Whatifyoucloseyour5
相关产品推荐
相关产品推荐

