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
相关产品推荐
相关产品推荐

