Ruby EventMachine和Twitter流式API

Ruby EventMachine和Twitter流式API,ruby,twitter,eventmachine,http-streaming,Ruby,Twitter,Eventmachine,Http Streaming,我正在使用Twitter流API运行一个EventMachine进程。如果流的内容不经常更新,我总是会遇到问题 以下是脚本的最低版本: require 'rubygems' require 'eventmachine' require 'em-http' require 'json' usage = "#{$0} <user> <password> <track>" abort usage unless user = ARGV.shift abort usa

我正在使用Twitter流API运行一个EventMachine进程。如果流的内容不经常更新,我总是会遇到问题

以下是脚本的最低版本:

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
需要“rubygems”
需要“eventmachine”
需要'emhttp'
需要“json”
用法=“#{$0}”
除非user=ARGV.shift,否则中止使用
除非密码=ARGV.shift,否则中止使用
中止使用,除非关键字=ARGV.shift
def startIt(用户、密码、关键字)
EventMachine.rundo
http=EventMachine::HttpRequest.new(“https://stream.twitter.com/1/statuses/filter.json“,{:port=>443}).post(
:head=>{'Authorization'=>[user,password]},
:body=>{“track”=>关键字},
:keepalive=>true,
:超时=>-1)
buffer=“”
http.stream do| chunk|
缓冲区+=块
而line=buffer.slice!(/。+\r?\n/)
如果直线长度>5
tweet=JSON.parse(第行)
将Time.new.to_s+“#{tweet['user']['screen_name']}:#{tweet['text']}”
结束
结束
结束
http.errback{
将Time.new.to_s+“错误:”
放置http.error
}
结束
rescue=>错误
将“错误救援”+错误添加到
结束
虽然是真的
startIt用户、密码、关键字
结束
如果我搜索像“iphone”这样的关键词,一切都很好 如果我搜索一个不太常用的关键字,我的流会很快关闭,大约在最后一条消息发布20秒后。 注意:http.error总是空的,所以关闭流时很难理解。。。
另一方面,nerly相似的php版本尚未关闭,因此可能与eventmachine/http em存在问题,但我不知道是哪一个

您应该添加设置以防止连接超时。 试试这个:

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

你知道如何在这个例子中动态添加/删除关键字吗?@tibbon据我所知,添加/删除关键字的唯一方法是停止流。要做到这一点而不丢失任何tweet,最好的方法是处理多个流。例如,使用新参数打开第二个流(和另一个twitter帐户),一旦打开,就关闭第一个流。但在两个流都打开的小时间段内,要小心可能的重复,特别是在高容量的情况下,Hey@tomsoft我使用与你类似的代码,但对我来说,
http.stream do | chunk | put chunk end
不打印任何东西……它就挂在那里……有什么想法吗?嘿@chris,我使用与你类似的代码,但对我来说,
http.stream do | chunk | put chunk | end
不打印任何东西……它就挂在那里有什么想法吗?