bulkitem Diary

TOPぺーじはこちら。
«前の日記(2008/02/23 Sat) 最新 次の日記(2008/02/27 Wed)»

2008/02/24 Sun [長年日記]

TwitterのReplyを監視する

Twitterをやっていると、いつのまにかタイムラインをダラダラ読んでしまうので、基本的にMoodBlast*1でつぶやくだけにしている。

たまにwebからログを見た時に、気付かぬうちに replies を貰ってたりする事がある。気付かぬうちも何も見てないからなんだけど。

それは気になるけどP3とかを使うとこれまたついついタイムラインを読みふけってしまう。という事で、定期的にTwitter API経由でrepliesをポーリングして、変化があったらRuby-Growlを使ってGrowlで通知する様にした。

15分ぐらいで出来るかなと思ったけど、1時間以上もこれを動かすのに費やした。コードは動けば良いのですぐ書き上がるのだけど、OSXでポーリングするあたりで苦戦。launchdの設定がXMLベースでよくわからなかったので、試行錯誤して時間を無駄にしたあげく結局妥協してcronで動かすという最悪の結末。

なんにしても時間取られてますね。

#!/opt/local/bin/ruby -Ku

#$DEBUG   = true
$VERBOSE = true

require 'rubygems'
require 'ruby-growl'
require 'open-uri'
require 'rss'
require 'pstore'

module Twitter
  AUTH_INFO = ['userid', 'password']
  REPLIES  = 'http://twitter.com/statuses/replies.rss'
  DATABASE = '/Users/bulkitem/twitter/data.txt'

  class Status
    attr_accessor :uid, :date, :status, :guid
    def initialize
      @uid = nil
      @date = nil
      @status = nil
      @guid = nil
    end
  end

  class RepliesWatch
    def initialize(notifer)
      @notifer = notifer
      @data = nil
      @update = false
    end

    def load
      db = PStore.new(Twitter::DATABASE)
      db.transaction do
        @data = db['guid']
      end
      @data = Hash.new if @data.nil?
    end

    def save
      if @update
        db = PStore.new(Twitter::DATABASE)
        db.transaction do
          db['guid'] = @data
        end
      end
    end

    def get
      open(Twitter::REPLIES, {:http_basic_authentication => Twitter::AUTH_INFO}) do |f|
        if f.status == ['200', 'OK']
          begin
            rss = RSS::Parser::parse(f.read)
          rescue RSS::InvalidRSSError
            rss = RSS::Parser::parse(f.read, false)
          end
          tmp = Hash.new
          obj = Twitter::Status.new
          rss.items.each do |item|
            obj.uid, obj.status = item.title.split(': ', 2)
            obj.date = item.pubDate
            obj.guid = item.guid
            unless @data.has_key?(obj.guid.to_s)
              @notifer.notify("ruby-growl Notification", obj.uid, obj.status)
              @update = true
            end
            tmp.store(obj.guid.to_s, obj.dup)
          end
          @data = tmp
        end
      end
    end

  end
end

begin
  tw = Twitter::RepliesWatch.new(Growl.new('localhost', "ruby-grow", ["ruby-growl Notification"]))
  tw.load()
  tw.get()
  tw.save()
rescue Exception => e
  puts e.to_s
end

しかし、なんでRepliesWatchのコンストラクタにGrowlインスタンス渡してるのか意味が分からん設計だなぁ。

*1 投稿用UIだけを持っているクライアント。Twitter以外にもTumblr等のサービスにも一括投稿が出来たりする。私はTwitter投稿用にしか使ってないけど。

Tags: web ruby | Bookmark:

さんさん録

さんさん録 (1) (ACTION COMICS) さんさん録 (2) (ACTION COMICS)

最近はこうの史代続きですが。

今回は定年後の男性と、息子家族の生活の話で、退職後妻に先立たれ息子家族と同居する事になった男性が主夫としてやりがいを感じたり、気付きを得たり、感慨に耽ったり、世話を焼いたりする話。

周囲は色々ある物の、家族は平和で*1淡々としている。先立った妻が残した「奥田家の記録」がタイトルさんさん録の由来なんだけど、この生活ノート自体は意外と話に絡んでくる事無くテーマと思われる主夫業もそんなに存在感は無い。やっぱり人間ドラマ中心。

あんまり可愛く無い孫として描かれている乃菜が、個人的には設定に反して愛らしかった。2巻で完結。読みやすくてありがたい。

*1 視点の問題もあるでしょうが。

Tags: こうの史代 book | Bookmark:

Subscribe with Fastladder Subscribe with livedoor Reader Bloglinesで閲読登録 add to google add to HATENA::RSS
2005|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|07|
日記検索
コンテンツ
作ったもの
ツール
最近のエントリー
タグクラウド
連絡先