2012-01-22 8 views
5

私は、TwitterストリーミングAPIを使用してEventMachineプロセスを実行しています。ストリームのコンテンツが頻繁ではない場合は、常に問題があります。ここでEventMachineとTwitterストリーミングAPI

は、スクリプトの最小バージョンです:

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-私は理解していません。どれがどちらかを理解していません。

+0

あなたが動的にこの例では、キーワードを追加/削除することができる方法の任意のアイデア: これを試してみてください? – tibbon

+0

@tibbon私が知る限り、キーワードを追加/削除する唯一の方法は、ストリームを停止することです。つぶやきを失うことなくそれを行うには、いくつかのストリームを処理するのが最善の方法です。たとえば、新しいパラメータ(および別のツイッターアカウント)を使用して2番目のストリームを開き、1番目のストリームを開いて最初のストリームを閉じます。しかし、両方のストリームが開かれている小さな期間、特に大量の場合に重複が起こることに注意してください。 – tomsoft

+0

ちょっと@tomsoft私と同じようなコードを使っていますが、私にとっては 'http.stream do | chunk |チャンクの終わりは何も印刷されません...それはちょうどそこにぶら下がっています..何考えですか? –

答えて

6

接続がタイムアウトしないように設定を追加する必要があります。

http = EventMachine::HttpRequest.new(
    "https://stream.twitter.com/1/statuses/filter.json", 
    :connection_timeout => 0, 
    :inactivity_timeout => 0 
).post(
    :head => {'Authorization' => [ user, password ] } , 
    :body => {'track' => keywords} 
) 

幸運、 クリスチャン

+1

うわー、これは、ありがとう、クリスだった! – tomsoft

+0

ちょっと@chris私はあなたのような同様のコードを使用していますが、私にとっては 'http.stream do | chunk |チャンクの終わりは何も印刷されません...それはちょうどそこにぶら下がっています..何考えですか? –

関連する問題