2012-01-22 17 views
5

Tôi đang chạy một tiến trình EventMachine bằng cách sử dụng API phát trực tuyến Twitter. Tôi luôn gặp sự cố nếu nội dung của luồng không thường xuyên.EventMachine và Twitter streaming API

Dưới đây là phiên bản tối thiểu của kịch bản:

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 

Nếu tôi tìm kiếm một từ khóa như "iphone", mọi thứ hoạt động tốt Nếu tôi tìm kiếm từ khoá ít thường xuyên được sử dụng, dòng của tôi giữ được đóng rất nhanh, khoảng 20 giây sau tin nhắn cuối cùng. Lưu ý: http.error đó luôn trống, do đó rất khó hiểu khi luồng được đóng ... Ở đầu kia, phiên bản php tương tự trước đây không bị đóng, vì vậy có vẻ như đang xảy ra với eventmachine/http- em nhưng tôi không hiểu cái nào ...

+0

Bất kỳ ý tưởng về cách bạn tự động có thể thêm/gỡ bỏ từ khóa trong ví dụ này? – tibbon

+0

@tibbon theo như tôi biết, cách duy nhất để thêm/xóa từ khóa là dừng luồng. Để làm điều đó mà không mất bất kỳ tweet, cách tốt nhất là để xử lý một số dòng. Ví dụ, mở một dòng thứ hai với các tham số mới (và một tài khoản twitter khác) và một khi đã được mở, đóng đầu tiên. Nhưng hãy cẩn thận về sự trùng lặp có thể xảy ra trong khoảng thời gian nhỏ mà cả hai dòng được mở, đặc biệt trong trường hợp khối lượng cao – tomsoft

+0

hey @tomsoft Tôi đang sử dụng mã tương tự như bạn nhưng đối với tôi 'http.stream do | chunk | đặt chunk end' doesnt in bất cứ điều gì ... nó chỉ treo ở đó .. chúng tôi ý tưởng? –

Trả lời

6

Bạn nên thêm cài đặt để ngăn kết nối của bạn hết thời gian chờ. Hãy thử điều này:

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

Chúc may mắn, Christian

+1

Chà, nó là thế này, cảm ơn chris! – tomsoft

+0

Hey @chris Tôi đang sử dụng mã tương tự như bạn nhưng đối với tôi 'http.stream do | chunk | đặt chunk end' doesnt in bất cứ điều gì ... nó chỉ treo ở đó .. chúng tôi ý tưởng? –