请求正文方法 PATCH 覆盖给出错误"attributes missing"



我正在尝试通过他们的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)

注:

  • 这个修改后的脚本假设editBotsbotParamskeysecret是正确的值

我无法对此进行测试。所以,当这不起作用时,我道歉。届时,您能否提供响应值的详细信息?

编辑1:

在该修改中,JSON.stringify()仅用于作为对象的pairsstrategy_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 ? "&" : "");

相关内容

最新更新