API криптобиржи Binance / ответ аккаунта 401

У меня проблемы с вызовом API криптобиржи Binance с моим скриптом из Google Sheet.

Я проверил обработку своей подписи с данными из примера https://www.binance.com/restapipub.html#user-content-signed-endpoint-security и у меня такая же подпись.

Я проверил свой ключ API и секрет на другом хабе (coinigy.com), ключи работают правильно.

Но я все еще получаю ошибку 401, выполняя скрипт сам ...

Служба поддержки Binance не отвечает.

Кто-нибудь может помочь?

function BinanceTest(key,secret) {
/*var randnumber=Math.random()*500;
Utilities.sleep(randnumber);*/
var baseURL = "https://api.binance.com";
var completeURL = baseURL + "/api/v3/account";
var timestamp=new Date().getTime();
var payload = "timestamp="+timestamp;
var signature = Utilities.computeHmacSha256Signature(payload, secret);
signature = signature.map(function(byte) {
  return ('0' + (byte & 0xFF).toString(16)).slice(-2);
}).join('');
completeURL=completeURL+"?"+payload+"&signature="+signature;
var params = {
  'method': 'get',
  'headers': {'X-MBX-APIKEY': key},
  'contentType': 'application/x-www-form-urlencoded',
  'muteHttpExceptions': true
};  
var response = fetchJSON(completeURL,params);
var servertime=fetchJSON("https://api.binance.com/api/v1/time").serverTime;
return [servertime,timestamp,payload,signature,JSON.stringify(params),completeURL,response];

};


function fetchJSON (url) {
  var randnumber=Math.random()*3000;
  Utilities.sleep(randnumber);
  try {
    var json = UrlFetchApp.fetch(url,{muteHttpExceptions: true })
    } catch (exception) {
      Logger.log(url+": "+exception)
      return 'exception'
    } 
  if ('undefined' == typeof(json))
    return 'Error retrieving JSON data'
  
  if (json.getResponseCode() != 200)
    return json.getResponseCode()
    
  json = json.getContentText()
  if (json.length<=0)
    return 'JSON data was invalid'

  try {
    json = JSON.parse(json)
  } catch (exception) {
    Logger.log(url+" "+exception)
    return "err2"
  }
  if ('undefined' == typeof(json) || json == null)
    // return 'err'
  return 'Quote data was malformed JSON data'

  return json
}


person Egorische    schedule 08.01.2018    source источник
comment
Вы можете рассказать нам о fetchJSON()?   -  person Tanaike    schedule 12.01.2018
comment
Спасибо за ответ, фрагмент был добавлен с этой функцией   -  person Egorische    schedule 12.01.2018
comment
Спасибо за ответ. Я выложил свой ответ. Пожалуйста, подтвердите.   -  person Tanaike    schedule 13.01.2018


Ответы (1)


Я думаю, что ваш сценарий почти правильный. Но причина ошибки fetchJSON(). fetchJSON() получает только url. Но var response = fetchJSON(completeURL,params); отправляет completeURL и params. Таким образом, fetchJSON() не получает params, и возникает ошибка. Так как насчет этой модификации?

Из :

var response = fetchJSON(completeURL,params);

To :

var response = UrlFetchApp.fetch(completeURL, params);

Примечание :

  • Если это изменение не помогло, удалите 'contentType': 'application/x-www-form-urlencoded', из params и повторите попытку.

Я не могу подтвердить, работают ли эти модификации. Итак, если это не сработало, вы можете сообщить мне сообщения об ошибках? Хочу доработать.

Редактировать :

Пожалуйста, попробуйте следующий пример сценария и сообщите мне ответ. Если возвращается ответ «информация о текущем счете», это означает, что скрипт работает.

  1. Скопируйте и вставьте следующий скрипт в свой редактор скриптов.
  2. Пожалуйста, введите свой ключ и секрет в пример скрипта.
  3. В редакторе скриптов Run -> Run function -> sample
  4. После завершения скрипта получите ответ через View -> Logs.

Образец :

function sample() {
  var key = "### your key ###";
  var secret = "### your secret ###";

  var baseURL = "https://api.binance.com";
  var completeURL = baseURL + "/api/v3/account";
  var timestamp=new Date().getTime();
  var payload = "timestamp="+timestamp;
  var signature = Utilities.computeHmacSha256Signature(payload, secret);
  signature = signature.map(function(byte) {
    return ('0' + (byte & 0xFF).toString(16)).slice(-2);
  }).join('');
  completeURL=completeURL+"?"+payload+"&signature="+signature;
  var params = {
    'method': 'get',
    'headers': {'X-MBX-APIKEY': key},
    'muteHttpExceptions': true
  };  
  var response = UrlFetchApp.fetch(completeURL, params);
  Logger.log(response.getContentText())
}
person Tanaike    schedule 13.01.2018
comment
Я получал ответ 401 с моим редактированием, я получаю его как сообщение об ошибке, и у меня есть пустой ответ после обоих ваших замечаний. - person Egorische; 13.01.2018
comment
@ Егорище Приносим извинения за неудобства. Я обновил свой ответ. Пожалуйста, подтвердите это и сообщите мне результат. - person Tanaike; 14.01.2018
comment
@ Егорище Добро пожаловать. И тебе спасибо. Если ваш вопрос был решен, нажмите кнопку принятия. Другие люди, у которых с вами возникла такая же проблема, также могут обосновать ваш вопрос вопросом, который можно решить. Если вы не найдете кнопку, не стесняйтесь сообщить мне. stackoverflow.com/help/accepted-answer - person Tanaike; 15.01.2018
comment
Я не могу найти эту кнопку извини - person Egorische; 15.01.2018
comment
@ Егорище Приносим извинения за неудобства. Вы можете узнать, как принять свой ответ, на странице https://meta.stackexchange.com/a/65088. - person Tanaike; 15.01.2018