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
相关产品推荐
相关产品推荐

