Python Discord bot 根据输入GrowID查询JSON文件中用户数据实现问题
错误原因
- 你接收的
GrowID是用户输入的字符串类型参数,并非Discord成员对象,直接调用.user_id属性属于非法操作,必然报错 - 你的JSON数据以Discord用户ID为顶级键,GrowID存储在次级字段中,无法直接通过顶级键匹配传入的GrowID参数,需要遍历所有账号数据匹配次级字段
修复后完整代码
@client.command(aliases=["p"]) async def profile(ctx, GrowID=None): # 读取账号数据 with open('account.json', 'r') as f: account = json.load(f) target_data = None # 未传入GrowID,查询触发者自己的账号 if GrowID is None: user_id = str(ctx.author.id) if user_id in account: target_data = account[user_id] else: await ctx.send("你还没有创建账号,请先发送`.start`指令初始化!") return # 传入了GrowID,匹配对应账号 else: # 遍历所有账号匹配GrowID for user_data in account.values(): # 如果需要不区分大小写匹配,可改为 user_data["GrowID"].lower() == GrowID.lower() if user_data["GrowID"] == GrowID: target_data = user_data break # 遍历完没找到匹配项 if target_data is None: await ctx.send(f"未找到GrowID为`{GrowID}`的账号,请检查输入是否正确!") return # 此处写你要展示账号数据的逻辑,比如发嵌入卡片 # 示例输出: await ctx.send(f""" GrowID: {target_data['GrowID']} 等级: {target_data['Level']} 经验: {target_data['XP']}/{target_data['XPLevel']} 宝石: {target_data['Gems']} 世界锁: {target_data['World Locks']} 钻石锁: {target_data['Diamond Locks']} """)
补充说明
- 如果存在多个账号绑定同一个GrowID的情况,可以根据需求调整逻辑,比如返回所有匹配项,或者在
start初始化时就做GrowID唯一性校验 - 频繁读写JSON文件在用户量大的时候会有性能问题,后续可以考虑换成SQLite之类的轻量数据库优化
内容的提问来源于stack exchange,提问作者Xiao Poor
相关产品推荐
相关产品推荐

