gpt4 book ai didi

javascript - UrlFetchApp 请求在菜单功能中失败,但在自定义功能中没有(连接到外部 REST API)

转载 作者:行者123 更新时间:2023-12-04 02:33:10 25 4
gpt4 key购买 nike

我正在使用以下函数连接到外部 API (Binance),使用 Google Apps 脚本检索 JSON 数组(市场价格)。这个简单的查询 url 在浏览器中运行良好(不需要 API key ):

function getMyArray() {
var url ="https://api.binance.com/api/v3/ticker/price"; // works perfectly in browser
var params = {"method" : "get", "muteHttpExceptions":true };
var response = UrlFetchApp.fetch(url, params);
var array = JSON.parse(response.getContentText());

return array;
}

但是,当我尝试在 Google Apps 脚本中运行该函数时,情况就不同了:

  1. 脚本编辑器:在脚本编辑器中运行简单实用,但我遇到了 403 错误“请求被阻止”
  2. 菜单函数:从添加到电子表格 UI 的菜单项调用函数 => 相同的 403 错误
  3. 自定义函数:编辑任何单元格并键入 =getMyArray() => 请求有效,我可以使用 Logger 跟踪数组

为什么我的简单请求在从菜单或脚本编辑器调用时被阻止,是否可以更改?谢谢

最佳答案

当自定义函数和脚本编辑器使用UrlFetchApp时,我认为区别在于是否使用IPv6,而每次运行时IPv4的地址都会改变。在这种情况下,脚本编辑器和自定义菜单的结果是相同的。我认为这可能是您遇到问题的原因。但我不确定我的猜测是否正确。因此,在这个答案中,我想提出以下解决方法。

  1. 使用脚本将公式 =getMyArray() 放入单元格。
    • 由此,将值检索到单元格。
  2. 使用脚本从单元格中检索值。
  3. 清除看跌公式。

通过这个流程,我认为你的目标可以实现。

示例脚本如下。

示例脚本:

在此脚本中,作为测试,=getMyArray() 被放入事件工作表上的单元格“A1”,并从单元格中检索值。当您使用它时,请在脚本编辑器和自定义菜单中运行函数main()。通过这种方式,可以将值检索到 array

function getMyArray() {
var url = "https://api.binance.com/api/v3/ticker/price";
var params = {"method": "get", "muteHttpExceptions": true};
var response = UrlFetchApp.fetch(url, params);
return response.getContentText();
}

// Please run this function by the script editor and the custom menu.
function main() {
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getRange("A1");
range.setFormula("=getMyArray()");
SpreadsheetApp.flush();
var value = range.getValue();
range.clearContent();
var array = JSON.parse(value);
console.log(array)
}

引用资料:

添加:

https://httpbin.org/get 的响应值如下。

用于测试的示例脚本:

function sample() {
var url = "https://httpbin.org/get";
var res = UrlFetchApp.fetch(url);
console.log(res.getContentText())
return res.getContentText();
}

结果:

模式 1. 使用脚本编辑器运行脚本。
{
"args": {},
"headers": {
"Accept-Encoding": "gzip,deflate,br",
"Host": "httpbin.org",
"User-Agent": "Mozilla/5.0 (compatible; Google-Apps-Script; beanserver; +https://script.google.com; id: ###)",
"X-Amzn-Trace-Id": "Root=###"
},
"origin": "### IPV6 ###, ### IPV4 ###", // or "### IPV4 ###, ### IPV4 ###"
"url": "https://httpbin.org/get"
}
  • 当您使用 IPV6 时,origin"### IPV6 ###, ### IPV4 ###"。但是当你使用 IPV4 时,origin"### IPV4 ###, ### IPV4 ###"
  • 在这种情况下,无法从 https://api.binance.com/api/v3/ticker/price 检索到正确的值。
模式 2. 脚本使用自定义函数运行。

在这种情况下,=sample() 被放入单元格并检索值。

{
"args": {},
"headers": {
"Accept-Encoding": "gzip,deflate,br",
"Host": "httpbin.org",
"User-Agent": "Mozilla/5.0 (compatible; Google-Apps-Script; beanserver; +https://script.google.com; id: ###)",
"X-Amzn-Trace-Id": "Root=###"
},
"origin": "### IPV4 ###",
"url": "https://httpbin.org/get"
}
  • 在这种情况下,可以从 https://api.binance.com/api/v3/ticker/price 检索正确的值。
模式 3. 脚本使用 OnEdit 事件触发器运行。

UrlFetchApp与自定义函数一起使用时,不需要授权。但是当 UrlFetchApp 与 OnEdit 事件触发器一起使用时,授权需要安装触发器。我认为此授权可能会出现此问题。所以我比较了这个。

UrlFetchApp 与可安装的 OnEdit 事件触发器一起使用时,将检索以下结果。

{
"args": {},
"headers": {
"Accept-Encoding": "gzip,deflate,br",
"Host": "httpbin.org",
"User-Agent": "Mozilla/5.0 (compatible; Google-Apps-Script; beanserver; +https://script.google.com; id: ###)",
"X-Amzn-Trace-Id": "Root=###"
},
"origin": "### IPV4 ###",
"url": "https://httpbin.org/get"
}
  • 此结果与上述模式2相同。
  • 在这种情况下,可以从 https://api.binance.com/api/v3/ticker/price 检索正确的值。

结果:

  • 包含 User-Agent 的 header 对于所有模式都是相同的。
  • 从模式2和模式3来看,与Google端的授权无关。
  • 检索带有 IPV4 的 WHOIS 时,会返回相同的结果。
    • origin"### IPV4 ###, ### IPV4 ###" 时,第二个 IPV4 为 Google 的 IP 地址。

从上面的结果来看,所有模式的不同之处在于origin的值是1还是2。

关于javascript - UrlFetchApp 请求在菜单功能中失败,但在自定义功能中没有(连接到外部 REST API),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63024346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com