スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Twitter Streaming APIから再接続しながらデータを取得する

Twitter Streaming APIを利用してあるキーワードを含んだツイートを取得します。
Streaming APIは通信を接続したまま、サーバから非連続にデータを受け取ります。
しかし、なんらかの理由で接続が切れることがあるので接続が切れた時に指定回数リトライを行い、それでもだめなら指定秒停止する仕組みにしてみました。

プログラムはrubyで作成しました。
gemのtwitterstreamを利用しています。
またリトライを行うことと、Streaming APIを接続することは独立しているので、リトライをする基底クラスを作りその派生クラスとしてStreaming APIを接続するクラスを作りました。
まずはリトライクラス。
restart_loop.rb

# coding: utf-8

module UvUtil
class RestartLoop
def initialize(retry_count, retry_seconds, wait_seconds)
@retry_count = retry_count
@retry_seconds = retry_seconds
@wait_seconds = wait_seconds
end

def success_restart()
@fail_count = 0
@start_ts = nil
@ex = nil
end

def restart?()
@fail_count > 0
end

def make_error_msg()
"#{@start_ts.to_s} -> #{Time.now.to_s} : #{@ex.to_s}"
end

def main()
while true
@fail_count = 0
@start_ts = nil
@ex = nil
while true
begin
execute()
rescue => e
if 0 == @fail_count
@start_ts = Time.now
@ex = e
end
if @fail_count >= @retry_count
fail_restart()
break
end
@fail_count += 1
sleep(@retry_seconds)
end
end
sleep(@wait_seconds)
end
end
end
end


コンストラクタのretry_countはリトライする数、retry_secondsはリトライ間にsleepする秒数です。wait_secondsはリトライ数に達した後sleepする時間です。
ちなみに、このクラスはStreaming APIだけでなく落ちても何度も実行したいパターンの時に使用できます。

次にStreaming APIのFilterを利用したクラスです。
filter.rb

# coding: utf-8

require 'twitterstream'
require './restart_loop.rb'

RETRY_COUNT = 5
RETRY_SECONDS = 1
WAIT_SECONDS = 30

module Uv
class Filter < UvUtil::RestartLoop
def initialize(retry_count, retry_seconds, wait_seconds, username, password, track)
super(retry_count, retry_seconds, wait_seconds)
@username = username
@password = password
@track = track
end

def execute()
=begin
if !@flag
@flag = true
p "aaa"
raise "error"
end
=end
ts = TwitterStream.new({ :username => @username, :password => @password})
ts.track(@track) do |status|
# ストリーム処理
if status['text']
puts "#{status['user']['screen_name']}: #{status['text']}"
end

# リトライなのかチェック
if restart?()
puts "再起動成功" + make_error_msg()
success_restart()
end
end
end

# リトライ失敗時の処理
def fail_restart()
puts "再起動失敗" + make_error_msg()
end
end
end

filter = Uv::Filter.new(RETRY_COUNT, RETRY_SECONDS, WAIT_SECONDS, ARGV[0], ARGV[1], [ARGV[2]])
filter.main

コマンドライン引数でTwitterのユーザ名、Twitterのパスワード、検索したい言葉を渡します。
execute()の冒頭のコメントを外すと、再起動成功のテストができます。
また、raise "error"だけコメントから外せば再起動失敗のテストができます。
スポンサーサイト

COMMENTS

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。