【问题标题】:API call from google sheets is too long来自谷歌表格的 API 调用太长
【发布时间】:2021-08-10 03:12:22
【问题描述】:

我正在尝试在 google 表格中编写一个脚本来更新我的 3commas 机器人。 API 要求传递许多必填字段,即使只有一项需要更新。

我的代码如下,它使用已经从平台读取的值,仅更新 base_order_volume 值。这非常有效,除非pairs值很长(超过2k个字符),然后我从UrlFetchApp调用中收到错误,因为URL太长了。

var sheet = SpreadsheetApp.getActiveSheet();

var key = sheet.getRange('F4').getValue();
var secret = sheet.getRange('F5').getValue();

var baseUrl = "https://3commas.io"; 
var editBots = "/ver1/bots/"+bots[botCounter].id+"/update";
var patchEndPoint = "/public/api"+editBots+"?";

.
.
[loop around values in sheet]
.
.

var BaseOrder=Number(sheet.getRange(rowCounter,12).getValue().toFixed(2));

var botParams = {
            "name": bots[botCounter].name,
            "pairs": bots[botCounter].pairs,
            "max_active_deals": bots[botCounter].max_active_deals,
            "base_order_volume": BaseOrder,
            "take_profit": Number(bots[botCounter].take_profit),
            "safety_order_volume": bots[botCounter].safety_order_volume,
            "martingale_volume_coefficient": bots[botCounter].martingale_volume_coefficient,
            "martingale_step_coefficient": Number(bots[botCounter].martingale_step_coefficient),
            "max_safety_orders": bots[botCounter].max_safety_orders,
            "active_safety_orders_count": Number(bots[botCounter].active_safety_orders_count),
            "safety_order_step_percentage": Number(bots[botCounter].safety_order_step_percentage),
            "take_profit_type": bots[botCounter].take_profit_type,
            "strategy_list": bots[botCounter].strategy_list,
            "bot_id": bots[botCounter].id
          };

var keys = Object.keys(botParams); 
var totalParams = keys.reduce(function(q, e, i) {
            q += e + "=" + encodeURIComponent(JSON.stringify(botParams[e])) + (i != keys.length - 1 ? "&" : ""); 
            return q;
          },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,
          };

try {
            var params = { 
              'method': 'PATCH',
              'headers': headers,
              'muteHttpExceptions': true
            };

var response = JSON.parse(UrlFetchApp.fetch(baseUrl + totalParams, params).getContentText());

我尝试将 botParams 设置为参数中的有效负载,但是当我这样做时签名不正确。

我任何人都知道如何使用工作表来使用大量参数进行调用,如果有任何帮助,我将不胜感激

bots 数组的一些示例数据是

{
"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"}]
}

提前致谢

【问题讨论】:

  • 我发现这篇文章有一个脚本,可以传递有效负载中的值,这正是我所需要的,但它错误地说签名无效。 stackoverflow.com/questions/54495794/…
  • 我从your commentthis answer 注意到你的这个问题。在您的脚本中,您能否提供bots 的示例值来检查值?当然,请用其他字符替换您的个人信息。
  • 您好,感谢您的回复!作为测试,我一直在使用另一篇文章中的值。您在另一篇文章中提到操作员说答案有效,但我无法继续。我不断收到和签名无效错误在上面的脚本中所做的是从平台中提取 botParams 的值,只需更改一个项目,然后调用 api 来更新机器人
  • 感谢您的回复。我不得不为我糟糕的英语水平道歉。不幸的是,从您的回复中,我无法理解bots 的样本值和您目前的情况。但是,我想试着理解它。当我能正确理解它并找到解决方案时,我想回答它。非常抱歉,我无法尽快解决您的问题。
  • 嗨,我已经用示例数据更新了这个问题,但这非常有效,因为传递数据不会使 URL 太长。我想我需要将传入的值移动到参数并仍然成功创建签名

标签: api google-sheets


【解决方案1】:

我会考虑使用云函数来完成繁重的工作,或者,如果您担心成本,可以将其用作代理。然后,您可以从 Google 表格调用云功能。 Cloud Functions 可以用您最熟悉的任何语言编写,包括 Node。

查看GCP pricing calculator 了解费用。在许多情况下,它是完全免费的。

这应该让您了解如何使用云函数创建 CSV:

https://codelabs.developers.google.com/codelabs/cloud-function2sheet#0

Here 是一个 SO 问题,其答案解释了如何通过身份验证查询云功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 2017-06-11
    • 2017-11-28
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 2013-04-20
    相关资源
    最近更新 更多