faviconのURIを探すクラス
favicon.iconのURIを探すクラスを書いた。Wikipedia-Faviconより、
- head/link[@rel='shortcut icon']
- head/link[@rel='icon']
- ルートディレクトリのfavicon.icon
のうち最初に見つかったモノを返す。
require 'rubygems' require 'hpricot' require 'httpclient' class Favicon def initialize( proxy=nil ) @client = HTTPClient.new( proxy, "") end def get_favicon_uri( uri ) base = URI(uri).instance_eval {"#{scheme}://#{host}:#{port}/"} doc = Hpricot( @client.get_content(uri) ) ["head/link[@rel='shortcut icon']", "head/link[@rel='icon']"].each {|p| list = doc/p next if list.empty? href = list.first.get_attribute("href") return URI.join( base, href ).to_s } favicon_uri = URI.join( base, "favicon.ico" ).to_s @client.head( favicon_uri ).status == 200 ? favicon_uri : nil end end f = Favicon.new puts f.get_favicon_uri("http://d.hatena.ne.jp") puts f.get_favicon_uri("http://d.hatena.ne.jp/unageanu/")
実行結果です。
http://d.hatena.ne.jp/favicon.ico http://d.hatena.ne.jp/images/wh_favicon.ico
もう少しテストしたら組み込む!
追記 (2008-07-09)
@client.get_content()でリダイレクトにも対応している気がする・・・。確認して直す。
追記 (2008-07-10)
@client.get_content()はリダイレクト対応だったので、修正