Rubyで短縮URLを展開してみた
3年ほど前書いたとあるスクリプトでは短縮URLの展開処理について hugeurl というパッケージを利用していました。
展開には http://search.twitter.com/hugeurl?url= を使っている。
via : 橋本商会 » hugeurlというgemを作った
とのことでしたが、知らず知らずのうちにTwitterの短縮URL APIが終了していたそうで、展開処理はHTTP-HEADをし、ResponseのLocationを見るように変更されたそうです。
twitterのURL展開隠しAPIを使っていたのだがいつの間にかなくなっていたので、HTTP-HEADしてresponseのlocationを見るようにした。
via : 橋本商会 » hugeurlをアップデートした
最近になり、短縮URLの展開処理が必要になったので使ってみると求めてる解が得られなかったので、求める解が得られるようなものを書いてみました。
検証材料
実装結果のチェックに下記のツイート内にあるURLを食わせてやります。
てすてす bit.ly/LEIdIN
— 遠まわりするkimikato (・ω・ さん (@kimikato) 6月 29, 2012
ただし、Twitter Search APIから取得できるツイートのURLは ”http://bit.ly/LEIdIN” ではなく、
Twitter独自の短縮URLの結果である “http://t.co/39XdDUP9″ になるため、こちらのほうをチェックURLとします。
また、”http://bit.ly/LEIdIN” の元URLは “http://tinyurl.com/7gbmp2b” とtinyurl.comの短縮URLが登録されており、”http://tinyurl.com/7gbmp2b” には “http://www.iex3.info/archives/1249″ が登録されています。
結果から言えば、”http://www.iex3.info/archives/1249″ が帰ってくるような展開処理が望ましいと言えます。
実装 1
参考サイトによると、Net::HTTP#head を使うと良いみたいなことが書いてあり、そのままコードも書いてあったのでそれを拝借しました。
1 2 3 4 5 6 7 8 9 10 11 12 |
require 'net/http' require 'uri' def expand_url(url) uri = url.kind_of?(URI) ? url : URI.parse(url) Net::HTTP.start(uri.host, uri.port) do |io| r = io.head(uri.path) r['Location'] || uri.to_s end end p expand_url(ARGV[0]) |
上記のスクリプトに対して、”http://t.co/39XdDUP9″ を食わせてみます。
1 2 |
% ruby url_expander_1.rb http://t.co/39XdDUP9 "http://bit.ly/LEIdIN" |
1段階目の展開しか得られてないのはプログラム通りってところです。
実装 2
次に実装1のプログラムに再帰的に展開すれば、求める解が得られるだろうと思ったので下記のように追記してみました。
1 2 3 4 5 6 7 8 9 10 11 12 |
require 'net/http' require 'uri' def expand_url(url) uri = url.kind_of?(URI) ? url : URI.parse(url); Net::HTTP.start(uri.host, uri.port) do |io| r = io.head(uri.path); URI.parse(r['Location']||uri.to_s).scheme ? ((r['Location']||uri.to_s) == url ? url : expand_url(r['Location']||uri.to_s)) : url; end end p expand_url(ARGV[0]); |
上記のスクリプトに対して、再度 “http://t.co/39XdDUP9″ を食わせてみます。
1 2 |
% ruby url_expander_2.rb http://t.co/39XdDUP9 "http://www.iex3.info/?p=1249" |
若干求める解と違うような気がしますが… 挙動を知ってみたいので、 expand_url に入った直後に入力パラメータ url を出力してみました。
1 2 3 4 5 6 7 |
% ruby url_expander_2.rb http://t.co/39XdDUP9 "[debug][http://t.co/39XdDUP9]" "[debug][http://bit.ly/LEIdIN]" "[debug][http://tinyurl.com/7gbmp2b]" "[debug][http://www.iex3.info/archives/1249]" "[debug][http://www.iex3.info/?p=1249]" "http://www.iex3.info/?p=1249" |
ということで、若干違いますがほぼ求めてる解が得られた気もするのでこれでOKとします。