fluentd+bookmarkletで簡易オンラインブックマークの仕組みをつくった


fluentdにはHTTPサーバーを立ててHTTPクライアントからJSONを受け取って処理する機能がある。
ひょっとしてこれとブラウザのbookmarkletを組み合わせると便利なのでは?
さらに前述したfluent-plugin-hatena-bookmark ( http://qiita.com/yuiseki/items/ff00b3db0a2c6121f1a3 ) も組み合わせれば、はてブにクロスポストすることもできるのでは?

というわけでやってみた

  <source>
    type http
    port 8888
    bind 0.0.0.0
    body_size_limit 32m
    keepalive_timeout 3s
  </source>
  <match bkmk.kogaidan.**>
    type copy
    <store>
      type stdout
    </store>
    <store>
      type mongo
      host localhost
      database bkmk
      collection let
    </store>
    <store>
      type hatena_bookmark
      consumer_key ****
      consumer_secret ****
      request_token ****
      request_secret ****
    </store>
  </match>

<match bkmk.kogaidan.**>のkogaidanの部分は、適当なランダム文字列に変えておくと安全。これは後程ブックマークレット側にも埋め込む必要がある。

以下、ブックマークレットの例

javascript:(function(){var json={tag:['tech','ruby'],title:document.title,url:location.href};var jsonstr=encodeURIComponent(JSON.stringify(json));var isrc='http://example.com:8888/bkmk.kogaidan?json='+jsonstr; var i=new Image();i.src=isrc;document.body.appendChild(i); })();

これがはてブのBookmarkletなどより便利なのは、js自体にタグが埋め込めている点。
このようなブックマークレットを事前に大量に用意しておけば、1クリックでタグを入力する手間が省ける。
コメントや時刻など、他に必要なフィールドがあれば適当に追加していくこともできそうだ。

事前に用意すると便利


注意してほしいのは、ブックマークレット内で呼び出しているドメイン名の部分。
ここでlocalhostなどを指定すると、ブラウザによっては外部のネットワーク上のサイトからローカルなネットワークへアクセスして怪しいことをしているのではないかと警告してくることがある(Operaはそのような挙動をする)。
そのため、ここは外部ネットワークにあるサーバーを指定するか、hostsファイルでlocalhostに適当なドメインを割り当てるなどの細工が必要。

また、fluentdはPOSTでJSONを受け取ることを期待しているのに、img要素のsrcとしてURLを指定してGETしていることにも注意が必要。
fluentdのレスポンスContent-Typeはtext/plain;なので、ブラウザによっては画像としてロードしようとするとエラーを吐くことがある(Chromeはそのような挙動をする)。
その場合は以下の記事を参考にしてfluentdのContent-Typeを書き換えれば好きにできる。