2012-01-22 11 views
5

मैं ट्विटर स्ट्रीमिंग एपीआई का उपयोग कर इवेंटमैचिन प्रक्रिया चला रहा हूं। यदि स्ट्रीम की सामग्री अक्सर नहीं होती है तो मुझे हमेशा एक समस्या है।इवेंटमैचिन और ट्विटर स्ट्रीमिंग एपीआई

यहाँ स्क्रिप्ट के न्यूनतम संस्करण है:

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 संस्करण बंद नहीं है, इसलिए संभवतः इवेंटमाचिन/http- एम लेकिन मैं नहीं समझता कि कौन सा ...

+0

कैसे आप गतिशील रूप से हटाने के इस उदाहरण में कीवर्ड जोड़ सकते हैं/के किसी भी विचार: इस प्रयास करें? – tibbon

+0

@tibbon जहां तक ​​मुझे पता है, कीवर्ड जोड़ने/निकालने का एकमात्र तरीका स्ट्रीम को रोकना है। किसी भी ट्वीट को खोए बिना इसे करने के लिए, सबसे अच्छा तरीका कई धाराओं को संभालना है। उदाहरण के लिए, नए पैरामीटर (और एक अलग ट्विटर खाता) के साथ दूसरी स्ट्रीम खोलना और एक बार खोला गया, पहले को बंद करना। लेकिन छोटी अवधि के दौरान संभावित डुप्लिकेशन के बारे में सावधान रहें, जहां दोनों धाराएं खोली गई हैं, खासकर उच्च मात्रा – tomsoft

+0

हे @ टॉमसोफ्ट के मामले में मैं आपके जैसे समान कोड का उपयोग कर रहा हूं लेकिन मेरे लिए '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

हे @ क्रिस मैं आपके जैसे समान कोड का उपयोग कर रहा हूं लेकिन मेरे लिए 'http.stream do | chunk | चंक एंड रखता है 'कुछ भी प्रिंट नहीं करता है ... यह सिर्फ वहां लटकता है .. कोई विचार? –

संबंधित मुद्दे