Discord.py中Guild.bans()报错:缺少必需的self参数
问题解决方法
错误原因很明确:你直接调用了discord.Guild类的bans()方法,而这个方法需要类的实例(具体的服务器对象)作为第一个参数(self),但你没有传入,所以触发了参数缺失的错误。
修正后的代码
@tree.command(name="unban", description="Unbans a member.", guild=discord.Object(id=guildid)) async def unban(ctx, member: str): try: # 使用ctx.guild(当前命令所在的服务器实例)调用bans()方法 banned_users = await ctx.guild.bans() member_name, member_discriminator = member.split("#") for ban_entry in banned_users: user = ban_entry.user if (user.name, user.discriminator) == (member_name, member_discriminator): await ctx.guild.unban(user) await ctx.response.send_message(f"已解除对 {user.mention} 的封禁") return # 未找到匹配的封禁用户时反馈 await ctx.response.send_message("未找到该用户的封禁记录") except ValueError: # 处理用户输入格式错误(无#分隔符) await ctx.response.send_message("请使用正确格式:用户名#四位数字")
关键修正点
- 替换
await discord.Guild.bans()为await ctx.guild.bans():ctx.guild是当前命令上下文提供的服务器实例,调用它的bans()方法才符合类方法的调用规则。 - 添加异常处理:避免用户输入格式错误导致程序崩溃,同时给用户明确操作反馈。
- 补充结果反馈:让用户清楚知道命令执行的最终状态,不管是成功解除封禁还是未找到目标用户。
额外优化建议
目前Discord已逐步取消用户 discriminator(#后的四位数字),改用唯一用户名(带@标识),建议改用用户ID查询封禁用户,这样更准确且不受用户名变更影响:
@tree.command(name="unban", description="Unbans a member.", guild=discord.Object(id=guildid)) async def unban(ctx, user_id: str): try: user = await ctx.bot.fetch_user(int(user_id)) await ctx.guild.unban(user) await ctx.response.send_message(f"已解除对 {user.mention} 的封禁") except discord.NotFound: await ctx.response.send_message("未找到该用户") except discord.Forbidden: await ctx.response.send_message("我没有解除封禁的权限") except ValueError: await ctx.response.send_message("请输入有效的用户ID")
内容的提问来源于stack exchange,提问作者ashacop
相关产品推荐
相关产品推荐

