読者です 読者をやめる 読者になる 読者になる

プログラマでありたい

おっさんになっても、プログラマでありつづけたい

RubyでTwitter Streaming APIを使ってみる

プログラム

 何かTwitterを使ったサービスを作ってみたくて、時間が空いている時にTwitterの仕様を眺めています。
TwitterはAPIが充実していて、非常に開発者フレンドリーです。
ただAPIの使用については回数制限などある程度の制約があるので、目的に沿って使う必要があります。
主なAPIは3種類あって、それぞれの特徴と制約です。

  • REST API Methods

 ユーザーが行う操作に関するAPIです。
一般的なTwitterクライアントソフトは、これを使って作られています。
IPとアカウントベースでの制限で、1時間に150回まで
申請をして許可が取れれば20,000回まで増やせるようです。

  • Search API Methods

 名前の通り検索系のAPIです。
IPアカウントベースの制限。REST APIに比べて、極めて多い回数を使えるようです。
これも申請によって回数が増やせるようです。

 上記二つに比べて異色のAPIなのがStreaming APIです。回数制約がなく使える所が素敵です。
SearchとREST APIは一回ごとに接続切断して使う事が基本です(pull型)
これに対してStreaming APIはつなぎっぱなしで、Twitterのサーバーの方から情報を送ってきてくれます。(push型)
検索や統計等で使うのにナイスなAPIです。
 Streaming APIの中にも大きく二つの系統があります。
全部のtimelineを拾ってくる系統と、取得対象のuserを絞っての系統です。
 firehose, gardenhose, sample(spritzer)は、public_timelineに関するAPIです。
firehoseは、全てのpublic_timelineが流れてくるようです。2010/03/09時点では、Google,Microsoft,Yahooの他にベンチャー系の7社のみが接続許可をされています。ちなみにGoogle,Microsoft,Yahooの3社からのライセンス料は、推定で年間30億円だとか。
gardenhoseは、ランダムにサンプリングされた発現を取得できます。これも利用には許可が必要です。
sample(旧spritzer)は、gardenhoseより更に少なくなったサンプリングです。(これでもじゃかじゃか流れてきます。)
 birddog, shadow, filter(follow)はuser_timelineに関するAPIです。
briddogは40万ユーザ、shadowは8万ユーザ、filterは400ユーザまでfollowできます。
briddogとshadowは許可制です。


Search,REST APIの制限回数は割ところころ変わっているようです。
またTwitter本体の負荷によって、一時的に制限が変わることもあるようです。


以下、サンプルアプリです。
しばそんノートさんのTwitter Streaming APIをRubyで試してみるそのままです。

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

require 'net/http'
require 'uri'
require 'rubygems'
require 'json'

USERNAME = '_USERNAME_' # ここを書き換える
PASSWORD = '_PASSWORD_' # ここを書き換える

uri = URI.parse('http://stream.twitter.com/spritzer.json')
Net::HTTP.start(uri.host, uri.port) do |http|
  request = Net::HTTP::Get.new(uri.request_uri)
  # Streaming APIはBasic認証のみ
  request.basic_auth(USERNAME, PASSWORD)
  http.request(request) do |response|
    raise 'Response is not chuncked' unless response.chunked?
    response.read_body do |chunk|
      # 空行は無視する = JSON形式でのパースに失敗したら次へ
      status = JSON.parse(chunk) rescue next
      # 削除通知など、'text'パラメータを含まないものは無視して次へ
      next unless status['text']
      user = status['user']
      puts "#{user['screen_name']}: #{status['text']}"
    end
  end
end

※Twitterのサーバー状況によって、つながらない時も多々あります。
 実際に使うには、その辺りの処理とかが必要になるかと思います。


API Documentを読んでいると、Streaming APIに接続するアプリは取得するだけに専念させることをパースするのが良いようです。
パースして格納とかは別アプリにすると。納得です。


参考:
Twitter API Wiki / Twitter API Documentation
Twitter API - TwitterまとめWiki
Twitter API 仕様書(勝手に日本語
Twitter Streaming APIをRubyで試してみる
Rubyから「Twitter Streaming API」を利用して日本語のつぶやきを取得するスクリプト。:青心工機:So-netブログ

関連:
5分で作るTwitterクライアント