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 ...
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
@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
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? –