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

Python开发的Discord机器人Ban命令执行到打印a后停止运行如何解决

问题原因
  • 参数类型定义错误:你将member的类型标注为discord.User,但成员实例的ban()方法是服务器成员对象discord.Member的专属接口,discord.User是Discord全局用户对象,不包含单服务器内的操作属性,调用时会直接抛出属性不存在的异常,导致后续代码终止运行。
  • 缺少异常捕获逻辑:执行封禁操作时可能出现多种运行时错误(比如机器人权限不足、被封禁用户权限比机器人高、未开启服务器成员特权网关意图等),没有异常捕获的情况下报错后程序会直接终止当前协程,不会执行后续的print('b')。
  • 未开启特权网关意图:Discord API要求操作服务器成员必须在开发者后台开启Server Members Intent,同时代码中初始化Client时要显式声明该权限,否则成员操作类接口都会调用失败。
修复方案

修改后的完整代码如下:

# 首先初始化Client时要声明意图,示例如下
import discord
from discord.ext import commands

intents = discord.Intents.default()
intents.members = True # 开启成员意图
intents.message_content = True # 开启消息内容意图,确保命令能被触发

# 替换为你自己的命令前缀
Client = commands.Bot(command_prefix='!', intents=intents)

@commands.has_permissions(ban_members=True)
@Client.command()
# 此处将参数类型从discord.User改为discord.Member
async def Ban (ctx, member:discord.Member=None, reason="Nie podano"):
    if member == None or member == ctx.message.author:
        await ctx.channel.send("Nie możesz zbanować sam siebie")
        return
    # 私信操作增加异常捕获,避免用户关闭私信导致整个命令报错
    try:
        message = f"Zostałeś zbanowany na serwerze {ctx.guild.name}\nPowód: {reason}"
        await member.send(message)
    except:
        pass
    await ctx.channel.purge(limit = 1)
    await ctx.channel.send(f"{member} Został zbanowany!\nPowód: {reason}")
    print('a')
    # 封禁操作增加异常捕获
    try:
        await member.ban(reason = reason)
        print('b')
    except Exception as e:
        print(f"封禁操作失败,错误信息:{e}")
        await ctx.channel.send(f"封禁失败:权限不足或目标用户权限高于机器人")

额外补充:如果你需要封禁不在当前服务器的用户,可以不用修改参数类型,把await member.ban(reason=reason)替换为await ctx.guild.ban(user=member, reason=reason)即可,无需依赖Member对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:45:02