ruby-pathtraq を作成しました

長い沈黙を破ってついに待望の Pathtraq API が登場したようです。やったね!

マウント アンマウント | パソコン豆知識

そこで RubyPathtraq API のラッパーライブラリであるところの ruby-pathtraq を作りました。API 自体はとっても簡単だからわざわざライブラリとして置いておく必要性もないとは思いますが(とか言ってるけど、後で書くように意外と本当はいざ作ってみるとなかなか面倒くさい事情でいっぱいでした)、書いたからには公開しておきます。

http://github.com/keita/ruby-pathtraq/tree/master

これから rubyforge に登録しますので、いずれ gem でインストールできるようになるものと思います。

使い方

ruby-pathtraq の使い方を紹介しておきます。

require "pathtraq"
include Pathtraq

# ニュースランキング取得API
NewsRanking.request(:m => :hot, :genre => :national)

# こういう感じに各ジャンル名でも呼べます
NewsRanking.sports
NewsRanking.culture

# カテゴリランキング取得API
CategoryRanking.request(:m => :popular, :category => :politics)

# 各カテゴリ名でも呼べます
CategoryRanking.anime
CategoryRanking.art

# キーワード・URL検索API
KeywordSearch.request(:url => "http://d.hatena.ne.jp/keita_yamaguchi/")

# URL正規化API はあんまり必要性を感じてないので未サポート

# ページカウンタAPI
PageCounter.request(:url => "http://d.hatena.ne.jp/keita_yamaguchi/")

# ページチャートAPI
PageChart.request(:url => "http://d.hatena.ne.jp/keita_yamaguchi/")

みたいな感じです。それっぽい感じなので、それっぽく使ってみて下さい。

Ruby 標準添付の RSS モジュールが面倒だという話

さて、こんな簡単な API のラッパーライブラリならあっという間に作れちゃうよね!と思ったのですが、実際には結構手間取りました。原因は以下の二点です。

  • RSS モジュールがいまいち
  • Pathtraq API の仕様がややこなれてない

最も時間をとったのが RSS との格闘です。最初は標準添付の RSS モジュールを使って書いていたのですが、これがとっても困ったさんでした。なんでこんなに使いづらいのでしょうか。

Pathtraq API はレスポンスを RSS で返してくれるのですが(JSONでも返してくれます)、フィードの中に pathtraq:hits という謎の要素が入り込むわけです。RSSモジュールはこうした場合の対処に非常に手間取ります。rss/dublincore.rb あたりを参考に地道にやっていけばなんとかなるだろう、というのは分かるのですが、これはとても面倒です。一度実際に DublinCore ばりに書いてみたのですが、こういう本質でもないなんでもない部分が API のラッパー部分よりもはるかに大きくなってしまうという、とてもろくでもない結果になったので、黙って消してしまいました。

これはやってられない!というわけで、世の中にはきっともっと便利なライブラリがあるに違いないと考え、gem 探索の旅に出ました。絶望的なrubyforge 検索(なんであんなにも検索しづらいのでしょう)の果てに見つけた良さそうなライブラリは次の二つです。

Syndication の方がなにかとしっかりしているように見えますが、今回は名前の通りとっても簡単な simple-rss を選択しました。simple-rss において pathtraq:hits 要素に対応するためには、以下のようにします。

require "simple-rss"
SimpleRSS.item_tags << :'pathtraq:hits'

たったこれだけ。こうでなくっちゃいけません。簡単でしょ?名前に偽りないでしょ?同じことを標準添付の RSS モジュールでやろうとするととっても大変ですから、素直にこうしたライブラリに頼りましょう(ただし simple-rss も syndication も読み込みのみで、書き出せませんから、完全な代替とはなりません)。

というわけで、ここに行き着くのに非常に時間がかかりました。Rubyで何かやろうとする時には、ライブラリ探索で時間をとられる場合が多いのではないでしょうか。rubyforge の検索がもう少し洗練されていると楽になるのになぁ、といつも思います。

さて、こうしてフィードの読み込みについては解決したものの、次に Pathtraq API そのものもちょっぴり困ったさんです。

  1. 不正なパラメタによるエラーが判定しづらい
  2. レスポンスを JSON にすると description が欠落する
  3. ページチャートAPIだけ JSON でしか返してくれない

1についてですが、不正なパラメタを渡した時にエラーになるのは当然として、問題はこのエラーの発生をどうやって補足すれば良いのかです。現状では、レスポンスの status コードが 200 OK なのですが、これは 400 の方が良くないでしょうか。しかもエラー時のレスポンスは content type が text/html になっているのに、実際のところ HTML ではなくただの plain text が返ってきます。というわけで、Pathtraq API はあまりエラー時の扱いがこなれていないと言えます。

2は、レスポンスをJSONにすると description が欠落しちゃうので、RSSがダメならJSONでいいかな、という選択が出来ません。

3は、なんか不統一なのが気になるだけです。でもこれだけのために JSON パーサをひっぱってくるのもおっくうです。ここもなんとか XML でよろしくお願いしたいところです。

以上、細かいところかも知れませんが、現在のところこういう点がしっかりしていません。でもいずれ良くなるものと信じております。

追記:ここに書いてあるの全部解決!すごいよPathtraq、ありがとうサイボウズ・ラボの皆様!

Kazuho@Cybozu Labs: Pathtraq の API を公開しました

まとめ

実のところ Pathtraq のアドオンは約一ヶ月前にアンインスールしちゃいましたよ。だってもう API とか出ないのかな、と思っていましたし。でもこうして出たので大変にめでたい事で、ありがたい話です。

追記

遅くなりましたが、gem をリリースしましたので、次の手順でインストールしてみて下さい。

% sudo gem install pathtraq

なんか変なところとかあれば何らかの手段でご連絡下さい(コメント欄に書いて下さっても嬉しいですし、github でプルリクエストを送って下さるともっともっと嬉しいです!)。問題点があれば直します。バグをご指摘下さいました id:kmachu さんありがとうございました。gem 作る前に修正できたのでとっても助かりました。

ところでそれにつけてもサイボウズ・ラボの人はとっても対応が早くて素晴しいと思いました!

どこに要望を送ればいいのかなぁ、なんて悩みながら rubinius で遊んでたら猫が倒れてウンコ漏らしたから動物病院にあわてて連れていって入院させて家に戻ったらその子猫が今度は下痢しだしてまた病院に連れていって、それでほっとして気付いたらとっくに改善されていたというこの早さ。誠にありがとうございました。その心意気に感動したので Pathtraq を再インストールしました、アンインストールしてごめんなさい。

それにしても、日記に書くだけで問題点があっという間に解決されちゃうなんて、インターネットってすごいですね!

そういうわけですので、皆様 RubyPathtraq でなんかして色々遊びましょう。まぁ難しいこと考えなくても、普通にキーワード・URL検索APIRSSで返ってくるから色々監視するのに便利だったりすると思いました。

あと、皆様この頃やたらと暑いので猫の体調には気をつけてあげて下さい。