読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

faviconのURIを探すクラス

Ruby

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()はリダイレクト対応だったので、修正