如何在Kraken非标准JSON中检测指定交易对是否存在
Kraken API交易对名称不匹配及存在性检测问题解决
问题背景
用PHP的curl请求Kraken的OHLC接口时,会碰到一个坑:请求URL里的交易对简称(比如ETHAED),和返回JSON中result字段下的实际键名(比如XETHZAED)不一致,导致原本的存在性检测代码失效,直接通过简称访问数据也拿不到结果。
核心原因
Kraken API对交易对有专属的命名规范:
- 加密货币通常加前缀
X(比如ETH→XETH) - 法币通常加前缀
Z(比如AED→ZAED) - 部分特殊币种(如BTC)前缀是
XXBT
所以请求时用的简化名,到返回结果里会变成带前缀的规范键名,两者不匹配自然无法直接访问。
解决方案
方案1:提前获取交易对映射表
先调用Kraken的AssetPairs接口,拿到所有交易对简化名与规范名的对应关系,之后就能通过简化名快速找到对应的规范键名。
// 1. 获取所有交易对的映射关系 $pairCh = curl_init("https://api.kraken.com/0/public/AssetPairs"); curl_setopt($pairCh, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0'); curl_setopt($pairCh, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($pairCh, CURLOPT_RETURNTRANSFER, true); $pairResult = curl_exec($pairCh); curl_close($pairCh); $pairData = json_decode($pairResult, true); // 2. 构建简化名到规范名的映射数组 $pairMap = []; foreach ($pairData['result'] as $canonicalName => $pairInfo) { $pairMap[$pairInfo['altname']] = $canonicalName; } // 3. 用请求的简化名获取规范名并验证 $sName = "ETHAED"; $targetName = $pairMap[$sName] ?? null; if ($targetName && isset($obj['result'][$targetName])) { echo "Found " . $sName . " (规范名: " . $targetName . ")<br>"; // 获取OHLC数据 $ohlcData = $obj['result'][$targetName]; } else { echo "NOT FOUND<br>"; }
方案2:从返回结果中动态提取键名
如果每次请求只指定一个交易对,result字段下只会有一个键,直接提取这个键即可:
$sName = "ETHAED"; $resultKeys = array_keys($obj['result']); if (!empty($resultKeys)) { $canonicalName = $resultKeys[0]; echo "Found " . $sName . " (规范名: " . $canonicalName . ")<br>"; $ohlcData = $obj['result'][$canonicalName]; } else { echo "NOT FOUND<br>"; }
原代码失效的原因
- 检测位置错误:
in_array($sName, $obj)是在整个$obj数组的值里查找,但交易对是$obj['result']下的键,位置完全不对。 - 名称不匹配:就算把检测位置改成
$obj['result'],因为用的是简化名而非返回的规范名,依然找不到对应的键。
内容的提问来源于stack exchange,提问作者Marco Carli Ballola
相关产品推荐
相关产品推荐

