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

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

指定エントリのはてなスター数を一括取得する

Ruby はてな

指定エントリのはてなスター数を一括取得するクラスを書きました。

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

URIは引数で指定しないといけないみたい。任意のサイト以下のエントリ別★数一覧を取得とかできないのかな?

依存モジュールについて

以下の依存モジュールを利用しています。どちらもgem経由でインストールできます。

gem install ruby-json
gem install httpclient --source http://dev.ctor.org/download/