0

我一直在尽力解释bitmex 对 api 连接的指示,但这就是我得到的全部:

function balanceBitmex() {

  var apiKey = '***';
  var apiSecret = '***';

  var verb = 'get';
  var path = '/api/v1/user/wallet';

  var expires = Number(new Date().getTime() +5).toFixed(0);
  var expires = expires.toString();


  var data = '';
  var data = JSON.stringify(data);
  var currency = '';
  var count= '';
  var concat = verb+path+expires+data;


  var apiSignature = Utilities.computeHmacSha256Signature(apiSecret, concat);
  apiSignature = apiSignature.map(function(e) {
      var v = (e < 0 ? e + 256 : e).toString(16);
      return v.length == 1 ? "0" + v : v;
  }).join("");


  var params = {
    'method': 'get',
    'headers': {'contentType': 'application/json',
                'api-expires': expires,
                'api-key': apiKey,
                'api-signature': apiSignature},
    'muteHttpExceptions': true
  };

  //var params = params + data;

  var url = "https://www.bitmex.com/api/v1/user/wallet?currency=XBt";

  var data = UrlFetchApp.fetch(url, params);
  var data = JSON.parse(data.getContentText());

我的脚本有什么问题? bitmex api explorer - 用户钱包

4

1 回答 1

1

该函数Utilities.computeHmacSha256Signature(String, String)接受两个参数,顺序如下:

  1. value:要为其生成哈希的输入值。
  2. key:用于生成哈希的密钥。

在您的情况下,您实际上是在加密apiSecret使用concat作为密钥。但是,它应该是相反的 -apiSecret应该是用于加密的密钥concat。你只需要改变:

var apiSignature = Utilities.computeHmacSha256Signature(apiSecret, concat);

对于以下内容:

var apiSignature = Utilities.computeHmacSha256Signature(concat, apiSecret);

此外,您可以使用以下代码计算BitMex 文档中提供的示例并验证它是否正常工作。

function testEncryption() {
  var apiSecret = 'chNOOS4KvNXR_Xq4k4c9qsfoKWvnDecLATCRlcBwyKDYnWgO';
  var verb = 'GET';
  var path = '/api/v1/instrument';
  var expires = 1518064236; 
  var data = '';

  var apiSignature = Utilities.computeHmacSha256Signature(verb + path + expires + data, apiSecret);
  apiSignature = apiSignature.map(function(e) {
      var v = (e < 0 ? e + 256 : e).toString(16);
      return v.length == 1 ? "0" + v : v;
  }).join("");

  Logger.log(apiSignature);
}

运行上述代码的结果是c7682d435d0cfe87c16098df34ef2eb5a549d4c5a3c2b1f0f77b8af73423bf00,这与 BitMex 文档中显示的结果相同。

关于您提供的代码,还有一些错误需要解决才能使 API 正常工作:

  1. 动词参数:您指定的参数是get,但 API 只接受此参数为大写 ( GET)。使用前者,签名将不同,从而使请求失败。
  2. path querystring:查询字符串(在您的请求的情况下currency=XBt)在计算签名时必须存在,但在您的代码中它不是(注意行var path = '/api/v1/user/wallet';

在修复上述所有错误并清理一些未使用的变量后,您的最终代码可能如下所示:

function balanceBitmex() {
  var apiKey = '***'
  var apiSecret = '***';

  var verb = 'GET';

  var path = '/api/v1/user/wallet?currency=XBt';

  var expires = Math.floor((Date.now() / 1000) + 600).toFixed(0);

  var concat = verb + path + expires;

  var apiSignature = Utilities.computeHmacSha256Signature(concat, apiSecret);
  apiSignature = apiSignature.map(function(e) {
      var v = (e < 0 ? e + 256 : e).toString(16);
      return v.length == 1 ? "0" + v : v;
  }).join("");

  var params = {
    'headers': {
      'api-expires': expires,
      'api-key': apiKey,
      'api-signature': apiSignature
    },
    'muteHttpExceptions': true
  };

  var url = "https://www.bitmex.com/api/v1/user/wallet?currency=XBt";

  var response = UrlFetchApp.fetch(url, params);
  var data = JSON.parse(response.getContentText());

  Logger.log(data);
}
于 2019-12-13T15:53:30.760 回答