无法产生 json 响应发出带参数的获取请求

Unable to produce json response issuing get requests with parameters

我正在尝试从 webpage 发出带有适当参数的 get http 请求获取 json 响应,但我得到 403 Forbidden 作为响应。当我在 python 中执行相同操作时,我会相应地得到所需的响应。但是,当我采用以下方法时出现问题:

function capterraScraper() {
  var Url = 'https://www.capterra.com/directoryPage/rest/v1/category';
  var params = {
      'htmlName': '360-degree-feedback-software',
      'rbr': 'false',
      'countryCode': 'BD'
  };
  var options = {
    'method' : 'GET',
    'params' : params,
    'headers' : {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
    }
  };
  var response = UrlFetchApp.fetch(Url, options);
  console.log(JSON.parse(response));
}

How can I make the script produce json response?

根据您的脚本,我认为 params 可能用作查询参数。我测试的时候确认可以获取到JSON数据。但是当我使用Google Apps Script测试URL时,我也确认了403 Forbidden的错误。幸运的是,当我使用Javascript访问URL时,可以获取JSON数据。因此,在这种情况下,作为一种解决方法,我想提出一种在 Google Apps 脚本端使用 JSON 数据的解决方法。

解决方法的流程如下。

  • 打开一个对话框。
  • 使用 Javascript 检索 JSON 数据,并将数据 return 发送到 Google Apps 脚本端。

由此,您可以在 Google Apps 脚本中使用 JSON 数据。

示例脚本:

请将以下脚本复制并粘贴到 Google 电子表格的脚本编辑器中,并在脚本编辑器中 运行 main()。这样,在 Google 电子表格中打开一个对话框并检索 JSON 数据,并且 return 数据到 Google Apps 脚本端。

function main(obj) {
  if (!obj) {
    var html = HtmlService.createHtmlOutput(`<script>fetch('https://www.capterra.com/directoryPage/rest/v1/category?' + (new URLSearchParams({htmlName: '360-degree-feedback-software',rbr: 'false',countryCode: 'BD'}))).then(response => response.json()).then(res => google.script.run.withSuccessHandler(google.script.host.close).main(res)).catch(err => console.log(err));</script>`);
    SpreadsheetApp.getUi().showModalDialog(html, "sample");
    return;
  }
  console.log(obj)
  DriveApp.createFile("sample.txt", JSON.stringify(obj));
}
  • 当此示例脚本为 运行 时,检索到的 JSON 数据将保存在根文件夹中的一个文件中。当然,你可以把数据设为obj.

  • 本脚本中的Javascript如下

      <script>
      fetch('https://www.capterra.com/directoryPage/rest/v1/category?' + (new URLSearchParams({htmlName: '360-degree-feedback-software',rbr: 'false',countryCode: 'BD'})))
      .then(response => response.json())
      .then(res => google.script.run.withSuccessHandler(google.script.host.close).main(res))
      .catch(err => console.log(err));
      </script>
    

注:

  • 此解决方法使用 Google 电子表格上的对话框。所以,不幸的是,在这种情况下,即使这个脚本是来自外部的 运行 和时间驱动的触发器,也无法使用该脚本。请注意这一点。

参考: