当前位置: 首页 > 知识库问答 >
问题:

谷歌表单中的Cryptopia API(谷歌应用程序脚本)

宋朝
2023-03-14

在继续使用GoogleApps脚本构建Google电子表格的过程中,我已经完成了获取Bittrex和Poloniex余额的工作,但无法使用Cryptopia。

下面是我与Bittrex将JSON对象数组映射到字符串的斗争的链接

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

以下是一些例子:

  1. https://www.cryptopia.co.nz/Forum/Thread/262

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

// 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());
}

共有2个答案

梁丘佑运
2023-03-14

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

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

以下内容可用于计算正确的值,并通过适当的UrlFetchApp.fetch选项获取结果。

.... 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);
竺焕
2023-03-14

从示例链接来看,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 = {};可能是必需的,即使没有请求参数。所以我添加了这个和内容长度。然后,秘密是由bas64编码的吗?我想它可能是由其他脚本编码的。

    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());
    

 类似资料:
  • 我想实现什么? 我想跟踪一个谷歌文档的审查状态与谷歌表单与下拉选项为"要做,进行中,完成"。我有谷歌表单项目作为"URL的文档,状态"。我已经创建了一个谷歌表单模板,我将使用它为各种用户创建表单。我希望能够创建模板表单的副本,并从谷歌应用程序脚本中设置预定义的"URL"值,以便用户只需选择文档的状态。 我试过什么? 我在这个答案中遇到了createResponse()方法,但这需要用于保存响应,并

  • 我希望每天凌晨1点从外部来源将一些数据输入到谷歌的工作表中。进口产品的数量将有所不同。 然后,我希望在数据上传完成后,按价格对数据进行排序,这将是凌晨1:05左右。 我看到它是可能的运行功能为谷歌工作表在一个时间的基础上。 我需要什么样的脚本来按价格对数据进行排序,所以最便宜的项目是每天早上运行脚本后的第2行。 要在Google Sheets中手动执行此操作,我会这样做-*突出显示第2行到数据,排

  • 我有一个谷歌电子表格,我用它创建了一个谷歌表单。电子表格有两张表:一张有表单响应,另一张有配置数据。电子表格附带了一个表单响应触发的应用程序脚本,该脚本使用配置数据进行API调用。这个脚本运行完全符合我的要求。 我已经编写了电子表格更改触发脚本,试图更新表单问题之一的选项。但是,使用FormApp。openById或FormApp。openByUrl因“您无权调用…”而失败。 是否有某种方法可以将

  • 我有一个正在写的剧本,需要一些帮助。 首先,我的脚本应该如何工作。 脚本:用户填写谷歌表单并点击提交。提交后,我的脚本运行并从google工作表中读取我在工作表中操作的一系列数据单元。然后将数据单元格格式化为字符串,并在表单的确认消息中提示。 现在问题来了。 问题:当我提交我对表格的回复时,从表格到表格的一切都很好。当我手动运行代码时,代码工作正常。当我提交表单响应时,事件历史记录会显示触发器并说

  • 我想使用谷歌应用程序脚本更新谷歌电子表格,并在我拥有的一系列日历发生更改时使用Gmail API发送电子邮件。 Google日历推送通知是否可以与Google App Script一起使用,或者是否需要其他某种平台? 我愿意学习任何必要的东西。我知道需要一个域名来接收通知。 我感谢你的帮助!

  • 此函数工作正常。当当前工作表不是Google表单响应工作表时。我正在使用(每分钟)触发器 图像:沙子数据(主数据)表至(共享数据1)表 我正在寻找一个,当用户提交的谷歌表格的状态是(支付),数据应该在第二页,这是(shareData1) 这里的问题是,当我使用谷歌表单响应表时,这个函数将不再工作。它显示了一个错误。错误图像 在降级的错误图像中,我手动运行此函数,相同的错误显示在AppScript面