discord.py实例化自定义UnfilteredBot时出现NameError未定义报错
问题原因
抛出NameError: name 'UnfilteredBot' is not defined是因为Python解释器在执行实例化代码时,找不到UnfilteredBot类的定义,具体触发场景如下:
- 你把
UnfilteredBot类写在了单独的bot.py文件中,但当前运行的入口文件(报错栈里的/home/pi/Desktop/app.py)没有导入这个类,同时入口文件也没有导入discord.ext.commands模块——你的自定义类继承自commands.Bot,本身就依赖这个模块。 - 从你贴的报错栈看,实例化代码里还传了
description=description参数,但你贴的业务代码里没有定义过description变量,就算解决了类导入的问题,这行也会触发新的变量未定义错误。
另外你的业务代码存在多处缩进错误:hello命令被错误嵌套在on_ready事件函数内部,add、shutdown命令的函数体缩进也不符合Python语法要求,这些问题都会导致代码无法正常运行。
补充说明:你重写process_commands方法的思路是对的,discord.py默认的commands.Bot会自动过滤所有机器人账号发送的消息,重写后去掉这层过滤就能接收并处理其他机器人发的消息。
修复方案
- 补全依赖导入:要么在
app.py里从bot.py导入你写好的UnfilteredBot类,要么直接把UnfilteredBot类的定义放到app.py中实例化代码的前面,同时记得导入discord.ext.commands模块。 - 修正语法错误:调整所有事件、命令的代码缩进,不要把命令函数嵌套在其他函数内部;如果不需要机器人描述字段,直接删掉实例化时的
description=description参数即可。 - 配置必要权限:discord.py 2.0及以上版本需要手动开启消息意图,实例化时要传入配置好的
intents,同时去Discord开发者后台的机器人设置页,打开「Message Content Intent」开关,否则无法正常接收消息内容。 - 安全提示:你贴出的机器人Token已经公开泄露,立刻去开发者后台重置Token,否则任何人都能控制你的机器人;另外
shutdown命令没有做权限校验,所有能访问机器人的用户都能触发主机关机,建议加上管理员权限判断。
修复后的参考代码
import discord from discord.ext import commands import os # 替换为你重置后的新Token TOKEN = '你的新机器人Token' # 自定义UnfilteredBot类,如果已经在bot.py里定义好,直接导入即可 class UnfilteredBot(commands.Bot): async def process_commands(self, message): ctx = await self.get_context(message) await self.invoke(ctx) # 配置消息意图 intents = discord.Intents.default() intents.message_content = True # 实例化机器人,不需要description参数就直接删掉 bot = UnfilteredBot(command_prefix='?', intents=intents) @bot.event async def on_ready(): print('Logged in as') print(bot.user.name) print(bot.user.id) print('------') @bot.command() async def hello(ctx): """Says world""" await ctx.send("world") @bot.command() async def add(ctx, left: int, right: int): """Adds two numbers together.""" await ctx.send(left + right) @bot.command() async def shutdown(ctx): # 加权限判断,只允许机器人所有者触发 if await bot.is_owner(ctx.author): await ctx.send("shutting down") os.system("shutdown -h now") else: await ctx.send("你没有权限执行这个命令") bot.run(TOKEN)
内容的提问来源于stack exchange,提问作者Dev Tanna
相关产品推荐
相关产品推荐

