Какой метод Google AppsScript используется для получения URL-адреса перенаправления?

«www.mysite.com/mySecretKey1» перенаправляет на «www.othersite.com/mySecretKey2».

в G.AppsScript:

  var response = UrlFetchApp.fetch("https://www.mysite.com/mySecretKey1");
  var headerString = response.getAllHeaders().toSource();
  Logger.log(headerString);
  //string 'www.othersite.com.my/SecretKey2' is not present in log.

Как сценарий обнаружит URL-адрес, на который он перенаправлен (например, строку «www.othersite.com/mySecretKey2»)?

ОБНОВЛЕНИЕ: В более общем плане, как скрипт обнаружит URL-адрес от response?


person user3645994    schedule 24.11.2014    source источник


Ответы (4)


Объясняя ответ Джозефа Комбса, вот версия, которая использует рекурсию для следования нескольким перенаправлениям, возвращая только конечный канонический URL-адрес:

function getRedirect(url) {
  var response = UrlFetchApp.fetch(url, {'followRedirects': false, 'muteHttpExceptions': false});
  var redirectUrl = response.getHeaders()['Location']; // undefined if no redirect, so...
  var responseCode = response.getResponseCode();
  if (redirectUrl) {                                   // ...if redirected...
    var nextRedirectUrl = getRedirect(redirectUrl);    // ...it calls itself recursively...
    Logger.log(url + " is redirecting to " + redirectUrl + ". (" + responseCode + ")");
    return nextRedirectUrl;
  }
  else {                                               // ...until it's not
    Logger.log(url + " is canonical. (" + responseCode + ")");
    return url;
  }
}  

function testGetRedirect() {
  Logger.log("Returned: " + getRedirect("http://wikipedia.org"));
}

Это журналы:

https://www.wikipedia.org/ is canonical. (200)
https://wikipedia.org/ is redirecting to https://www.wikipedia.org/. (301)
http://wikipedia.org is redirecting to https://wikipedia.org/. (301)
Returned: https://www.wikipedia.org/
person Chris    schedule 07.06.2018
comment
Чувак, я люблю тебя. Это именно то, что я искал. - person Doomd; 18.03.2020

ОБНОВЛЕНИЕ. В более общем плане, как сценарий обнаружит URL-адрес из ответа?

Вопреки здравому смыслу вам нужно отключить перенаправление и не отключать HttpExceptions, например:

var followedPost = UrlFetchApp.fetch(properUrl, {'followRedirects': false, 'muteHttpExceptions': false});
Logger.log(followedPost.getHeaders()['Location']);

Объект, возвращаемый .getHeaders(), будет содержать новое местоположение запрашиваемого ресурса. Получите доступ к этому новому местоположению с помощью нового .fetch().

person Joseph Combs    schedule 16.12.2014

В UrlFetchApp есть встроенная поддержка перенаправлений. Вы должны попробовать установить:

followRedirects = true

В параметрах, которые вы предоставляете UrlFetchApp. Что-то такое:

var options = {
   "followRedirects" : true
 };
var result = UrlFetchApp.getRequest("http://your-url", options);
person Ido Green    schedule 24.11.2014
comment
URL-адрес первой или второй страницы по-прежнему отсутствует в response. - person user3645994; 25.11.2014

Здесь есть таблица Google, которую вы можете бесплатно скопировать https://www.thetechseo.com/seo-tools/redirect-checker/

Он прекрасно работает, предоставляя прыжки, коды и пункт назначения.

введите здесь описание изображения

На всякий случай (лист/страница потеряются) я вставляю сюда код, который входит в редактор сценариев (ни один из этих кодов не принадлежит мне).

function redirectCheck(url, user, pwd) {
  try {
    function getResp(url, user, pwd){  
      var resp = UrlFetchApp.fetch(url, {
        muteHttpExceptions: true,
        followRedirects: false,
        headers: {
          'Authorization': 'Basic ' + Utilities.base64Encode(user+':'+pwd)
        }
      });
      return resp;
    }


var response = getResp(url, user, pwd);
var rCode = response.getResponseCode();
var redirectCount = 0;
var tCode = rCode.toString();
var location = url;
var domain = getDomain(url);

while (rCode == 301 || rCode == 302 && redirectCount <= 10) {
  redirectCount++;
  header = response.getHeaders();
  location = getFullUrl(header['Location'],domain);
  domain = getDomain(location);
  Logger.log('location: '+location);
  response = getResp(location, user, pwd);
  rCode = response.getResponseCode(); 
  tCode = tCode + " > " + rCode.toString();
  Utilities.sleep(500);// pause in the loop for 500 milliseconds
}     


Logger.log('redirectCount: '+redirectCount);
return tCode + "|" + redirectCount + "|" + location;


  } catch (error) {
    Logger.log(error);
    return "Error| |"+error;
  }
}
function getDomain(url) {
  var domain = '',
      protocol;
  if (url.indexOf("://") > -1) {
    domain = url.split('/')[2];
    protocol = url.split('/')[0];    
    //remove port number
    domain = domain.split(':')[0];
    //add protocol back
    domain = protocol+"//"+domain;
  }  

  return domain;
}

function getFullUrl(url,prevDom) {
  var fullUrl,
      domain = getDomain(url);
  if(domain == ''){
    fullUrl = prevDom+url;
  } else {
    fullUrl = url;
  }       

  return fullUrl;
}

function redirectCheckTest() {
  var test = redirectCheck('http://blog.pexcard.com/contractors/building-budget-construction-business/');
  Logger.log('test: '+test);
}

И формулы

In G

=IF(H11=200,"Not Redirected",IF(ISBLANK(C11),"",if(C11=J11,"Good","Bad")))

In H

=IF(ISBLANK(B11),"",split(redirectCheck(B11,$L$5,$L$6),"|"))

введите здесь описание изображения

Он позволяет не только находить проблемы (неверные коды), но и улучшать качество ссылок, заменяя их конечным пунктом назначения.

person Rub    schedule 26.09.2019