2012-01-22 48 views
5

我正在使用Twitter流媒体API运行EventMachine流程。如果流的内容不经常出现,我总是会遇到问题。EventMachine和Twitter流媒体API

这里是脚本的最小版本:

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-但我不明白哪一个...

+0

的你怎么可以动态地在这个例子中添加/删除关键字任何想法? – tibbon

+0

@tibbon据我所知,添加/删除关键字的唯一方法是停止流。要做到这一点,而不放松任何推文,最好的办法是处理好几个流。例如,用新参数(和一个不同的Twitter帐户)打开第二个流,并打开第一个流,关闭第一个流。但要注意在两个流都打开的小时期内可能出现的复制,特别是在大容量的情况下 – tomsoft

+0

hey @tomsoft我使用类似的代码,但对于我来说'http.stream do | chunk |把大块结束'不打印任何东西......它只是挂在那里..任何想法? –

回答

6

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

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

祝你好运, 基督教

+1

哇,这是,谢谢克里斯! – tomsoft

+0

嗨@chris我使用类似的代码就像你,但对我'http.stream do | chunk |把大块结束'不打印任何东西......它只是挂在那里..任何想法? –