Streaming API
最近、サイクルロードレースのライブ中継中は#jspocycleというハッシュタグをつけてつぶやくことになっている。また#jspocycleQをつけると番組に質問することができる。番組とタイアップしているわけだが、こんなマイナースポーツでもかなりのスピードでtweetが流れているので、定期的にpollingするタイプのクライアントでは、一度にたくさんのtweetが表示されて、とても追いかけられない。ということで、TwitterのStreaming APIを使ってみた。Twitter Streaming APIをRubyで試してみる - しばそんノートを参考に、Growl対応、最近?URIが変わったのに対応、スクリプトの引数をキーワードに、表示を修正してみた。これで"ruby stream.rb jspocycle"とすれば、リアルタイムにGrowlでtweetが表示されるので、見やすくて臨場感がアップする。実際、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