【问题标题】:How to download file from URL with a lot of redirects如何通过大量重定向从 URL 下载文件
【发布时间】:2020-10-31 10:54:08
【问题描述】:

我正在尝试使用 Apps 脚本 (JS) 将 XML 文件的内容从 URL 获取到 Google 表格

不幸的是,URL 有很多奇怪的重定向,我在服务器端对此没有影响。我需要在 JS 中处理它。在 Firefox 中我可以正常下载文件,但在 JS 中这是一个挑战。

几天来我一直在寻找解决方案,但没有任何帮助。 JS 就是无法获取文件内容。

网址:https://www.nife.pl/getfile-woocommerce/b55a488229b69d7c4ddf2a9f1a6b5dcb.xml

这些我都试过了:

  • Google 表格单元格中的默认 importXML 如下所示:

=importXml("https://www.nife.pl/getfile-woocommerce/b55a488229b69d7c4ddf2a9f1a6b5dcb.xml"; "//variant")

  • UrlFetchApp
function test(){
  var url = 'https://www.nife.pl/getfile-woocommerce/b55a488229b69d7c4ddf2a9f1a6b5dcb.xml';
  var xml = UrlFetchApp.fetch(url,{'followRedirects': true, 'muteHttpExceptions': true}).getContentText();
  var jsonV = XML_to_JSON(xml);
  Logger.log(jsonV);
}
  • XMLService

var xml = XmlService.parse('https://www.nife.pl/getfile-woocommerce/b55a488229b69d7c4ddf2a9f1a6b5dcb.xml',{'followRedirects': true, 'muteHttpExceptions': true});

  • 试过 followRedirects && muteHttpExceptions true 也试过 false

没有任何帮助。

知道如何从这个 XML 获取内容到 GoogleSheets 吗?

【问题讨论】:

  • 我认为服务器太慢了(花了我 30 秒)。刚刚将您的 xml 上传到另一个位置并尝试“=importxml(...)”。按预期工作。
  • 是的,我之前没有提到:当我将该文件复制到另一个位置时,效果很好。我什至尝试将此文件导入 Google Drive,然后从 Google Drive 导入文件,但我什至无法首先通过脚本下载此文件。问题是我需要每天自动执行此操作。

标签: javascript xml google-apps-script google-sheets google-sheets-formula


【解决方案1】:

以下代码有效:

function getXml() {
  var response = UrlFetchApp.fetch(
    'http://www.nife.pl/getfile-woocommerce/b55a488229b69d7c4ddf2a9f1a6b5dcb.xml?waluta=EUR',
    {
      headers: {Cookie: 'ip2loc=isset'}, 
    }
  );
  if (response.getResponseCode() == 200) {
    var content = response.getContentText();
    Logger.log(content.length);  // 1612024.0 in my test
  }
}

请注意,当 HTTP 响应代码等于 302 时,上述 URL 取自第一个响应“Location”标头。相同的响应显示了另一个标题:“Set-cookie:ip2loc=isset”。我怀疑这个cookie对于接收完整数据很重要,所以我们应该在请求中将它作为一个头来实现。确实,在更正 URL 并添加 cookie 标头后,我们可以像任何浏览器一样获取 XML。

【讨论】:

    【解决方案2】:

    通过分析浏览器发送的请求,看来你必须在请求头中添加以下值

    {'cookie': 'ip2loc=isset'}
    

    所以你的函数应该是这样的:

    function myFunction() {
      var url = 'http://www.nife.pl/getfile-woocommerce/b55a488229b69d7c4ddf2a9f1a6b5dcb.xml';
      
      var response = UrlFetchApp.fetch(url, { headers : {'cookie': 'ip2loc=isset'}} ).getContentText();
      Logger.log(response);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多