2014年11月21日金曜日

Ruby2.0でTwitterStreamingAPI (1.1) を使う(改):TweetStream

 以前に、TwitterStreamingAPI 1.1 をhttp接続で使う方法を掲載しました。
 その方法では問題が発生する場合があることがわかり、その対処を行ったので紹介します。

 その問題は、最近の(処理速度の速い)PCを使うと気がつかないかもしれません。
 しかし、少し前の(処理速度の遅い)PCを使うとCPU100%状態が続き、プログラムの処理が追いつかなくなって、エラー終了することが頻繁に発生します。

 以前はとりあえず動作することが目的だったので、速いPCで動作すれば良かったのですが、その後、限られた資源の効率よい役割配分が求められたので、必要に迫られて試行錯誤しました。


 結論としては、以前は不採用としたTwitterStreamを使う方法できちんと動作することを確認しました。

 古いPC上でのCPU負荷を、ざっくりとした比較をすると
http接続による処理  → 100%オーバー
TwitterStreamを使用 → 数%程度
となりました。


■前準備
インストールには、Development Kitが必要です。
(1) Linux
ruby-develをインストールします
yum install ruby-devel

そのほかに、g++など基本的な開発ツール見つからずにエラーになる場合もあるようです。適宜インストールしてください。

(2) Windows
Develipment kitをインストールします。
次のページにわかりやすい説明があるのでご覧ください

■gemのインストール
gem install tweetstream


■サンプルコード
1時間単位で別ファイルに、TweetID、日時、ユーザID、Tweet内容を出力します。
コンシュマーキーやアクセストークンは別途取得してください。
require "tweetstream"
require "date"

consumer_key    = "xxxxxxxx"
consumer_secret = "xxxxxxxx"
access_token           = "xxxxxxxx"
access_token_secret    = "xxxxxxxx"
TweetStream.configure do |config|
 config.consumer_key       = consumer_key
 config.consumer_secret    = consumer_secret
 config.oauth_token        = access_token
 config.oauth_token_secret = access_token_secret
 config.auth_method        = :oauth
end

TweetStream::Client.new.sample do |status|
 next unless status.user

 dt = status.created_at.to_s.split( /[ :-]/ )
 fname = "#{dt[0]}#{dt[1]}#{dt[2]}_#{dt[3]}.txt"
 daytime = "#{dt[0]}-#{dt[1]}-#{dt[2]} #{dt[3]}:#{dt[4]}:#{dt[5]}"

 f = open( fname, "a:utf-8" )
 f.puts "#{status.id}\t#{daytime}\t#{status.user.screen_name}\t#{(status.text).gsub(/[\r\n\t]+/, " ")}"
 f.close
end
exit


※Webを検索するとTweetStreamにパッチの必要性との情報もありますが、最新環境ではパッチ不要で動作しています。RubyやGemのバージョンおよび動作環境に依存する場合もあるので、状況に応じて対応してください。