在Google App脚本中请求API数据时,有没有办法使用特定的IP?

时间:2017-11-03 21:16:29

标签: javascript api google-apps-script

我正在使用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地址代理我的请求的方法(无需付钱托管我自己的网站),请告诉我!

1 个答案:

答案 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;
    }

您可以根据最佳结果改变迭代次数。