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

Python3.10+discord.py机器人解封命令触发TypeError错误求助

解决discord.py Unban命令的TypeError错误

错误根源在于这行代码:

banned_users = await ctx.guild.bans()

ctx.guild.bans() 返回的是异步生成器,并非可直接用await获取结果的对象,这就是触发TypeError: object async_generator can't be used in 'await' expression的原因。

下面提供两种修复方案,同时优化了代码的用户体验:

方案1:使用async for遍历异步生成器

直接遍历异步生成器,无需提前存储所有封禁记录:

@Sapphire.command()
@commands.has_permissions(ban_members=True)
async def unban(ctx, *, member):
    """Unbans a member from the server."""
    try:
        member_name, member_discriminator = member.split("#")
    except ValueError:
        await ctx.send("请输入正确的用户格式:用户名#四位数字")
        return

    async for ban_entry in ctx.guild.bans():
        user = ban_entry.user
        if (user.name, user.discriminator) == (member_name, member_discriminator):
            await ctx.guild.unban(user)
            # 合并Embed,避免重复发送消息
            unban_embed = discord.Embed(
                description=f"已解封 {user.mention}\n{user} 已从服务器解封 | 解封人:{ctx.author.name}",
                color=0xc700ff
            )
            await ctx.send(embed=unban_embed)
            try:
                await user.send(embed=discord.Embed(
                    description=f"你已被 **{ctx.guild.name}** 服务器解封,解封人:**{ctx.author.name}**。",
                    color=0xc700ff
                ))
            except discord.Forbidden:
                pass
            break
    else:
        await ctx.send(f"未找到被封禁的用户:{member}。")

方案2:将异步生成器转换为列表

如果需要提前获取所有封禁记录,可以用异步列表推导式转成列表:

@Sapphire.command()
@commands.has_permissions(ban_members=True)
async def unban(ctx, *, member):
    """Unbans a member from the server."""
    try:
        member_name, member_discriminator = member.split("#")
    except ValueError:
        await ctx.send("请输入正确的用户格式:用户名#四位数字")
        return

    # 将异步生成器转为列表
    banned_users = [entry async for entry in ctx.guild.bans()]
    for ban_entry in banned_users:
        user = ban_entry.user
        if (user.name, user.discriminator) == (member_name, member_discriminator):
            await ctx.guild.unban(user)
            unban_embed = discord.Embed(
                description=f"已解封 {user.mention}\n{user} 已从服务器解封 | 解封人:{ctx.author.name}",
                color=0xc700ff
            )
            await ctx.send(embed=unban_embed)
            try:
                await user.send(embed=discord.Embed(
                    description=f"你已被 **{ctx.guild.name}** 服务器解封,解封人:**{ctx.author.name}**。",
                    color=0xc700ff
                ))
            except discord.Forbidden:
                pass
            break
    else:
        await ctx.send(f"未找到被封禁的用户:{member}。")

额外优化点:

  • 增加了用户输入格式错误的判断(比如未输入#)
  • 合并了重复发送的Embed消息,减少频道刷屏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:27:29