2012-01-22 7 views
5

Używam procesu EventMachine przy użyciu Twitter streaming API. Zawsze mam problem, jeśli treść strumienia nie jest często.EventMachine i Twitter streaming API

Oto minimalna wersja skryptu:

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 

Gdybym wyszukiwania dla słowa kluczowego jak „iPhone”, wszystko działa dobrze Gdybym wyszukiwać rzadziej używane hasła, mój strumień utrzymuje się zamknięte bardzo szybko, około 20 sekund po ostatniej wiadomości. Uwaga: że http.error jest zawsze pusty, więc bardzo trudno go zrozumieć, gdy strumień jest zamknięty ... Po drugiej stronie, nerly podobna wersja php nie jest zamknięta, więc prawdopodobnie wydaje się problem z eventmachine/http- em, ale nie rozumiem, który ...

+0

Każdy pomysł w jaki sposób można dynamicznie dodawać/usuwać słowa kluczowe w tym przykładzie? – tibbon

+0

@tibbon, o ile wiem, jedynym sposobem dodania/usunięcia słowa kluczowego jest zatrzymanie strumienia. Aby to zrobić bez utraty tweeta, najlepiej jest obsłużyć kilka strumieni. Na przykład, otwierając drugi strumień z nowymi parametrami (i innym kontem na Twitterze) i po otwarciu, zamykając pierwszy. Ale uważaj na ewentualne powielanie w małym okresie, w którym oba strumienie są otwierane, szczególnie w przypadku wysokiego wolumenu – tomsoft

+0

hej @ tomsoft Używam podobnego kodu jak ty, ale dla mnie 'http.stream do | chunk | kładzie kawałek końca "nie drukuje niczego ... po prostu wisi tam ... nie pomysł? –

Odpowiedz

6

Powinieneś dodać ustawienia, aby uniemożliwić połączenie z limitem czasu. Spróbuj tego:

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} 
) 

Powodzenia Christian

+1

Wow, to było to, dzięki chris! – tomsoft

+0

Hej @chris Używam podobnego kodu jak ty, ale dla mnie 'http.stream do | chunk | kładzie kawałek końca "nie drukuje niczego ... po prostu wisi tam ... nie pomysł? –