2010/12/15

Twitter User Streams APIを使ってみる

やってみようやってみよう思いながらずっとやっていなかったTwitterのUser Streams APIを使ってみました。こうやってまたRuby熱が再燃してるのは札幌Ruby会議03に参加したおかげです。やっぱりあぁいうイベントに参加するとモチベーションが高まりますねー。本来はそのモチベーションをいつも維持しなきゃいけないのかも知れないけれど、まぁ、頑張ります。

で、あちこちのWebサイトを参考にしながら作ったのが以下。多分Tweet以外のイベントも取得出来ると思うんだけど、ソレは次回の課題として、とりあえずFriends_timelineのTweetを取得して流しっぱなしにします。
タイムラインを流し読みするのは楽しいのですねぇ。特定のキーワードだけ色変えたり太字にして表示とか出来ると面白そうだな。このAPIを使った次のステップも考えてみようと思います。

#!/usr/bin/ruby -Ku

require 'rubygems'
require 'oauth'
require 'net/https'
require 'json'

# OAuth 認証データ
CONSUMER_KEY        = "HOGEHOGE"
CONSUMER_SECRET     = "HOGEHOGE"
ACCESS_TOKEN        = "HOGEHOGE"
ACCESS_TOKEN_SECRET = "HOGEHOGE"

consumer = OAuth::Consumer.new(
  CONSUMER_KEY,
  CONSUMER_SECRET,
  :site => 'http://twitter.com'
)

token = OAuth::AccessToken.new(
  consumer,
  ACCESS_TOKEN,
  ACCESS_TOKEN_SECRET
)

# http://dev.twitter.com/pages/user_streams
uri = URI.parse('https://userstream.twitter.com/2/user.json')

begin
  # userstreamにはSSLでアクセスする
  https = Net::HTTP.new(uri.host, uri.port)
  https.use_ssl = true
  https.verify_mode = OpenSSL::SSL::VERIFY_PEER
  https.verify_depth = 5
  # 接続先サーバのルートCA証明書をダウンロードしてきて指定
  https.ca_file = './ca.cer'

  https.start do |https|
    req = Net::HTTP::Get.new(uri.request_uri)
    req.oauth!(https, consumer, token)

    https.request(req) do |res|
      res.read_body do |chunk|
        # chunked = falseなら例外を発生
        raise 'Response is not chunked' unless res.chunked?

        # JSONのパースに失敗したらスキップして次へ
        status = JSON.parse(chunk) rescue next

        # textパラメータを含まないものはスキップして次へ
        next unless status['text']
        user = status['user']
        puts "@" + "#{user['screen_name']}: #{status['text']}"
      end
    end
  end
rescue
  print "RuntimeError: ", $!, "\n";
end

続きを書きました→Twitter User Streams APIを「より一層」使ってみる