UrlFetchApp未连接到公共URL

时间:2018-12-06 21:36:30

标签: google-apps-script http-status-code-302 urlfetch

我正在尝试使用“操作”>“下载”>“ CSV”下的下载CSV链接从此网站提取数据

https://app.udot.utah.gov/apex/eom/f?p=288:300

我在UrlFetchApp行上持续收到错误302,但我不明白为什么。我使用httpexception运行记录器,并收到错误消息,提示它无法连接到服务器。该网站是公开的,可以访问且不受网络限制,因此我很难理解正在发生的事情。手动输入时,URL似乎下载了CSV,但是我无法让UrlFetchApp抓取它。

const mix = require('laravel-mix');

mix.setPublicPath('public');

mix.sass('resources/sass/frontend/app.scss', 'css/frontend/frontend.css')
    .sass('resources/sass/backend/app.scss', 'css/backend/backend.css')
    .js('resources/js/frontend/app.js', 'js/frontend.js')
    .js([
        'resources/js/backend/before.js',
        'resources/js/backend/app.js',
        'resources/js/backend/after.js'
    ], 'js/backend/backend.js')
    .extract([
        'jquery',
        'bootstrap',
    ]);

if (mix.inProduction() || process.env.npm_lifecycle_event !== 'hot') {
    mix.version();
}

任何帮助将不胜感激!

我只是在注释中尝试了每个建议的以下内容,并具有相同的错误302结果。我还尝试将重定向设置为false,然后进行此操作并以一个空的EquipData数组结束

var EquipUrl = "https://app.udot.utah.gov/apex/eom/f?p=288:300:::CSV";
var EquipContent = UrlFetchApp.fetch(EquipUrl).getContentText();
var EquipData = Utilities.parseCsv(EquipContent);

感谢您对TheMaster的帮助!我在评论中说,该代码在var cookies行上吐出了一个错误,但该错误已自行纠正,因此我认为这对我来说可能是您的代码的错误副本。现在的问题是,最后的Logger行吐出“无法解析文本”错误。

var options = {
'followRedirects' :true
];
var EquipUrl = "https://app.udot.utah.gov/apex/eom/f?p=288:300:::CSV::::";
var EquipContent = UrlFetchApp.fetch(EquipUrl, options).getContentText();
var EquipData = Utilities.parseCsv(EquipContent);

我尝试了一些其他选项,例如尝试先登录以查看是否可以找到任何东西。我可以从Stackdriver日志中提取任何信息来帮助确定问题吗?

非常感谢TheMaster!有效!如果您能发表评论并提出解决问题的过程,我将非常乐意,这样我可以帮助您了解下次发生这种情况时要注意的事情,但是我知道这是很多问题。

function fetchUrlWithCookie() {
  var url = 'https://app.udot.utah.gov/apex/eom/f?p=288:300:::CSV';
  var response = UrlFetchApp.fetch(url, {
    muteHttpExceptions: true,
    followRedirects: false,
  });
  var cookie = response.getAllHeaders()['Set-Cookie'];
  response = UrlFetchApp.fetch(url, {
    muteHttpExceptions: true,
    headers: {
      Cookie: cookie, //send the cookie we got as header
    },
  });
  Logger.log(Utilities.parseCsv(response.getContentText()));//parseCSV
}

这是功能齐全的代码的副本。再次感谢您在这几天内为解决此问题所提供的帮助。

1 个答案:

答案 0 :(得分:0)

要点:

某些网站使用cookies来维护状态,会话并完成请求。由于urlFetch在服务器端而不是在浏览器中运行,因此不会在请求之间维护cookie。但是,我们可以在第一个请求中手动获取cookie,然后在后续请求中发送它。

代码段:

function fetchUrlWithCookie() {
  var url = 'xxxx'; //Your csv url
  var response = UrlFetchApp.fetch(url, {
    muteHttpExceptions: true,
    followRedirects: false,
  });
  var cookie = response.getAllHeaders()['Set-Cookie']; //Get cookie from header 
  response = UrlFetchApp.fetch(url, {
    muteHttpExceptions: true,
    headers: {
      Cookie: cookie, //send the cookie we got as header
    },
  });
  Logger.log(Utilities.parseCsv(response.getContentText()));//parseCSV
}

参考文献: