Преобразовать строку запроса в ошибку ответа тела запроса - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь преобразовать рабочую строку запроса в тело запроса и получаю сообщение об ошибке, что отсутствует атрибут.Я получил помощь от @Tanaike из другого поста, который предоставил функцию кодирования URI, которая разбивает параметры в закодированный формат.Однако, когда в моем параметре "pair" содержится 30-50 пар, в URLFetch возникает ошибка с ограничением длины строки запроса.Поэтому я пытаюсь отправить его как тело запроса.

var botParams = {
"name": "TestBot",
"base_order_volume": 0.001,
"take_profit": 1.5,
"safety_order_volume": 0.001,
"martingale_volume_coefficient": 2,
"martingale_step_coefficient": 1,
"max_safety_orders": 1,
"active_safety_orders_count": 1,
"safety_order_step_percentage": 2.5,
"take_profit_type": "total",
"stop_loss_percentage": 0,
"cooldown": 0,
"pairs": [
  "BTC_ADA",
  "BTC_TRX"
],
"trailing_enabled":"true",
"trailing_deviation":0.5,
"strategy_list": [
  {
    "strategy":"cqs_telegram"
  }
]
  };    

  try {

//    var totalParams = keys.reduce(function(q, e, i) {
//      q += (e == "pairs" ? botParams[e].reduce(function(s, f, j) {
//        s += e + "[]=" + f + (j != botParams[e].length - 1 ? "&" : "");
//        return s;
//      },"") : e + "=" + (typeof botParams[e] == "object" ? 
//encodeURIComponent(JSON.stringify(botParams[e])) : 
//encodeURIComponent(botParams[e]))) + (i != keys.length - 1 ? "&" : "");
//      return q;
//    }, endPoint); //Thanks to Tanaike


//Call
//Base
var baseUrl = "https://3commas.io";        
//Total Endpoint
var endPoint = "/public/api/ver1/bots/274339/update?";


//Convert Bot Params + endPoint to Encoded URI
var keys = Object.keys(botParams);
var totalParams = keys.reduce(function(q, e, i) {
  q += e + "=" + (typeof botParams[e] == "object" ? encodeURIComponent(JSON.stringify(botParams[e])) : encodeURIComponent(botParams[e])) + (i != keys.length - 1 ? "&" : "");
  Logger.log(encodeURIComponent(botParams[e]))
  return q;
},endPoint);

Logger.log(totalParams)   

//Create Signature
var signature = Utilities.computeHmacSha256Signature(totalParams, secret);    
//Convert from byte
signature = signature.map(function(e) {return ("0" + (e < 0 ? e + 256 : e).toString(16)).slice(-2)}).join("");

var headers = {
  "APIKEY": key,
  "Signature": signature,
};
var params = {
  "method": "PATCH",
  "headers": headers,     
  "payload" : totalParams,
  //Show full exceptions      
   muteHttpExceptions: true
};  

var finalURL = baseUrl + "/public/api/ver1/bots/274339/update";

Logger.log(finalURL)
//https://3commas.io/public/api/ver1/bots/274339/update

// Call final URL with params
var data = UrlFetchApp.fetch(finalURL, params).getContentText();
var json = JSON.parse(data);
Logger.log(json)
  } catch (err) {Logger.log(err)}
}

Текущая ошибка, которую я получаю, {error_attributes={name=[is missing]}, error_description=Invalid parameters, error=record_invalid} Так что по какой-то причине он не распознает мой атрибут имени.Когда я регистрирую результаты, я вижу, что имя передается в виде строки.

Зарегистрированные результаты: /public/api/ver1/bots/274339/update?name=TestBot&base_order_volume=0.001&take_profit=1.5&safety_order_volume=0.001&martingale_volume_coefficient=2&martingale_step_coefficient=1&max_safety_orders=1&active_safety_orders_count=1&safety_order_step_percentage=2.5&take_profit_type=total&stop_loss_percentage=0&cooldown=0&pairs=%5B%22BTC_ADA%22%2C%22BTC_TRX%22%5D&trailing_enabled=true&trailing_deviation=0.5&strategy_list=%5B%7B%22strategy%22%3A%22cqs_telegram%22%7D%5D

Документы с 3 запятыми: https://github.com/3commas-io/3commas-official-api-docs/blob/master/bots_api.md#edit-bot-permission-bots_write-security-signed

Просто ищите предложения какк чему бы это могло быть.Спасибо.

РЕДАКТИРОВАТЬ: Для будущих читателей - В итоге я вернулся к методу строки запроса, найденному в первом посте, который я написал по этой теме Строка запроса PATCH 3 запятых и с помощью службы API URL сокращителя URL.Этот обходной путь позволил мне устранить ошибку ограничения длины URLFetch, которая была основной причиной, по которой я попробовал метод тела запроса. URL shortner Я использовал.Невероятно просто, просто используйте обычную выборку и верните ссылку.

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Я разобрался в проблеме.Как и предполагалось, это была проблема с кодировкой.Вот что получилось:

        var totalParams2 = keys.reduce(function(q, e, i) {
          q += (e == "pairs" ? botParams[e].reduce(function(s, f, j) {
            s += e + encodeURIComponent("[]")+"=" + f + (j != botParams[e].length - 1 ? "&" : "");            
            return s;
          },"") : e + "=" + (typeof botParams[e] == "object" ? encodeURIComponent(JSON.stringify(botParams[e])) : encodeURIComponent(botParams[e]))) + (i != keys.length - 1 ? "&" : "");
          return q;
        }, "");

Добавление e + encodeURIComponent("[]")+ специально из-за способа настройки API.Я должен был закодировать мой массив пар.

0 голосов
/ 03 февраля 2019

Я думаю, что в вашем случае botParams может потребоваться отправить как форму, в то время как параметры запроса должны быть созданы из botParams для создания подписи.Таким образом, модифицированный скрипт выглядит следующим образом.

Модифицированный скрипт:

var key = 'apikey';
var secret = 'apisecret';
var editBots = "/ver1/bots/274339/update";
var baseUrl = "https://3commas.io";
var endPoint = "/public/api"+editBots;
var botParams = {
  "name": "TestBot",
  "base_order_volume": 0.001,
  "take_profit": 1.5,
  "safety_order_volume": 0.001,
  "martingale_volume_coefficient": 2,
  "martingale_step_coefficient": 1,
  "max_safety_orders": 1,
  "active_safety_orders_count": 1,
  "safety_order_step_percentage": 2.5,
  "take_profit_type": "total",
  "stop_loss_percentage": 0,
  "cooldown": 0,
  "pairs": ["BTC_ADA", "BTC_TRX"],
  "trailing_enabled": "true",
  "trailing_deviation": 0.5,
  "strategy_list": [{"strategy": "cqs_telegram"}]
};
var keys = Object.keys(botParams);
var totalParams = keys.reduce(function(q, e, i) {return q += (e == "pairs" ? botParams[e].reduce(function(s, f, j) {return s += e + "=" + f + (j != botParams[e].length - 1 ? "&" : "")},"") : e + "=" + (typeof botParams[e] == "object" ? encodeURIComponent(JSON.stringify(botParams[e])) : encodeURIComponent(botParams[e]))) + (i != keys.length - 1 ? "&" : "")}, endPoint + "?");
var signature = Utilities.computeHmacSha256Signature(totalParams, secret);
signature = signature.map(function(e) {return ("0" + (e < 0 ? e + 256 : e).toString(16)).slice(-2)}).join("");
var headers = {
  'APIKEY': key,
  'Signature': signature,
};
var params = {
  method: 'PATCH',
  headers: headers,
  payload: Object.keys(botParams).reduce(function(o, e) {
    o[e] = typeof botParams[e] == "object" ? JSON.stringify(botParams[e]) : e;
    return o;
  }, {}),
  muteHttpExceptions: true
};
var data = UrlFetchApp.fetch(baseUrl + endPoint, params).getContentText();
Logger.log(data)

Примечание:

  • Я не уверен насчет спецификации API.Так что, если приведенный выше скрипт не сработал, можете ли вы задать следующие моменты менеджеру API?
    1. О "pairs": ["BTC_ADA", "BTC_TRX"], из botParams, в этом сценарии используется тот же процесс с созданием параметра запроса, что и pairs=BTC_ADA&pairs=BTC_TRX.Это правильно?
    2. Обязательно ли key и secret быть включены в botParams для создания signature?
    3. Обязательно ли key и secret должны быть включеныв полезной нагрузке?
    4. Требуются ли значения, превышающие 2 и 3?

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

Точка изменения:

От:
  payload: Object.keys(botParams).reduce(function(o, e) {
    o[e] = typeof botParams[e] == "object" ? JSON.stringify(botParams[e]) : e;
    return o;
  }, {}),
Кому:
  payload: Object.keys(botParams).reduce(function(o, e) {
    o[e] = typeof botParams[e] == "object" ? JSON.stringify(botParams[e]) : botParams[e];
    return o;
  }, {}),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...