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

そんなわけで..

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

使い方

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

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=Rubycalをカラフルに(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の仕様を変更したので、それに合わせて記述を直しました。

  1. はてな記法


blog comments powered by Disqus
ruby_pack8

100円〜で好評発売中!
M'ELBORNE BOOKS