Get URLs と、Pipes: del.icio.us urls bookmark info (use Get URLs) を作り終えて

いろいろ試行錯誤したので、忘れないうちにまとめておきます。
といいながら、まとまっていないです…。完全に自分のメモみたいなものです。

やりたかったこと

del.icio.usで自分のブログやサイトに対するブックマークコメントをRSSで購読したかった。
はてブでいう新着ブックマークのようなもの。

けれど、del.icio.usでそういった機能が無いので、ならば自分で作ってみるかと思った。

実現方法を考える

del.icio.usではURL毎にブックマークの情報(ブックマークしたユーザID、タグやコメントなど)が下記のようなURLで収集できるので、欲しいサイト配下のURL全部に対して繰り返し収集して、それをまとめればよさそう。

けど、del.icio.usに登録されている特定のサイトのURL一覧を収集する方法が無い。
しょうがないので、どっか別のところからURL一覧を持ってくるしかない。

Yahooウェブ検索Webサービスを使ってURL一覧を収集

YahooのWEB APIを使って、特定のサイトのURL一覧を収集することにした。

GoogleAPIも調べたけど、なんかの理由でYahooにした。(ような気がする。理由忘れた…)
検索クエリーは"site:d.hatena.ne.jp/onozaty"みたいな感じで。

URL一覧はこれでかなり集まった(800件くらい)が、検索結果の取得上限が1000件なので、そのうち超えてしまいそう。
あと、ブックマークされないようなURLもあきらかに多い。RSSや、タグでの検索結果、ページ番号がついたURLなど。


実装はJavaで書いた。jakarta commons の HttpClientを使った。

HttpClientで取得したレスポンスからXPath使ってURLの部分を抜き出した。

URL一覧を使ってdel.icio.usに問い合わせ

上記で取得したURL一覧を使って、del.icio.usからRSSを繰り返し取得してみる。
JavaRSSを扱うライブラリとして、ROMEを使った。

各URLのRSSをパースして取り出したエントリを、1つのRSSとして出力ってのが簡単に作れた。


が、del.icio.usから360回目ではじかれてしまった。

Yahoo Pipes!でdel.icio.usからRSSを取得

それ系のサービスからのアクセスならば、アクセス制限が無いだろうということで、Yahoo Pipes!でdel.icio.usからRSSを取得し、それを1つのRSSにまとめるようなものを作ってみた。
URL一覧(1行に1URLを書いたテキスト)は、Yahoo Pipes!からアクセスできるとこにおいておいて、それをFetch CSVっていうモジュールで読みこんで後はLoopモジュールとかを組み合わせて作った。
Yahoo Pipes!は初めて使った。最初は、何を組み合わせればよいのか良くわからなかったが、いろいろ組み合わせて、思ったような出力結果を作り上げていくのが楽しい。
360件超えてもちゃんと動いた。同じYahooのサービスだし、当然といえば当然か。
ただ、出力RSSからdc:creator、dc:subjectが消えてしまう。

しょうがないのでその部分もdescriptionに含めるようにした。
出来上がったのは、下記のもの。

なるべくブックマークされているURLを

今のままだと、余計なURLが多すぎて、del.icio.usにやさしくない。またYahooのAPIだと取得できる上限が1000件までなので、そのうち超えてしまいそう。
なので、URL一覧の収集方法を考え直す。


他のブックマークサービスでブックマークされているURLを集めれば、del.icio.usでブックマークされてそうなURLを集められるだろうということで、はてブLivedoorクリップから集めることにした。
ただ、ゴミも含めて多くのURLを集めるか、それとも数が少なくてもブックマークされていそうなURLを集めるか迷ったが、結局この方法にした。
そのほうがURL一覧の価値も高いものになるだろうし、何よりdel.icio.usAPIへの負荷を高くしたくなかった。


また、せっかくだから他の人にも使ってもらえるように、、ってことで、任意のURLを指定してURL一覧を作れるようにした。
この時点でJavaからRubyに乗り換え。(自分のレンタルサーバJava使えないことを忘れていた…)
最初RSS::Parserを使っていたが、はてブの新着ブックマークとその例外のRSSで欲しいURLの位置が違うので、REXMLを使ってXPathで取るようにした。設定ファイルにRSSごとに必要とするURLへのXPathを書くようにして汎用的にした。
で、出来上がったのがGet URLs。

RSSリーダに登録されることにより、定期的にアクセスすることになるので、システム上で定期的に更新するような仕組みはいれず、アクセスされたタイミングでURL一覧を更新するようにした。
また、一度収集したURL一覧は、指定されたURL毎にファイルに保存している。DBにしなかったのは、DBにすると結局1つのテーブルに全てのURLが入り、アクセスがそこに集中すると思ったため。ファイルの方が扱いが楽。
ファイル名はURLに対してMD5でハッシュを求めたもの。コリジョンが発生したらごめんなさい…


このURL一覧は他のものにも使えるのじゃないかと思っている。
必要があれば、他のフォーマットに対応することも考えている。

Get URLsとYahoo Pipesをそのまま連携

Yahoo PipesにてURLを入れてもらって、そこからGet URLsに問い合わせてRSSを吐き出すようにする。
Yahoo Pipesでは自分で作ったPipeを他のPipeでモジュールとして使えるので、Get URLsからURL一覧取得するためのURLを作成し、それを使って Pipes: del.icio.us urls を呼び出すPipeを作った。

このPipeを見るとモジュールを4つしか使っていないように見えるけど、それは別のPipe(そっちがほとんどの機能を実現している)をモジュールとして呼び出しているため。

作ってみた感想とか

del.icio.usしか使っていない人もいるので、そういった人達のコメントを集められるようになって、自分にもプラスになっていくと思う。コメントで教えてもらうことは多い。


それなりに試行錯誤したけど、他の人(いまのところ4人くらい)にも使ってもらえているようなので、こういった形にして良かったと思う。
個人用に作るのと、自分+他の人にも使ってもらえるように作るのでは、後者の方が作業量が多くなるけど、それに比例してモチベーションも高くなる。
自分が良いと思って作ったものを、他の人にも良いと言ってもらえることほど、作って嬉しいことはない。