我正在尝试通过他们的API和Google应用程序脚本更新名为3Commas的服务上的交易机器人程序。我正在尝试根据某些条件不时更新它使用的对(BTC_ETH、BTC_MANA等)。目前,我不知道为什么在调用中没有读取有效载荷信息。
最初我尝试了一个查询字符串,但失败了。通过阅读,我发现请求主体最适合POST/PUT操作。所以我现在用一个请求体来尝试它。通过PATCH进行呼叫。根据我所读到的内容,您需要在GAS中使用POST方法和PATCH的标头覆盖。我已经在"botParams"中包含了所有强制参数。以下是3commas文档: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}
这次修改怎么样?
修改要点:
- 在脚本中,
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
是正确的值
我无法对此进行测试。所以,当这不起作用时,我道歉。届时,您能否提供响应值的详细信息?
编辑1:
在该修改中,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 ? "&" : "");
编辑2:
虽然我不确定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 ? "&" : "");