Как вернуть перенаправленный URL в Google Sheets - PullRequest
0 голосов
/ 07 ноября 2019

Я работаю над проверкой правильности работы редиректов 301. У меня есть список URL-адресов Google и скрипт Google, который проверяет возвращаемый статус:

function getStatusCode(url){
   var options = {
     'muteHttpExceptions': true,
     'followRedirects': false
   };
   var url_trimmed = url.trim();
   var response = UrlFetchApp.fetch(url_trimmed, options);
   return response.getResponseCode();
}

Далее я хочу убедиться, что URL-адрес перенаправляется правильно. Вот где я застреваю. Я попытался использовать вариант вышеуказанного кода, но я могу просто вернуть передаваемый URL, а не URL, на который перенаправляется, или я просто получаю сообщение об ошибке в моем Google Sheet. Вот последний бит, который я попытался использовать (который возвращает ошибку).

function getReturnedURL(url) {
   var options = {
     'method': 'GET',
     'muteHttpExceptions': true,
     'followRedirects': true
   };
   var url_trimmed = url.trim();
   var returnedUrl = ScriptApp.getService().getUrl(url_trimmed);
   var response = UrlFetchApp.fetch(returnedUrl, options);
   return response;
}

Есть идеи? Или это вообще возможно?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Так что для моей ситуации я хотел извлечь URL из электронной таблицы и вернуть перенаправленный URL в другой столбец этой электронной таблицы. @ carlesgg97 поставил меня на правильный путь, вот что у меня получилось:

function urlProtocol(url){
  return URI(url).protocol()
}

function urlHostname(url){
  return URI(url).hostname()
}

function getRedirects(url) {
  eval(UrlFetchApp.fetch('https://rawgit.com/medialize/URI.js/gh-pages/src/URI.js').getContentText());

  var params = {
    'followRedirects': false,
    'muteHttpExceptions': true
  };

  var baseUrl = urlProtocol(url) + "://" + urlHostname(url),
      response = UrlFetchApp.fetch(url, params),
      responseCode = response.getResponseCode();

  if(response.getHeaders()['Location']){
    var redirectedUrl = getRedirects(baseUrl + response.getHeaders()['Location']);
    return redirectedUrl;
  } else {
    return url;
  }
}
0 голосов
/ 08 ноября 2019

Вы не можете знать, каким конечным пунктом назначения является ваш запрос только из полученного HTTPresponse .

Однако вы можете использовать нижеприведенную функцию getRedirects дляполучить URL-адреса, по которым будет следовать ваш запрос при вызове fetch с followRedirects, установленным как true:

function getRedirects(url) {
  var params = {
    'followRedirects': false,
    'muteHttpExceptions': true
  };
  var followedUrls = [url];

  while (true) {
    var res = UrlFetchApp.fetch(url, params);
    if (res.getResponseCode() < 300 || res.getResponseCode() > 399) {
      return followedUrls;
    }
    var url = res.getHeaders()['Location'];
    followedUrls.push(url);
  }
}


function test() {
  var followedUrls = getRedirects('http://mail.google.com/mail/u/0/#inbox/');
  Logger.log(followedUrls);
}

В этом случае выполнение test вернет:

[http://mail.google.com/mail/u/0/#inbox/,
https://mail.google.com/mail/u/0/,
https://accounts.google.com/ServiceLogin?service=mail&passive=true&rm=false&continue=https://mail.google.com/mail/&ss=1&scc=1&ltmpl=default&ltmplcache=2&emr=1&osid=1#]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...