PlayerDB API POST请求随机404及KeyError问题求助
解决PlayerDB API随机404及KeyError问题
问题根源
你遇到的随机404和KeyError: 'player',核心原因是错误使用了POST请求访问PlayerDB的查询API。这类用于获取玩家数据的接口遵循REST规范,应该使用GET请求;而POST请求可能触发服务端不同的路由处理逻辑,导致随机失败——手动点击链接时浏览器默认发送GET请求,所以能正常返回结果。
另外,代码中没有任何错误处理逻辑,一旦请求失败(返回的JSON中没有player字段),就会直接抛出KeyError;同时脚本末尾还有一段重复的无效代码,需要清理。
修复方案
1. 替换请求方法为GET
将requests.post改为requests.get,这是解决随机404的关键:
response = requests.get(baseurl + UUID)
2. 添加错误处理与安全取值
为了避免KeyError和处理临时请求失败,需要:
- 检查响应的
success字段判断请求是否成功 - 使用字典的
get方法安全获取嵌套字段,避免直接索引引发异常 - 捕获异常,确保单个UUID处理失败不影响整个循环
3. 清理冗余代码
删除脚本中第一个return语句之后的重复循环和代码,这部分永远不会被执行。
优化后的完整代码
import requests import json def getPlayerData(UUID_list): baseurl = "https://playerdb.co/api/player/minecraft/" player_names = [] icon_list = [] for UUID in UUID_list: try: # 使用GET请求替代POST response = requests.get(baseurl + UUID) print("url requested:", baseurl + UUID) print(response.status_code) responseObject = response.json() with open('responseObject.json', 'w') as f: json.dump(responseObject, f) # 先验证请求是否成功 if not responseObject.get('success'): error_code = responseObject.get('code', '未知错误') print(f"UUID {UUID} 请求失败,错误码:{error_code}") continue # 安全获取玩家数据,避免KeyError player_data = responseObject.get('data', {}).get('player') if not player_data: print(f"UUID {UUID} 未找到玩家数据") continue # 获取最后一次使用的名字 name_history = player_data.get('meta', {}).get('name_history', []) player_name = name_history[-1]['name'] if name_history else "未知玩家" player_names.append(player_name) # 获取头像链接 icon_link = player_data.get('avatar', "") icon_list.append(icon_link) except Exception as e: print(f"处理UUID {UUID} 时出错:{str(e)}") continue return player_names, icon_list # 测试用例 UUID_list = ['bf22088f-3d5b-45ef-b7dd-8d5bd3cdc310'] print(getPlayerData(UUID_list))
额外建议
- 可以添加请求头模拟浏览器请求,降低被服务端限制的概率:
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"} response = requests.get(baseurl + UUID, headers=headers) - 如果是批量处理UUID,建议添加1-2秒的延迟(
import time; time.sleep(1)),避免触发API的限流机制。
内容的提问来源于stack exchange,提问作者zoltan
相关产品推荐
相关产品推荐

