指定エントリのはてなスター数を一括取得する
指定エントリのはてなスター数を一括取得するクラスを書きました。
require 'rubygems' require 'httpclient' require "json/lexer" require 'uri' module HatenaStar BASE_URI = "http://s.hatena.ne.jp/" # javascriptのencodeURIComponentの挙動にあわせて#を追加。 UNSAFE = /[^-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]#]/n class Service def initialize( proxy=nil ) @client = HTTPClient.new( proxy, "Client") end def entries ( uris ) url = "#{BASE_URI}entries.json" body = uris.inject("") {|buf, uri| buf << "uri=" << URI.encode( uri, UNSAFE ) << "&" } result = @client.post( url, body ) JSON::Lexer.new(result.content).nextvalue end end end
使い方。以前に設置したサンプルページのはてなスター数を取得します。
s = HatenaStar::Service.new # s = HatenaStar::Service.new http://proxyhost:port # プロキシが必要なら。 # エントリを取得 entries = s.entries([ "http://unageanu.sakura.ne.jp/blog-samples/080204/#star_1", "http://unageanu.sakura.ne.jp/blog-samples/080204/#star_2", "http://unageanu.sakura.ne.jp/blog-samples/080204/#star_3" ]) # URIと★の数を表示 # タイトルはとれない。 entries["entries"].each { |e| # entries.jsonを使う場合、一工夫必要。 if ( e["stars"] != nil && e["stars"].length > 1 \ && e["stars"][1].kind_of?(Numeric) ) count = e["stars"][1] + 2 else count = e["stars"].length end puts e["uri"] + " : " + count.to_s }
実行結果です。
http://unageanu.sakura.ne.jp/blog-samples/080204/#star_1 : 19 http://unageanu.sakura.ne.jp/blog-samples/080204/#star_2 : 6 http://unageanu.sakura.ne.jp/blog-samples/080204/#star_3 : 20
- HatenaStar.jsではGETでアクセスしていたけど(JSONPのためかな?)、POSTも受け付けてくれた。
- レスポンスの形式がちょっと変なので、★数を数える場合、一工夫必要。
- "http://s.hatena.ne.jp/entries.json"ではなく"http://s.hatena.ne.jp/entry.json"というのもあって、
- "http://s.hatena.ne.jp/entry.json"だと「/entries/stars」の下にすべての★情報が並ぶ。★数は「/entries/stars」の配列の長さを取ればOK
- "http://s.hatena.ne.jp/entries.json"だと「/entries/stars」は「<最初の★情報>,<総★数-2>,<最後の★情報>」の配列になる。★数は「/entries/stars」の配列の2番目+2となる。ただし、★数が少ない場合、"http://s.hatena.ne.jp/entry.json"と同じ動作になるので注意。
- "http://s.hatena.ne.jp/entry.json"だと★数が多い場合に、レスポンスが長くなる→データ転送に時間がかかる&&JSONの解析に時間がかかる、気がするので、数が欲しいだけなら"http://s.hatena.ne.jp/entries.json"を使う方がよさげ。
URIは引数で指定しないといけないみたい。任意のサイト以下のエントリ別★数一覧を取得とかできないのかな?
依存モジュールについて
以下の依存モジュールを利用しています。どちらもgem経由でインストールできます。
gem install ruby-json gem install httpclient --source http://dev.ctor.org/download/