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

discord.py机器人报错CommandNotFound:balance指令未找到如何解决

Discord机器人无响应问题修复及代码优化

核心问题排查(导致无响应+报错的直接原因)

  • intents未配置:discord.py 2.0及以上版本要求显式开启message_content权限才能读取普通消息中的指令,未配置intents是机器人无响应的首要原因。
  • 语法/参数错误:
    1. 重复实例化客户端:先创建discord.Client()又覆盖为commands.Bot,属于冗余代码且可能引发冲突
    2. json.load参数错误:open_account函数中已经通过get_bank_data()获取了用户数据,又重复执行json.load(users,f),json.load只需要传入文件对象f,写法完全错误
    3. 布尔值拼写错误:Python中布尔假是False不是小写的false,会触发未定义变量报错
    4. 调用参数typo:await open_account(ctx,author)中逗号应为点,正确写法是ctx.author
    5. 随机数调用错误:randomrange(1000)应改为random.randrange(1000),缺少所属模块前缀
    6. 指令缺少装饰器:balance函数没有加@client.command()装饰器,无法被识别为可调用指令
    7. Embed参数拼写错误:发送嵌入时参数emded是typo,正确为embed
    8. 工具函数逻辑冲突:open_account不需要加@client.command()装饰器,作为内部工具函数即可,加了装饰器反而会导致参数匹配错误
    9. 缺少文件初始化逻辑:如果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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 16:27:04