从 python 转换为 Google 的 Kraken API 身份验证样本未返回相同的输出

Kraken API authentication sample converted from python to Google apps script is not returning the same output

我正在尝试将 python kraken API auth 转换为 Google 脚本以在 Google 电子表格中使用它,但没有成功。

# python sample    
def get_kraken_signature(urlpath, data, secret):

    postdata = urllib.parse.urlencode(data)
    encoded = (str(data['nonce']) + postdata).encode()
    message = urlpath.encode() + hashlib.sha256(encoded).digest()

    mac = hmac.new(base64.b64decode(secret), message, hashlib.sha512)
    sigdigest = base64.b64encode(mac.digest())
    return sigdigest.decode()

api_sec = "kQH5HW/8p1uGOVjbgWA7FunAmGO8lsSUXNsu3eow76sz84Q18fWxnyRzBHCd3pd5nE9qa99HAZtuZuj6F1huXg=="

data = {
    "nonce": "1616492376594", 
    "ordertype": "limit", 
    "pair": "XBTUSD",
    "price": 37500, 
    "type": "buy",
    "volume": 1.25
}

signature = get_kraken_signature("/0/private/AddOrder", data, api_sec)
print("API-Sign: {}".format(signature))
# prints API-Sign: 4/dpxb3iT4tp/ZCVEwSnEsLxx0bqyhLpdfOpc6fn7OR8+UClSV5n9E6aSS8MPtnRfp32bAb0nmbRn6H8ndwLUQ==

我最终得到了这个,但它没有返回相同的输出。

# google script sample from my sheet
function get_kraken_sinature(url, data, nonce, secret) {
  var message = url + Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, Utilities.base64Encode(nonce + data));
  var base64Secret = Utilities.base64Decode(secret);
  var mac = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_512, message, secret);
  return Utilities.base64Encode(mac);
}

signature = get_kraken_signature("/0/private/AddOrder", data, api_sec)
print("API-Sign: {}".format(signature))
# prints API-Sign: Jn6Zk8v41uvMWOY/RTBTrb7zhGxyAOTclFFe7lySodBnEnXErfJgIcQb90opFwccuKDd0Nt1l71HT3V9+P8pUQ==

两个代码示例应该做同样的事情,并且应该输出相同的 API-Sign 密钥。他们不在这个阶段,我想知道为什么会这样。

我相信你的目标如下。

  • 您想将 python 脚本转换为 Google Apps 脚本。
  • 在您的 Google Apps 脚本中,您已经确认用于请求的脚本可以正常工作。您想要将 python 脚本的 get_kraken_signature 转换为 Google Apps 脚本。

在这种情况下,下面的修改脚本怎么样?

修改后的脚本:

function get_kraken_sinature(url, data, nonce, secret) {
  var str = Object.entries(data).map(([k, v]) => `${k}=${v}`).join("&");
  var message = Utilities.newBlob(url).getBytes().concat(Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, nonce + str));
  var mac = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_512, message, Utilities.base64Decode(secret));
  return Utilities.base64Encode(mac);
}

// Please run this function.
function main() {
  const data = {
    "nonce": "1616492376594",
    "ordertype": "limit",
    "pair": "XBTUSD",
    "price": 37500,
    "type": "buy",
    "volume": 1.25
  };
  var url = "/0/private/AddOrder";
  var nonce = "1616492376594";
  var secret = "kQH5HW/8p1uGOVjbgWA7FunAmGO8lsSUXNsu3eow76sz84Q18fWxnyRzBHCd3pd5nE9qa99HAZtuZuj6F1huXg==";
  var res = get_kraken_sinature(url, data, nonce, secret);
  console.log(res)
}

参考文献: