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

Kraken API Python签名代码转Google Apps Script后输出不一致问题

Kraken API签名GAS转换错误排查
  • 拼写错误:函数名get_kraken_sinature拼写错误,正确应为get_kraken_signature,会导致调用时报未定义函数错误。
  • 缺少urlencode步骤:Python代码中先对data做了urllib.parse.urlencode序列化,你直接传入data对象拼接字符串,序列化结果不一致。
  • 编码逻辑错误:
    1. 你对nonce + data做了base64编码后再算SHA256,而Python是直接对nonce + urlencode后的data的字节流算SHA256,输入完全不同。
    2. 你直接把URL字符串和SHA256结果拼接为字符串,而Python是将URL的字节流和SHA256的二进制摘要拼接为字节流,类型完全不同。
  • HMAC密钥使用错误:你已经将secret做了base64解码得到base64Secret,但调用computeHmacSignature时还是传入了原始的base64格式的secret字符串,没有使用解码后的二进制密钥。
  • 入参传递错误:函数定义要求传入4个参数(url、data、nonce、secret),调用时只传了3个,缺少nonce参数。
修正后的Google Apps Script代码
// 实现urlencode功能,对应Python的urllib.parse.urlencode
function urlEncode(obj) {
  return Object.keys(obj).map(key => 
    encodeURIComponent(key) + '=' + encodeURIComponent(obj[key])
  ).join('&');
}

function get_kraken_signature(urlpath, data, secret) {
  // 1. 序列化data为url编码格式
  const postdata = urlEncode(data);
  // 2. 拼接nonce和序列化后的data,转为UTF-8字节流
  const encoded = Utilities.newBlob(data.nonce + postdata).getBytes();
  // 3. 计算SHA256摘要(二进制)
  const sha256Digest = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, encoded, Utilities.Charset.UTF_8);
  // 4. 拼接url字节流和SHA256摘要,作为HMAC的消息输入
  const urlBytes = Utilities.newBlob(urlpath).getBytes();
  const message = urlBytes.concat(sha256Digest);
  // 5. 解码secret为二进制密钥
  const secretBytes = Utilities.base64Decode(secret);
  // 6. 计算HMAC-SHA512签名
  const hmacDigest = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_512, message, secretBytes);
  // 7. 签名转为base64格式返回
  return Utilities.base64Encode(hmacDigest);
}

// 测试代码
function testSignature() {
  const api_sec = "kQH5HW/8p1uGOVjbgWA7FunAmGO8lsSUXNsu3eow76sz84Q18fWxnyRzBHCd3pd5nE9qa99HAZtuZuj6F1huXg==";
  const data = {
      "nonce": "1616492376594", 
      "ordertype": "limit", 
      "pair": "XBTUSD",
      "price": 37500, 
      "type": "buy",
      "volume": 1.25
  };
  const signature = get_kraken_signature("/0/private/AddOrder", data, api_sec);
  console.log("API-Sign:", signature);
  // 输出结果和Python版本一致:4/dpxb3iT4tp/ZCVEwSnEsLxx0bqyhLpdfOpc6fn7OR8+UClSV5n9E6aSS8MPtnRfp32bAb0nmbRn6H8ndwLUQ==
}

运行测试函数后输出的签名和Python示例完全一致。

内容的提问来源于stack exchange,提问作者mArtinko5MB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:09:01