我正在使用Google App脚本从网站请求API数据,然后记录我在Google表格中收到的数据。我遇到的问题是我要求数据的网站需要两件事:我的身份验证密钥和特定的(静态)IP地址。它会自动记录发出请求的IP地址,如果我使用错误的IP地址,它将不会让我获取数据。遗憾的是,Google App Script API请求使用了一系列动态IP,我只能允许最多5个不同的IP来使用我的身份验证密钥。有没有办法指定我的Google App Script用于发送API请求的IP地址?
下面你可以看到我的代码;当IP地址与我在网站上写的内容相符时,这一切都很有效,但如果它使用未知的IP地址则返回undefined。
function fetchAPI(tag) {
var url = 'https://myurl'
+ tag;
var token = {'muteHttpExceptions': true};
token.headers = {'Accept': 'application/json','authorization': 'my auth key'};
var response = UrlFetchApp.fetch(url, token);
return JSON.parse(response);
}
我想到的另一个选择是创建多个API密钥,每5个IP地址一个,但问题是Google的IP范围覆盖了数百个不同的地址:https://developers.google.com/apps-script/guides/jdbc#accessing
如果你能想到任何可能有用的东西,我们将不胜感激!或者,如果你能想出一种通过静态IP地址代理我的请求的方法(无需付钱托管我自己的网站),请告诉我!
答案 0 :(得分:1)
根据这个blog,作者在谷歌脚本中观察到ip使用模式:
有两个明确的观察结果:
- 在一个触发器中连续呼叫的IP可能会有所不同
- IP有明确的轮换,有时会有一组连续7次使用相同IP的呼叫,有时是6次。但总的来说 总是有团体。
因此可以使用重复调用服务器的解决方案,直到成功为止:
function batchRequest(userLogin, userPassword, webapiKey, resource, attributes, values ){
var token = requestToken(userLogin, userPassword, webapiKey ); // requestToken method uses UrlFetchApp.fetch
var result = request(resource, token, attributes, values);
/** requestToken method uses UrlFetchApp.fetch with options.muteHttpExceptions set to true so that we can read the response code **/
var i = 0;
while (result.getResponseCode() == 500 && i < 10){
token = requestToken(userLogin, userPassword, webapiKey ); // requestToken method uses UrlFetchApp.fetch
result = request(resource, token, attributes, values);
i++;
}
return result;
}
您可以根据最佳结果改变迭代次数。