Rubyではてダの記事一覧を取得してまとめ頁を作ろう!

継続的にブログを続けていると
投稿はそれなりの数になります
そうするとそれをまとめたくなるのが人情です
まとめによって記事の一覧性が高まります
運が良ければ
古い投稿にブクマやスターがもらえるかもしれません


そんなわけで..


はてダのユーザ単位で記事一覧を取得する
HateDa::EntryListというライブラリをRubyで作りました(‥;)
取得したデータには記事のタイトル、日付、URLが含まれているので
それをベースにして簡単にまとめ頁を作ることができますね!

使い方

次のサイトからファイルをダウンロードします
htmlの解析にNokogiriを使っているので
なければgem install nokogiriしてください


GitHub - melborne/HateDa


以下のように使います

 require 'hateda'

 hd = HateDa::EntryList.new(:keyesberry)
 list = hd.get(:pages => 1) do |url, title, date|
   date.between?("2010-10-1", "2011-1-25") and title =~ /ruby/i
 end
 puts hd.print_list(list)


手順は以下の通りです

  1. HateDa::EntryListクラスにユーザIDを渡しオブジェクトを生成します
  2. getメソッドで対象頁を取得しHTML解析した結果を得ます
  3. getメソッドでは頁を指定する引数と条件を指定するブロックを渡します
  4. print_listメソッドで取得したリストをはてダ投稿用*1に整形出力します


getメソッドの返り値は{url=>[title, date]}のようなHashになります
このサンプルの出力は以下のようになります

+[http://d.hatena.ne.jp/keyesberry/20110124/p1:title=Rubyを使って「なぜ関数プログラミングは重要か」を解読しよう!(2011-01-24)][http://d.hatena.ne.jp/keyesberry/20110124/p1:bookmark]
+[http://d.hatena.ne.jp/keyesberry/20110120/p1:title=Rubyの末尾再帰最適化を理解する(2011-01-20)][http://d.hatena.ne.jp/keyesberry/20110120/p1:bookmark]
+[http://d.hatena.ne.jp/keyesberry/20101202/p1:title=Rubyでcalをカラフルに(2010-12-02)][http://d.hatena.ne.jp/keyesberry/20101202/p1:bookmark]
+[http://d.hatena.ne.jp/keyesberry/20101116/p1:title=IRB それはRubyistの魔法のランプ(2010-11-16)][http://d.hatena.ne.jp/keyesberry/20101116/p1:bookmark]
+[http://d.hatena.ne.jp/keyesberry/20101111/p1:title=Rubyのメソッドに別名があってもいいじゃないか(2010-11-11)][http://d.hatena.ne.jp/keyesberry/20101111/p1:bookmark]
+[http://d.hatena.ne.jp/keyesberry/20101110/p1:title=((Rubyで) 書く (Lisp) インタプリタ)(2010-11-10)][http://d.hatena.ne.jp/keyesberry/20101110/p1:bookmark]
+[http://d.hatena.ne.jp/keyesberry/20101107/p1:title=RubyANSIカラーシーケンスを学ぼう!(2010-11-07)][http://d.hatena.ne.jp/keyesberry/20101107/p1:bookmark]
+[http://d.hatena.ne.jp/keyesberry/20101105/p1:title=Rubyのモジュール関数を理解しよう!(2010-11-05)][http://d.hatena.ne.jp/keyesberry/20101105/p1:bookmark]
+[http://d.hatena.ne.jp/keyesberry/20101017/p1:title=Rubyで文字列検索アルゴリズムを表現しよう!(2010-10-17)][http://d.hatena.ne.jp/keyesberry/20101017/p1:bookmark]
+[http://d.hatena.ne.jp/keyesberry/20101012/p1:title=Rubyでソート・アルゴリズムを表現しよう!(2010-10-12)][http://d.hatena.ne.jp/keyesberry/20101012/p1:bookmark]


getメソッドには対象頁を指定するキーワード引数:pagesを渡せます
:pagesはその値として数字またはRangeを受けます
ここでいう頁は記事一覧の一頁のことで
一頁には50件程度の記事が含まれています

 hd.get(:pages => 3)      #記事一覧の3頁目のみを取得
 hd.get(:pages => 1..3)   #1〜3頁目を取得
 hd.get               #1〜10頁を取得
 hd.get(:pages => 5..15)  #1〜15頁を取得

引数を省略すると10頁までを取得します
それ以上を取得したい場合は例のように範囲を明示してください


getはまた頁の絞り込みをするためのキーワード引数:wordを取ります
:wordに渡した文字列で記事全文を検索し
その文字列が含まれる記事のみを対象にします

  #'任天堂'の語を含む記事のみを取得
 hd.get(:word => '任天堂')
  #'ruby'の語を含む記事群の1頁目のみを取得
 hd.get(:word => 'ruby', :pages => 1)


getのブロックには
url, 記事タイトル(title), 日付(date)を対象に
条件を指定して目的の記事を絞り込むことができます
urlとtitleは文字列ですので
正規表現のマッチングを行うのがいいでしょう
dateはDateクラスのオブジェクトですのでそのメソッドが使えます
更にDateクラスを拡張して以下のメソッドが使えます

  date.before?("2010/12/31")   # dateが2010-12-31以前か?

  date.after?("2009-12-3")     # dateが2009-12-3以降か?

  date.sameday?("2010-1-1")    # dateが2010-1-1か?

  # dateが2009-12-31と2010-2-1の間か?(当日を含む)
  date.between?("2009-12-31", "2010-2-1")


print_listメソッドはキーワード引数として
:bookmark :day :linenoを取れます
値はすべてBooleanです
:bookmarkは被ブクマ数表示の有無
:dayは日付表示の有無
:linenoは先頭連続番号の有無です
省略した場合は先の例のようにすべて有りになります

 # bookmarkと日付を省略
 hd.print_list(list, bookmark:false, day:false)
 # linenoのみ省略
 hd.print_list(list, lineno:false)


需要があるかは知りませんが
使ってくれる人がいたらうれしいです


(追記:2011-1-28)HateDa::EntryListの仕様を変更したので、それに合わせて記述を直しました。