EventMachine и API потоковой передачи в Twitter - PullRequest
5 голосов
/ 22 января 2012

Я запускаю процесс EventMachine с использованием потокового API Twitter.У меня всегда есть проблема, если содержимое потока не часто.

Вот минимальная версия скрипта:

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, ноЯ не понимаю, какой ...

1 Ответ

6 голосов
/ 22 января 2012

Вы должны добавить настройки, чтобы предотвратить подключение к тайм-ауту. Попробуйте это:

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

Удачи, Christian

...