Streaming API

最近、サイクルロードレースのライブ中継中は#jspocycleというハッシュタグをつけてつぶやくことになっている。また#jspocycleQをつけると番組に質問することができる。番組とタイアップしているわけだが、こんなマイナースポーツでもかなりのスピードでtweetが流れているので、定期的にpollingするタイプのクライアントでは、一度にたくさんのtweetが表示されて、とても追いかけられない。ということで、TwitterのStreaming APIを使ってみた。Twitter Streaming APIをRubyで試してみる - しばそんノートを参考に、Growl対応、最近?URIが変わったのに対応、スクリプトの引数をキーワードに、表示を修正してみた。これで"ruby stream.rb jspocycle"とすれば、リアルタイムにGrowltweetが表示されるので、見やすくて臨場感がアップする。実際、twitterとかiphoneなどポピュラーなキーワードを指定するとすごい勢いで流れていく。ああ、このリアルタイム感こそTwitterなんだと気づきました。これかのTwitterクライアントはどんどんStreaming APIを使っていくでしょう。
ちなみにConnection refusedされる場合、システム環境設定-Growl-ネットワークで、"受信される通知を聞く"と"リモートアプリケーション登録を許可"をチェックしておかないとだめです。
3/11> キーワードはカンマ区切りで複数指定できるようです。ので、"ruby stream.rb jspocycle,jspocycleQ"とすればもれなく拾えます。

#!/usr/bin/env ruby
# coding: utf-8

require 'net/http'
require 'uri'
require 'rubygems'
require 'json'
require 'ruby-growl'

USERNAME = 'your_name'
PASSWORD = 'your_password'

module Net
  class HTTPResponse
    def each_line(rs = "\n")
      stream_check
      while line = @socket.readuntil(rs)
        yield line
      end
      self
    end
  end
end

growl = Growl.new "localhost", "Twitter Stream", ["ruby-growl Notification"]

uri = URI.parse('http://stream.twitter.com/1/statuses/filter.json')
Net::HTTP.start(uri.host, uri.port) do |http|
  request = Net::HTTP::Post.new(uri.request_uri)
  request.set_form_data('track' => ARGV[0])
  request.basic_auth(USERNAME, PASSWORD)
  http.request(request) do |response|
    raise 'Response is not chuncked' unless response.chunked?
    response.each_line("\r\n") do |line|
      begin
        status = JSON.parse(line)
      rescue
        #puts "parse error: #{line}"
        next
      end
      next unless status['text']
      user = status['user']
      puts "----- #{user['screen_name']} ---------------"
      puts "#{status['text']}"
      growl.notify "ruby-growl Notification", user['screen_name'], status['text']
    end
  end
end