無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

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

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

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

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"と同じ動作になるので注意。
      • どちらもuriパラメータを複数指定すれば一括取得ができる。また、POSTリクエストを受け付ける。
    • "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/