2012-01-22 13 views
5

Sto eseguendo un processo EventMachine utilizzando l'API di streaming di Twitter. Ho sempre un problema se il contenuto dello stream non è frequente.API di streaming EventMachine e Twitter

Ecco la versione minima dello script:

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 

Se cerco una parola chiave come "iPhone", tutto funziona bene Se cerco una parola chiave meno frequentemente usato, il mio flusso continua ad essere chiuso molto rapidamente, circa 20 secondi dopo l'ultimo messaggio. Nota: http.error è sempre vuoto, quindi è molto difficile capire mentre lo stream è chiuso ... All'altro estremo, la versione php nerly simile non è chiusa, quindi sembra probabilmente in discussione con eventmachine/http- ma non capisco quale ...

+0

Qualsiasi idea di come si potrebbe in modo dinamico aggiungere/rimuovere le parole chiave in questo esempio? – tibbon

+0

@tibbon per quanto ne so, l'unico modo per aggiungere/rimuovere parole chiave è quello di fermare il flusso. Per farlo senza perdere alcun tweet, il modo migliore è gestire diversi stream. Ad esempio, aprendo un secondo stream con i nuovi parametri (e un altro account Twitter) e una volta aperto, chiudendo il primo. Ma attenzione alla possibile duplicazione durante il breve periodo in cui entrambi i flussi sono aperti, specialmente in caso di volume elevato – tomsoft

+0

hey @tomsoft Sto usando un codice simile come te ma per me 'http.stream do | chunk | mette fine pezzo 'non stampa nulla ... si blocca lì ... qualsiasi idea? –

risposta

6

È necessario aggiungere le impostazioni per evitare il timeout della connessione. Prova questo:

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

Buona fortuna, Christian

+1

Wow, è stato questo, grazie chris! – tomsoft

+0

Hey @ chris Sto usando un codice simile come te ma per me 'http.stream do | chunk | mette fine pezzo 'non stampa nulla ... si blocca lì ... qualsiasi idea? –