More than 1 year has passed since last update.

いちいちgemにしてリポジトリつくるほどでもない単純なものなのでコピペではっつけておきますが

https://github.com/kkosuge/hatena-bookmark

↑このgemに依存しています。

out_hatena_bookmark.rb
class Fluent::HatenaBookmarkOutput < Fluent::Output
  Fluent::Plugin.register_output('hatena_bookmark', self)

  config_param :consumer_key, :string
  config_param :consumer_secret, :string
  config_param :request_token, :string
  config_param :request_secret, :string

  def initialize
    super
    require 'hatena-bookmark'
  end 

  def configure(conf)
    super
    @hatebu = Hatena::Bookmark.new(
      consumer_key:    conf['consumer_key'],
      consumer_secret: conf['consumer_secret'],
      request_token:   conf['request_token'],
      request_secret:  conf['request_secret']
    )   
  end 

  def emit(tag, es, chain)
    es.each do |time, record|
      create_or_edit(record)
    end 
    chain.next
  end 

  def create_or_edit(record)
    begin
      if record['tag'].class == String
        tag = [record['tag']]
      else
        tag = record['tag']
      end
      comment = tag.map{|t| "[#{t}]"}.join('')
      res = @hatebu.create(:url => record['url'], :comment => comment)
      res_comment = res["entry"]["summary"]
      # レスポンスのsummaryが投稿した内容と同一でないとき、
      # ブックマーク済みのURLをcreateしようとしたため無視されている
      if res_comment != comment
        eid = res["entry"]["id"].split("-").last
        # 重複していないものだけtag文字列として追加する
        res_tags = res_comment.scan(/\[(.*?)\]/).map{|t| p t[0]}
        new_tags = (tag - res_tags).map{|t| "[#{t}]"}.join('')
        new_comment = "#{new_tags}#{res["entry"]["summary"]}"
        $log.info(new_comment)
        rese = @hatebu.put_edit(:eid => eid, :url => record['url'], :comment => new_comment)
      end
    rescue => e
      $log.error(e)
      $log.error('hatebu post failed')
    end
  end

end

これは以下のようなJSON構造がemitされてくることを期待しています。

{"tag":["tech","ruby"],"title":"hatena-bookmark | RubyGems.org | your community gem host","url":"https://rubygems.org/gems/hatena-bookmark"}

または

{"tag":"tech","title":"hatena-bookmark | RubyGems.org | your community gem host","url":"https://rubygems.org/gems/hatena-bookmark"}

titleは使ってないのであってもなくてもよい。

すでにブックマーク済みのページだった場合はタグを上書きで追加するようにした。

fluentdのin_httpのようにHTTP待ち受けする機能をつかえば、はてブのWebHook APIを受信してinputもできるようになりそうだが、いまのところ使うあてがない割には大変そうなので今回はやらない