App Script中的BTC-e API问题,方法参数

时间:2013-11-22 14:22:33

标签: api post google-apps-script urlfetch

我正在尝试将BTC-e.com API合并到Google文档电子表格中。

API文档位于:https://btc-e.com/api/documentation

  

方法名称通过POST参数方法发送。

由于 URLFetchApp 要求我通过参数方法将请求类型设置为POST,然后我将另一个名为method的参数设置为getInfo。

如何将fetch方法设置为POST并将API参数方法设置为getInfo。

以下是与此相关的功能。此外,我确信在我的工作中还有更多问题我还没有找到。

function inventory() {
  var nonce=Number(SpreadsheetApp.getActiveSheet().getRange('K2').getValue());
  var token=SpreadsheetApp.getActiveSheet().getRange('K1').getValue();
  var tokenEndpoint = "https://btc-e.com/tapi";
  var sign= 'TEMP'

  var head = {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Key': token,
    'Sign': sign

    }

  var params = {

    method : "POST",
    method : "getInfo",
    headers:  head,
    contentType: 'application/x-www-form-urlencoded',
    method : "getInfo",
    nonce: nonce

    }


  var request = UrlFetchApp.getRequest(tokenEndpoint, params); 
  var response = UrlFetchApp.fetch(tokenEndpoint, params); 
  var response2=String(response);
  SpreadsheetApp.getActiveSheet().getRange('K2').setValue(nonce+1);
  SpreadsheetApp.getActiveSheet().getRange('I16').setValue(response2);
  SpreadsheetApp.getActiveSheet().getRange('I17').setValue(nonce);

}

这只会产生错误

  

提供无效值的属性:方法

谢谢,

史蒂夫

PS:第一次发帖,我试图让格式正确。

2 个答案:

答案 0 :(得分:2)

我使用以下Google JavaScript函数对BTC-e进行POST访问。您可以在我为演示BTC-e API函数所做的example spreadsheet中找到此函数。

function btceHttpPost(keyPair, method, params, nonce) {

  if (keyPair === undefined) {
    return "{'error':'missing key pair'}"
  }

  if (params === undefined) {
    params = '';
  }

  // Cleanup keypair, remove all \s (any whitespace)
  var keyPair = keyPair.replace(/[\s]/g, '');

  // Keypair example: "AFE730YV-S9A4FXBJ-NQ12HXS9-CA3S3MPM-CKQLU0PG,96a00f086824ddfddd9085a5c32b8a7b225657ae2fe9c4483b4c109fab6bf1a7"
  keyPair = keyPair.split(',');
  var pubKey = keyPair[0];
  var privKey = keyPair[1];

  // As specified on the BTC-e api (https://btc-e.com/api/documentation) the 
  // nonce POST parameter must be an incrementing integer (>0). The easiest 
  // implementation is the use of a timestamp (TS), so there is no need 
  // for persistant storage. Preferable, the resolution of the TS should be 
  // small enough the handle the desired call-frequency (a sleep of the TS 
  // resolution can fix this but I don't like such a waste). Another 
  // consideration is the sizeof the nonce supported by BTC-e. Experiments 
  // revealed this is a 32 bit unsigned number. The native JavaScript TS, 
  // stored in a float, can be 53 bits and has a resolution of 1 ms. 

  if (nonce === undefined)  
    // This time stamp counts amount of 200ms ticks starting from Jan 1st, 2014 UTC
    // On 22 Mar 2041 01:17:39 UTC, it will overflow the 32 bits and will fail 
    // the nonce key for BTC-e
    var nonce = Math.floor((Date.now() - Date.UTC(2014,0)) / 200);

  // Construct payload message
  var msg = 'nonce=' + nonce + '&method=' + method + params;

  var msgSign = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_512, msg, privKey);

  // Convert encoded message from byte[] to hex string 
  for (var msgSignHex = [], i = 0; i < msgSign.length; i++) {
    // Doing it nibble by nibble makes sure we keep leading zero's
    msgSignHex.push(((msgSign[i] >>> 4) & 0xF).toString(16));
    msgSignHex.push((msgSign[i] & 0xF).toString(16));
  }
  msgSignHex = msgSignHex.join('');

  var httpHeaders = {'Key': pubKey, 'Sign': msgSignHex};
  var fetchOptions = {'method': 'post', 'headers': httpHeaders, 'payload': msg};

  var reponse = UrlFetchApp.fetch('https://btc-e.com/tapi', fetchOptions);
  return reponse.getContentText();
};

答案 1 :(得分:1)

问题与您的params对象有关。你有method在同一个对象中设置三次,这是一个混乱的来源。 接下来,请查看UrlFetchApp.fetch()https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app#fetch(String,Object))的文档。 method的值可以为post, get, delete, put

getInfo可能应附加到您的网址

var tokenEndpoint = "https://btc-e.com/tapi/getInfo"

根据文档,您还必须为请求,nonce,api密钥等添加更多参数。以此为出发点,重新访问文档,如果仍有问题则返回SO