Twitter ストリーミング API を使用して EventMachine プロセスを実行しています。ストリームのコンテンツが頻繁ではない場合、私は常に問題を抱えています。
スクリプトの最小バージョンは次のとおりです。
require 'rubygems'
require 'eventmachine'
require 'em-http'
require 'json'
usage = "#{$0} <user> <password> <track>"
abort usage unless user = ARGV.shift
abort usage unless password = ARGV.shift
abort usage unless keywords= ARGV.shift
def startIt(user,password,keywords)
EventMachine.run do
http = EventMachine::HttpRequest.new("https://stream.twitter.com/1/statuses/filter.json",{:port=>443}).post(
:head =>{ 'Authorization' => [ user, password ] } ,
:body =>{"track"=>keywords},
:keepalive=>true,
:timeout=>-1)
buffer = ""
http.stream do |chunk|
buffer += chunk
while line = buffer.slice!(/.+\r?\n/)
if line.length>5
tweet=JSON.parse(line)
puts Time.new.to_s+"#{tweet['user']['screen_name']}: #{tweet['text']}"
end
end
end
http.errback {
puts Time.new.to_s+"Error: "
puts http.error
}
end
rescue => error
puts "error rescue "+error.to_s
end
while true
startIt user,password,keywords
end
「iphone」などのキーワードを検索すると、すべてうまくいきます。使用頻度の低いキーワードを検索すると、最後のメッセージから約 20 秒後にストリームが非常に急速に閉じられます。注: その http.error は常に空なので、ストリームが閉じている間は非常に理解しにくいです... 一方、同様の php バージョンは閉じられていないため、おそらく eventmachine/http-em に問題があるようですが、どっちか分からん…