はじめに
「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.to
とbit.ly
。amzn.to
とbit.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時間営業の全自動だ。
終わりに
GASでTwitter APIを使えるようにするためにいくつかの記事のお世話になりました。ありがとうございます。