API を用いて「複数 URL のはてなブックマーク件数の合計」を表示する tDiary 用 Ruby スクリプト

「複数 URL のはてブ件数の合計」を表示するスクリプトです.



なんでそんな奇特なことを,と思った方も多いと思うが,あれなんですよ.えーと,tDiary って記事単位の permalink がなくて,各記事はアンカーで区別されてるので,あるページへのブックマーク URL にアンカーがある場合とない場合があるんですよ.何言ってるかわかりませんね.ええと,例えばこの記事をブクマするのに,

がブクマされる場合と,がブクマされる場合とがあるわけだ.困った事に,この 2 つははてブ上では別々にカウントされてしまう.例えば hatena_bookmark.rb なんかで上位エントリを表示させてるサイトなんかも,同じエントリへのブックマークが別々にカウントされてたりして,けっこう見苦しいなと思っていた.この,同じエントリを指す複数のブックマークを合計したいという邪道な野望が前からあった*1



なお本方式では,同じ日付に複数の記事エントリがあった場合に,それぞれを指すブックマークが無理矢理足されてしまって日付単位のブックマーク数になってしまうわけだけど,別にそれでいいやってのが自分の考え.昔はともかく,最近は諸般の理由から意識的に 1 日 1 エントリを心がけているから問題はあまりないはずなのだ.また,本来は記事ごとにブクマ数を表示すべきなんだろうし,そういうプラグインもいくつかあるが (これとかいしなおさんのとことか),キャッシュが必要だったりして面倒くさい.何より,そこまでのスキルが自分にはない.



前置きが長くなったが,とりあえずまずは件数を取得するところから.単にある記事の件数を画像で取得するなら この API [2006-07-16] で十分なんだけど,今回はその件数を足し算したりしないといけないので,コードをかくことにした.「はてなブックマーク件数取得API」の仕様は以下に詳しい.で,tDiary に載せるためには Ruby で実装する必要があるわけだが,自分は Ruby が全然わからない(激ぉ.なので,とりあえず他人様のコードを参考にさせてもらう.ここのコードが,すぐにライブラリとして使えるようになっていて激しく便利そう.ただしこれは「サイトのはてなブックマーク総数」を取得するコードなので,bookmark.getTotalCount が使われている.今回は記事ごとの件数を取得するので,bookmark.getCount にしないといけない.しかもその場合は「URL と被ブックマーク件数のペアの構造体」が返ってくるので,件数だけを取り出さないといけない.



というわけで,さらにこちらのコードを参考にする.ここのコードは複数 URL の処理も扱っているので,なにげに自分の野望にとっては大変都合がよい.結局,以下のようなコードを hatena_bookmark_count.rb として,tDiary のトップディレクトリに置いた.

#!/usr/bin/ruby
# http://www.smallstyle.com/20061004.html
# http://d.hatena.ne.jp/toward/20051222/ruby_xmlrpc_client_hatena_bookmark_count
require 'xmlrpc/client'
class HatenaBookmarkCounter
   def initialize
      @s = XMLRPC::Client.new('b.hatena.ne.jp', '/xmlrpc')
   end
   def count urls
      begin
         @s.call('bookmark.getCount', *urls)
      rescue XMLRPC::FaultException => e
         e.faultString
      end
   end
end
if __FILE__ == $0
   if ARGV.size != 1
      print "usage: #{__FILE__} <urls>\n"
      exit
   else
      result = HatenaBookmarkCounter.new.count(*ARGV)
      result.each do |url, count|
         puts "#{url} #{count}"
      end
   end
end

一応コマンドラインからも使えるようにはなっていて,

% ruby hatena_bookmark_counter.rb http://nao.s164.xrea.com/td/2007-01-28.html
http://nao.s164.xrea.com/td/2007-01-28.html 2

とかできるのはオリジナルと一緒.



さて,次はこれを permalink プラグインから呼び出す.permalink プラグインというのは,[2005-09-01] [2006-07-16] あたりで適当に作ってみた permalinkはてブ数表示用のごった煮ルーチン.この内部で,

require 'hatena_bookmark_counter'

した上で,

	       pml = "#{@conf.base_url}#{@pl_date.strftime( '%Y-%m-%d' )}.html"
	       hbc = 0
	       urls = [pml,"#{pml}#p01","#{pml}#p02"]
	       res = HatenaBookmarkCounter.new.count( urls )
	       res.each do |url, count|
                  hbc += count
               end

として hbc に合計件数を入れている.ここで,ある日付のページに対し,「そのページ自身」「そのページの第 1 エントリ」「第 2 エントリ」に対する各ブックマークの合計を出しているのがちょっとしたインチキである.本当はそのページに含まれるエントリ数を参照して,その分だけ urls の要素を増やせれば良かったんだけど,やり方がわからなかった.誰かご存知なら教えて下さい.



で,こんな風にして件数画像を取得している.

<img src="http://b.hatena.ne.jp/images/users/large/#{'%05d' % hbc}.png" style="border: none;" alt="はてなブックマーク数" title="はてなブックマーク数" align="absmiddle" /></a>

PNG 画像を直接参照しているのもなかなかバッドノウハウ的だけど,まあいいよね(ぉ



というわけで,例えばこのページ (2007-01-28.html) へのブックマーク数は現在 はてなブックマーク数 で,この記事 (2007-01-28#p01) へのブックマーク数は現在 はてなブックマーク数 なわけだけど,この記事の末尾にはちゃんとその合計数が表示されているはずだ.



念のため,現在のごった煮 permalink.rb の内容は以下の通り.プラグインディレクトリに置いている.

require 'hatena_bookmark_counter'
add_body_leave_proc do |date|
        @pl_date = date
	''
end
def comment_new
    cgi = @options['tb.cgi'] || './tb.rb'
    url = "#{cgi}/#{@tb_date.strftime( '%Y%m%d' )}"
    pml = "#{@conf.base_url}#{@pl_date.strftime( '%Y-%m-%d' )}.html"
    hbc = 0
    urls = [pml,"#{pml}#p01","#{pml}#p02"]
    res = HatenaBookmarkCounter.new.count( urls )
    res.each do |url, count|
        hbc += count
    end
    %Q| ツッコミ</a> \| <a href="#{@pl_date.strftime( '%Y-%m-%d' )}.html">permalink</a> \| <a href="#{@tb_url}">trackback</a> \| <a href="http://b.hatena.ne.jp/entry/#{pml}"><img src="http://b.hatena.ne.jp/images/users/large/#{'%05d' % hbc}.png" style="border: none;" alt="はてなブックマーク数" title="はてなブックマーク数" align="absmiddle" /></a> <a href="http://b.hatena.ne.jp/append?#{@conf.base_url}#{@pl_date.strftime( '%Y-%m-%d' )}.html"><img src="http://d.hatena.ne.jp/dav/images/icon/bookmark/bookmark_br.gif" style="border: none;" alt="このエントリーをはてなブックマークに追加" title="このエントリーをはてなブックマークに追加" width="16" height="12" align="absmiddle" /></a> |
end
def comment_description; 'ツッコミ・コメントがあればどうぞ! E-mail アドレスは公開されません (省略可).'; end
def navi_index; 'home'; end

*1: 記事ごとに permalink が発行できないのは tDiary で個人的に気に入らない点の一つ.じゃあ BlogKit 使えよという話もあるけど,日付の概念がなくなってしまうのが気に入らない.



追記: 時々うまく画像が取得できないことがあるようで,リロードすると出て来ます.うーむ.なんでだろ.