Google Readerでstarを付けたすべてのエントリをはてなブックマークに登録する

Google Readerを使い始めて最初のうちは、

  1. Google Readerでフィードを読みながら気になったエントリにstarを付ける
  2. starredを読み返して個別にはてなブックマークに登録する

という手順を踏んでいたんだけど、フィードの数が膨大になってくるに従って手順2が完全にボトルネックになって効率的に未読を消化できなくなってしまい、ここしばらくは手順2を省略していた。でもGoogle Readerには検索機能が(まだ)ないので、あとからエントリを探すのが大変(自分はGoogle Readerタグ機能は使っていない)。その点はてなブックマークには検索機能があるのでやっぱりはてなブックマークが使いたい。というわけで、starを付けたエントリ(starred)を自動的にはてなブックマークにも登録するようにしてみた。前置きが長くなったが、こんなときPlaggerを使えば以下のような設定ファイルを書くだけで実現できる。

global:
  timezone: Asia/Tokyo
  assets_path: /home/nozom/work/plagger/assets
  log:
    level: error

plugins:
  - module: Subscription::Config
    config:
      feed: http://www.google.com/reader/public/atom/user/01753931442962491398/state/com.google/starred?n=10

  - module: Filter::Rule
    rule:
      module: Deduped

  - module: Filter::HatenaBookmarkTag

  - module: Filter::BreakEntriesToFeeds
    config:
      use_entry_title: 1

  - module: Publish::HatenaBookmark
    config:
      username: knzm
      password: secret
      interval: 4
      post_body: 0

usernameとpasswordにははてなのIDとパスワードを指定する(メインのはてなブックマークと混ぜたくはなかったので、この設定ではusernameがサブアカウントの方になっている)。

この設定ファイルを使ってPlaggerを実行するコマンドは例えば以下のようになる:

$ plagger -c greader.yaml

これをcronで定期的に実行するようにする。その際どのくらいの間隔にすればいいのかは少し迷うところだが、間隔が長すぎると取りこぼす危険性があり、短すぎると負荷が高くなるので、Publish::HatenaBookmarkのintervalの値(1件ブックマークする毎の待ち時間)とAtomフィードに含まれるエントリ数も考慮して10分毎に実行するようにした。Google Readerの場合、フィードに含まれるエントリ数はデフォルトだと20件で、これは後述のような方法で変更できる。今回の場合1回あたり10件分取得するようにしている。これはどちらかというとはてなブックマーク側の負荷を考慮した結果で、4秒の遅延時間を空けているとはいえ短時間に最大20回も連続してアクセスすると問題があるかもしれないと思ったため。ただ、Deduped(過去に処理したエントリを記録しておき、重複したエントリを削除する機能)の設定が効いているので、取得件数はもっと多くてもいいかも。

Google Reader側の設定としては、あらかじめStarredをPublicにしてパスワードなしでAtomフィードにアクセスできるようにしておく(これをしない場合は認証に関する設定を追加する必要がある)。ちなみに、設定ファイルにもあるようにGoogle ReaderAtomフィードhttp://www.google.com/reader/public/atom/user/01753931442962491398/state/com.google/starredのようなURLになり*1、?以下にパラメータを追加することで、何件取得するか、古い順か新しい順か、等の指定が可能。詳しくはGoogleReaderAPIを参照のこと。

タグに関しては今のところ元のエントリに付いているタグ(Subscription::Configが抽出)とはてなブックマークで付けられたタグ(Filter::HatenaBookmarkTagで取得)から自動的に付けるようにしている。この部分にはまだ改善の余地があるが、はてなキーワードを使ったり色々と凝ってみたもののイマイチうまくいかなかったので、割り切って一番シンプルな形になった。

ソーシャルブックマーク的にはあまり正しい使い方ではないのが気になるけど、むしろイメージとしてはコメントやタグが編集可能なPlanetというか。ちなみに結果はこんな感じ

追記

これを書いた後で、以下のように設定を変更した。

  • 実行間隔:10分→30分
  • 取得件数:10件→50件
  • 待ち時間: 4秒→10秒

待ち時間を長くすることで負荷を抑え、その分1回の取得件数を増やす。それによって多少間隔を空けて実行しても前回から追加された件数が取得件数を超えて取りこぼす心配がなくなり、もともと即時性はそれほど必要なかったので30分おきに更新するようにしてみた。

*1:このフィードURLはGoogle Readerの「Tags」設定ページから「view public page」というリンクを辿って表示されるページで見つけることができる