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

Discord机器人Level命令触发CommandInvokeError与KeyError问题求助

解决Discord机器人等级命令的KeyError问题

你遇到的问题核心很清晰——JSON文件里的用户键格式和代码中使用的查找格式不匹配,导致程序找不到对应用户的数据,抛出了KeyError。

问题根源

你的level.json里存储的用户键是<@514026847680593922>(带Discord提及格式的字符串),但代码里是用str(user.id)(纯用户ID数字字符串,比如"514026847680593922")去查找数据的,这两个字符串完全不一致,自然找不到对应的值。

解决方案

我们分两步修复这个问题:

1. 修正JSON文件的键格式

把level.json里的键改成纯用户ID字符串,修改后内容如下:

{"514026847680593922": {"experience": 95, "level": 3}}

用纯用户ID作为键是更可靠的方案,不会因为提及格式(比如是否带!符号)的变化出现匹配问题。

2. 优化代码,增加异常处理

为了避免新用户(还没在JSON中记录数据)使用命令时再次报错,我们增加数据存在性检查,同时简化重复的代码逻辑。修改后的完整代码:

@client.command(aliases=['rank','lvl'])
async def level(ctx, member: discord.Member = None):
    # 确定目标用户:没有指定成员就查自己
    target_user = member or ctx.message.author
    user_id_str = str(target_user.id)

    # 读取等级数据
    with open('level.json','r') as f:
        users = json.load(f)
    
    # 检查用户是否有数据,没有则初始化基础值并写回文件
    if user_id_str not in users:
        users[user_id_str] = {"experience": 0, "level": 1}
        with open('level.json','w') as f:
            json.dump(users, f, indent=4)
    
    # 获取等级和经验值
    lvl = users[user_id_str]['level']
    exp = users[user_id_str]['experience']
    
    # 构建并发送嵌入消息
    embed = discord.Embed(title=f'Level {lvl}', description=f"{exp} XP", color=discord.Color.green())
    embed.set_author(name=target_user, icon_url=target_user.avatar_url)
    await ctx.send(embed=embed)

代码优化说明

  • 用target_user = member or ctx.message.author简化了分支判断,避免重复编写相同的逻辑代码
  • 增加了用户数据存在性检查,新用户使用命令时会自动初始化等级和经验,彻底避免KeyError
  • 合并了重复的JSON读写逻辑,减少代码冗余

这样修改后,你的等级查询命令就能正常运行了,不管是查询自己还是其他成员的等级都不会再报错。

内容的提问来源于stack exchange,提问作者Grim_Reaper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 11:42:32