22
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【GAS】リダイレクト先のURLを取得する

Posted at

はじめに

「GAS リダイレクト URL」でググって上位に来たteratailの情報がイマイチだったので、より適切な情報を広く共有したい。
teratailは私も活用しているので悪く言いたくないのだけど。
なお、私自身は何の貢献もしていない。人の褌で相撲を取るというやつだ。

主旨

Google Apps ScriptのUrlFetchApp.fetch()でURLを投げてレスポンスを得てスクレイピングする。指定したURLから他ページにリダイレクトされた場合、飛ばされた先の内容を取得するのは当然として、移転先のURLを取得するにはどうしたらよいかという話。
なお、Pythonのurllibにはそのための関数がある。geturl()だ。

方法

teratailの質問者が参考にしたというStack Overflowに答えが載っていた。Thank you, Mr.Chris!
あとで気づいたがこちらの方も同様のことをしている。

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();        // ...it calls itself recursively...
  if (redirectUrl) {                                    // ...if redirected... 
    var nextRedirectUrl = getRedirect(redirectUrl);
    return nextRedirectUrl; 
  } else {                                              // ...until it's not 
    return url;
  }
}

確認

いくつかのURLでリダイレクトを試してみた。Wikipediaのランダムリンクhttp://ja.wikipedia.org/wiki/Special:Randompageと短縮URLのamzn.tobit.lyamzn.tobit.lyは同じ仕組みらしいけど。

function tryRedirect() {
  var url_list = ["http://ja.wikipedia.org/wiki/Special:Randompage",
                  "https://amzn.to/2tUlU0r",
                  "https://bit.ly/2Rfs7Mr"]

  for (var i=0 ; i < url_list.length ; i++) {
    var url = url_list[i];
    var redirect_url = getRedirect(url);
    Logger.log(redirect_url);  
  }
}

結果は以下の通り、リダイレクト先を取得するのに成功している。
amzn.toは503エラーを返すことが多かった。本格的に使うならエラー対策が必要だ。というか、遊ぶなら相手の迷惑にならないように遊ばなくては。

[20-01-18 15:46:45:530 JST] https://ja.wikipedia.org/wiki/%E9%88%B4%E6%9C%A8%E5%8B%89
[20-01-18 15:46:45:962 JST] https://www.amazon.co.jp/dp/B00H6V3BWA
[20-01-18 15:46:46:418 JST] http://www.tokoroza-one.jp/index.html

活用例

Done is better than perfect。本知見を織り込んだTwitterボットを作ってみた。Twitterなんて自分自身ではまったくやっていないのに。
GAS+タイマー(トリガー)なので24時間営業の全自動だ。

  THE_SCRAPER

終わりに

GASでTwitter APIを使えるようにするためにいくつかの記事のお世話になりました。ありがとうございます。

22
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?