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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:54:27