discord.py机器人报错CommandNotFound:balance指令未找到如何解决
Discord机器人无响应问题修复及代码优化
核心问题排查(导致无响应+报错的直接原因)
- intents未配置:discord.py 2.0及以上版本要求显式开启
message_content权限才能读取普通消息中的指令,未配置intents是机器人无响应的首要原因。 - 语法/参数错误:
- 重复实例化客户端:先创建
discord.Client()又覆盖为commands.Bot,属于冗余代码且可能引发冲突 json.load参数错误:open_account函数中已经通过get_bank_data()获取了用户数据,又重复执行json.load(users,f),json.load只需要传入文件对象f,写法完全错误- 布尔值拼写错误:Python中布尔假是
False不是小写的false,会触发未定义变量报错 - 调用参数typo:
await open_account(ctx,author)中逗号应为点,正确写法是ctx.author - 随机数调用错误:
randomrange(1000)应改为random.randrange(1000),缺少所属模块前缀 - 指令缺少装饰器:
balance函数没有加@client.command()装饰器,无法被识别为可调用指令 - Embed参数拼写错误:发送嵌入时参数
emded是typo,正确为embed - 工具函数逻辑冲突:
open_account不需要加@client.command()装饰器,作为内部工具函数即可,加了装饰器反而会导致参数匹配错误 - 缺少文件初始化逻辑:如果
bank.json不存在,第一次读取会直接报错,需要新增兜底初始化逻辑
- 重复实例化客户端:先创建
修复后完整代码
import discord from discord.ext import commands import json import os import random # 动态获取当前脚本所在目录,避免写死绝对路径换环境无法运行 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) BANK_FILE = os.path.join(BASE_DIR, "bank.json") # 配置intents,必须开启message_content才能读取前缀指令 intents = discord.Intents.default() intents.message_content = True client = commands.Bot(command_prefix="bot!", intents=intents) ## 事件部分 @client.event async def on_ready(): print("Hello, the bot is ready.") # 启动时初始化bank.json文件 if not os.path.exists(BANK_FILE): with open(BANK_FILE, "w") as f: json.dump({}, f) ## 工具函数:开户,不需要暴露为指令 async def open_account(user): users = await get_bank_data() if str(user.id) in users: return False users[str(user.id)] = {"Wallet": 150} with open(BANK_FILE, "w") as f: json.dump(users, f) return True ## 工具函数:获取银行数据 async def get_bank_data(): with open(BANK_FILE, "r") as f: users = json.load(f) return users ## 余额查询指令 @client.command() async def balance(ctx): await open_account(ctx.author) # 新用户自动开户 users = await get_bank_data() wallet_amt = users[str(ctx.author.id)]["Wallet"] # 构造并发送余额Embed em = discord.Embed(title=f"{ctx.author.name}的余额", color=discord.Color.red()) em.add_field(name="钱包余额", value=wallet_amt) await ctx.send(embed=em) ## 赚钱指令 @client.command() async def earn(ctx): await open_account(ctx.author) users = await get_bank_data() earnings = random.randrange(1000) users[str(ctx.author.id)]["Wallet"] += earnings # 写入新余额 with open(BANK_FILE, "w") as f: json.dump(users, f) # 发送结果 await ctx.send(f"你赚到了{earnings}美元") await balance(ctx) # 直接调用余额指令展示最新余额,避免重复代码 client.run('替换为你的机器人TOKEN')
额外优化建议
- 不要把TOKEN硬编码在代码里,推荐使用环境变量或者
.env文件存储敏感信息,避免泄露 - 频繁读写JSON文件性能较差,如果用户量上来可以考虑用轻量级数据库比如SQLite替代
- 可以给指令增加别名、使用说明、冷却时间,提升用户体验
- 新增异常捕获逻辑,避免文件读写、Discord API调用出错直接导致程序崩溃
内容的提问来源于stack exchange,提问作者Prince
相关产品推荐
相关产品推荐

