【问题标题】:Cryptopia API in Google Sheets (Google Apps Script)Google 表格中的 Cryptopia API(Google Apps 脚本)
【发布时间】:2017-12-19 16:05:12
【问题描述】:

为了继续使用 Google Apps 脚本构建 Google SpreadSheet,我已经完成了获取 Bittrex 和 Poloniex 余额的工作,但无法使用 Cryptopia。

这是我与 Bittrex Map JSON objects array to strings 斗争的链接

这里是官方API链接:https://www.cryptopia.co.nz/Forum/Thread/256

这里有一些例子:

  1. https://www.cryptopia.co.nz/Forum/Thread/262
  2. https://github.com/Coac/cryptopia.js/blob/master/index.js
  3. https://github.com/sigwo/node-cryptopia/blob/master/cryptopia.js

这是我的代码,出现“无效的授权标头”错误:

// Get Cryptopia balances
  var key = keys.getRange("B4").getValue();
  var secret = keys.getRange("C4").getValue();
  var baseUrl = 'https://www.cryptopia.co.nz/api/';

  var command = "GetBalance";    
  var url = baseUrl + command;

  var signature = key + "POST" + encodeURIComponent(url).toLowerCase() + nonce;
  var hmacsignature = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_256,signature,secret);

  var header_value = "amx " + key + ":" + hmacsignature + ":" + nonce;
  var headers = { 'Authorization': header_value, 'Content-Type':'application/json; charset=utf-8' };

  var options = {
    method: 'POST',
    headers: headers
  };

  var response = UrlFetchApp.fetch("https://www.cryptopia.co.nz/api/GetBalance", options);
  var json = JSON.parse(response.getContentText());
}

【问题讨论】:

    标签: authentication google-apps-script authorization


    【解决方案1】:

    从您的示例链接中,hmacsignature 似乎是由 base64 编码的。那么下面的修改呢?

    发件人:

    var hmacsignature = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_256,signature,secret);
    

    收件人:

    var hmacsignature = Utilities.base64Encode(Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_256,signature,secret));
    

    注意:

    • 是否声明了nonce?如果您尚未声明它,您可以使用以下脚本。
      • var nonce = Math.floor(new Date().getTime() / 1000);

    我无法对此进行测试。所以我不知道这是否工作正常。如果这不起作用,我很抱歉。

    编辑:

    这个怎么样? var params = {}; 可能是必需的,即使没有请求参数。所以我添加了这个和Content-Length。然后,secret 是用 base64 编码的吗?我认为它可能是由其他脚本编码的。

    var key = keys.getRange("B4").getValue();
    var secret = keys.getRange("C4").getValue();
    var nonce = Math.floor(new Date().getTime() / 1000); // Added
    var params = {}; // Added
    var baseUrl = 'https://www.cryptopia.co.nz/api/';
    var command = "GetBalance";
    var url = baseUrl + command;
    var requestContentBase64String = Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, JSON.stringify(params), Utilities.Charset.UTF_8)); // Added
    var signature = key + "POST" + encodeURIComponent(url).toLowerCase() + nonce + requestContentBase64String; // Modified
    var hmacsignature = Utilities.base64Encode(Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_256, signature, Utilities.base64Decode(secret), Utilities.Charset.UTF_8)); // Modified
    var header_value = "amx " + key + ":" + hmacsignature + ":" + nonce;
    var headers = {
      "Authorization": header_value,
      "Content-Type": 'application/json; charset=utf-8',
      "Content-Length" : Utilities.newBlob(JSON.stringify(params)).getBytes().length // Added
    };
    var options = {
      method: 'POST',
      headers: headers
    };
    var response = UrlFetchApp.fetch(url, options);
    var json = JSON.parse(response.getContentText());
    

    【讨论】:

    • 现在它返回 401 错误,这意味着未授权,但我提供了正确的密钥和秘密。
    • @Sergey Sypalo 感谢您的回复。对不起给您带来不便。错误信息是否改变了?我无法对此进行测试。所以我想从示例链接中考虑这种情况。当我提出下一次修改时,我会告诉你。我真的很抱歉我的技能不好。
    • Np,谢谢你的想法。我将尝试在 C# 中做同样的事情并使用启用调试运行。将某些工作结果与不工作的变量值逐一进行比较,看看有什么问题。
    • @Sergey Sypalo 我更新了我的答案。请证实。如果这不起作用,我很抱歉。如果错误信息有变化,请告诉我。
    • 再次感谢,现在看起来好多了,但仍然抱怨 Content-Length 值。所以我必须定义另一个变量 cl = Utilities.newBlob(JSON.stringify(params)).getBytes().length 并在标题中使用它。并且在运行调试脚本时,由于 cl 变量的值为“2.0”
    【解决方案2】:

    Utilities.computeHmacSignature(algorithm, value, key) 方法无法正确计算二进制输入。 valuekey参数的类型是String,但是Utilities.base64Decode的结果是Byte[]。原始二进制值在从Byte[] 转换为String 时发生变化。

    使用jsSHA,并参见。 https://stackoverflow.com/a/14007167.

    以下可用于计算正确的值,并通过正确的UrlFetchApp.fetchoptions获取结果。

    .... paste src/sha256.js contents ...
    
    ...  
    var params = {"Currency" : "BTC"};
    ...
    var sha = new jsSHA("SHA-256", "TEXT");
    sha.setHMACKey(secret, "B64");
    sha.update(signature);
    var hmacsignature = sha.getHMAC("B64");
    
    var header_value = "amx " + key + ":" + hmacsignature + ":" + nonce;
    var headers = {
      "Authorization" : header_value,
    };
    
    var options = {
      "contentType": 'application/json; charset=utf-8',
      "method": 'post',
      "headers": headers,
      "payload": JSON.stringify(params),
      "contentLength": JSON.stringify(params).length
    };
    
    var response = UrlFetchApp.fetch(url, options);
    var json = JSON.parse(response.getContentText());
    
    Logger.log(json);
    

    【讨论】:

      猜你喜欢
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多