Tuesday, October 16, 2012

Rubyで短縮URL(リダイレクトされるURL)からコンテンツを取得する

短縮URLは普通リダイレクトで目的のコンテンツまで辿り着く。Rubyで短縮URLで指定されたコンテンツを扱いたいが、http_clientはリダイレクトには対応しているけど、デフォルトではhttpsの短縮URLに対してhttpのURLにリダイレクトされたときに例外を吐くのでbit.lyなんかではうまく使えない。

なので、以下のように常にリダイレクトするようにコールバックを設定すると、この制限を回避できる。

require 'httpclient'

def get_content_with_redirection(url)
  client = HTTPClient.new
  def client.allow_all_redirection_callback(uri, res)
    urify(res.header['location'][0])
  end
  client.redirect_uri_callback = client.method(:allow_all_redirection_callback)
  client.get_content url
end

html = get_content_with_redirection("http://bit.ly/RRKD7d")
puts html