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

discord.py实例化自定义UnfilteredBot时出现NameError未定义报错

问题原因

抛出NameError: name 'UnfilteredBot' is not defined是因为Python解释器在执行实例化代码时,找不到UnfilteredBot类的定义,具体触发场景如下:

  1. 你把UnfilteredBot类写在了单独的bot.py文件中,但当前运行的入口文件(报错栈里的/home/pi/Desktop/app.py)没有导入这个类,同时入口文件也没有导入discord.ext.commands模块——你的自定义类继承自commands.Bot,本身就依赖这个模块。
  2. 从你贴的报错栈看,实例化代码里还传了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 00:06:32