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 ...
Każdy pomysł w jaki sposób można dynamicznie dodawać/usuwać słowa kluczowe w tym przykładzie? – tibbon
@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
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ł? –