使用Fortnite Tracker API拉取近期对局数据失败的PHP求助
排查Fortnite Tracker API无法拉取近期对局数据的问题
我来帮你一步步排查这个问题,结合Fortnite Tracker API的特性和你的PHP代码情况,可能有以下几个常见原因和解决办法:
1. 首先确认API端点是否用错
你当前调用的/v1/profile/psn/mygamertag端点,仅返回用户的整体统计数据(比如总击杀、胜率等),并不包含近期对局记录。要获取近期对局,需要调用专门的Matches端点:
https://api.fortnitetracker.com/v1/matches/psn/mygamertag
2. 检查API Key的请求头是否正确配置
Fortnite Tracker API强制要求携带TRN-Api-Key请求头,很多人会遗漏这一步或者使用无效的Key。你的代码片段里没看到相关配置,这大概率是核心问题之一。正确的curl请求头设置应该是:
curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'TRN-Api-Key: 你的API密钥', 'Accept: application/json' ));
注意:API Key需要在Fortnite Tracker开发者平台申请,确保Key未过期、未被禁用,且调用次数未超限(免费版有请求频率限制)。
3. 补全curl的必要配置
你的代码片段里curl_setopt未写完,需要确保开启CURLOPT_RETURNTRANSFER(让curl返回响应内容而不是直接输出),同时建议添加错误检查:
// 开启返回响应内容 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 可选:生产环境建议开启SSL验证,开发阶段可临时关闭(不推荐) // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 执行请求后检查错误 $response = curl_exec($ch); if(curl_errno($ch)){ echo "Curl请求错误: " . curl_error($ch); exit; } // 检查HTTP状态码,快速定位问题 $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch);
4. 验证响应内容与JSON解析
拿到响应后,先直接输出原始内容,确认API返回的是预期数据还是错误信息:
echo $response;
常见的错误状态码对应问题:
401:API Key无效或未设置404:游戏ID或平台参数错误429:请求频率超限200:请求成功,但可能返回空的对局数组(比如用户近期无对局)
如果返回的是JSON,要确保正确解析并检查matches字段是否存在:
$data = json_decode($response, true); if(json_last_error() !== JSON_ERROR_NONE){ echo "JSON解析错误: " . json_last_error_msg(); exit; } // 检查对局数据是否存在 if(isset($data['matches']) && !empty($data['matches'])){ // 处理并导出对局数据 file_put_contents('recent_matches.json', json_encode($data['matches'], JSON_PRETTY_PRINT)); } else { echo "未获取到近期对局数据,可能用户暂无对局或API结构变更"; }
完整修正后的示例代码
<?php $apiKey = '你的TRN API密钥'; $gamertag = 'mygamertag'; $platform = 'psn'; // 调用正确的对局数据端点 $url = "https://api.fortnitetracker.com/v1/matches/{$platform}/{$gamertag}"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "TRN-Api-Key: {$apiKey}", "Accept: application/json" ]); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $error = curl_error($ch); curl_close($ch); // 排查请求错误 if ($error) { die("Curl请求失败: {$error}"); } // 根据HTTP状态码处理结果 switch ($httpCode) { case 200: $data = json_decode($response, true); if (json_last_error() !== JSON_ERROR_NONE) { die("JSON解析失败: " . json_last_error_msg()); } if (isset($data['matches']) && !empty($data['matches'])) { file_put_contents('recent_matches.json', json_encode($data['matches'], JSON_PRETTY_PRINT)); echo "近期对局数据已成功导出"; } else { echo "该用户暂无近期对局记录"; } break; case 401: die("权限验证失败:请检查你的API Key是否正确"); case 404: die("用户不存在:请确认平台和游戏ID是否正确"); case 429: die("请求超限:请稍后再试,或升级API套餐"); default: die("请求失败,状态码: {$httpCode},响应内容: {$response}"); } ?>
内容的提问来源于stack exchange,提问作者Matt Hutch
相关产品推荐
相关产品推荐

