我正在尝试通过其API和Google Apps脚本更新名为3Commas的服务上的交易机器人。我正在尝试根据某些条件不时更新其使用的对(BTC_ETH,BTC_MANA等)。此刻,我迷失了为什么呼叫中未读取有效负载信息的原因。
最初,我尝试了一个失败的查询字符串。通过阅读,我发现请求正文最适合POST / PUT操作。因此,我现在正在尝试使用请求正文。呼叫是通过PATCH。据我所读,您需要使用POST方法和GAS中PATCH的标头替代。我已经将所有强制性参数包括在“ botParams”中。这是3个逗号的文档:3commas
感谢您的帮助。
try {
var editBots = "/ver1/bots/250549/update";
var baseUrl = "https://3commas.io";
var endPoint = "/public/api"+editBots+"?";
var botParams = {
"name": "cqstoshi",
"pairs": ["BTC_MANA","BTC_TRX","BTC_WAN"],
"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": 2,
"active_safety_orders_count": 1,
"safety_order_step_percentage": 2.5,
"take_profit_type": "total",
"strategy_list": [{"strategy":"cqs_telegram"}],
"bot_id": 250549
};
var payload = JSON.stringify(botParams)
var totalParams = endPoint + payload;
Logger.log(totalParams)
var signature = Utilities.computeHmacSha256Signature(totalParams, secret);
signature = signature.map(function(e) {return ("0" + (e < 0 ? e + 256 : e).toString(16)).slice(-2)}).join("");
//headers
var headers = {
'APIKEY': key,
'Signature': signature,
"X-HTTP-Method-Override": "PATCH"
};
var params = {
'method': 'POST',
'headers': headers,
'payload' : payload,
muteHttpExceptions: true
};
//call
var data = UrlFetchApp.fetch(baseUrl + endPoint, params).getContentText();
var json = JSON.parse(data);
Logger.log(json)
} catch (err) {Logger.log(err)}
//This is a logger report and the error I am currently receiving:
//Logger
[19-01-24 15:00:45:304 EST]
/public/api/ver1/bots/250549/update?
{"name":"cqstoshi",
"pairs":["BTC_MANA","BTC_TRX","BTC_WAN"],
"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":2,
"active_safety_orders_count":1,
"safety_order_step_percentage":2.5,
"take_profit_type":"total",
"strategy_list":[{"strategy":"cqs_telegram"}],"bot_id":250549}
//Error
[19-01-24 15:00:45:608 EST]
{error_attributes={base_order_volume=[is missing],
safety_order_volume=[is missing],
martingale_volume_coefficient=[is missing],
strategy_list=[is missing],
take_profit=[is missing],
max_safety_orders=[is missing],
martingale_step_coefficient=[is missing],
active_safety_orders_count=[is missing],
name=[is missing],
take_profit_type=[is missing, does not have a valid value],
safety_order_step_percentage=[is missing],
pairs=[is missing]},
error_description=Invalid parameters,
error=record_invalid}
答案 0 :(得分:1)
此修改如何?
botParams
用于查询参数和请求正文。botParams
作为查询参数时,需要转换为查询参数。'method': 'POST',
,该请求成为POST方法。当以上几点反映到您的脚本中时,它如下所示。
在此修改后的脚本中,请求botParams
作为查询参数。
var editBots = "/ver1/bots/250549/update";
var baseUrl = "https://3commas.io";
var endPoint = "/public/api"+editBots+"?";
var botParams = {
"name": "cqstoshi",
"pairs": ["BTC_MANA","BTC_TRX","BTC_WAN"],
"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": 2,
"active_safety_orders_count": 1,
"safety_order_step_percentage": 2.5,
"take_profit_type": "total",
"strategy_list": [{"strategy":"cqs_telegram"}],
"bot_id": 250549
};
var keys = Object.keys(botParams); // Added
var totalParams = keys.reduce(function(q, e, i) { // Added
q += e + "=" + encodeURIComponent(JSON.stringify(botParams[e])) + (i != keys.length - 1 ? "&" : ""); // Modified
return q;
}, endPoint);
Logger.log(totalParams)
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 = { // Modified
'APIKEY': key,
'Signature': signature,
};
var params = { // Modified
'method': 'PATCH',
'headers': headers,
muteHttpExceptions: true
};
var data = UrlFetchApp.fetch(baseUrl + totalParams, params).getContentText(); // Modified
var json = JSON.parse(data);
Logger.log(json)
editBots
,botParams
,key
和secret
是正确的值。我无法测试。因此,如果这样做不起作用,我深表歉意。那时,您可以提供响应值的详细信息吗?
在此修改中,JSON.stringify()
仅用于作为对象的pairs
和strategy_list
。这样,其他值不会被双引号引起来。
q += e + "=" + encodeURIComponent(JSON.stringify(botParams[e])) + (i != keys.length - 1 ? "&" : ""); // Modified
q += e + "=" + (typeof botParams[e] == "object" ? encodeURIComponent(JSON.stringify(botParams[e])) : encodeURIComponent(botParams[e])) + (i != keys.length - 1 ? "&" : "");
尽管我不确定API的规格,您可以尝试这种修改吗?是pairs=BTC_MANA&pairs=BTC_TRX&pairs=BTC_WAN
。对于botParams
,请不要从"pairs": ["BTC_MANA","BTC_TRX","BTC_WAN"],
进行修改。
要对此进行测试,请按如下所示修改q +=...
的行。
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 ? "&" : "");