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

如何在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>";
}

原代码失效的原因

  1. 检测位置错误:in_array($sName, $obj)是在整个$obj数组的值里查找,但交易对是$obj['result']下的键,位置完全不对。
  2. 名称不匹配:就算把检测位置改成$obj['result'],因为用的是简化名而非返回的规范名,依然找不到对应的键。

内容的提问来源于stack exchange,提问作者Marco Carli Ballola

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 16:30:45