2013-01-05 23 views
6

Używam tweepy do przesyłania strumieniowego niektórych tweetów. To jest moja procedura:Tweepy zatrzymuje się po kilku godzinach

import tweepy 
import json 

consumer_key = "***" 
consumer_secret = "***" 
access_token_key="***" 
access_token_secret="***" 

auth1 = tweepy.OAuthHandler(consumer_key, consumer_secret) 
auth1.set_access_token(access_token_key, access_token_secret) 
api = tweepy.API(auth1) 

class StreamListener(tweepy.StreamListener): 
    def on_status(self, status): 
     try: 
      print status.text 
     except Exception, e: 
      print 'Encountered Exception Tweet:', e 
      pass 
     return True 

    def on_error(self, status_code): 
     print 'Encountered error with status code:' + repr(status_code) 
     return True 

    def on_data(self, data): 
     if 'in_reply_to_status_id' in data: 
      status = tweepy.Status.parse(self.api, json.loads(data)) 
      if self.on_status(status) is False: 
       return True 
     elif 'delete' in data: 
      delete = json.loads(data)['delete']['status'] 
      if self.on_delete(delete['id'], delete['user_id']) is False: 
       return True 
     elif 'limit' in data: 
      if self.on_limit(json.loads(data)['limit']['track']) is False: 
       return True 
     return True 

    def on_timeout(self): 
     print 'Timeout...' 
     return True 

l = StreamListener() 
streamer = tweepy.Stream(auth=auth1, listener=l, timeout=36000000) 

setTerms = ['enbrel'] 
streamer.filter(follow=None,track = setTerms) 

Po dwóch/trzech godzinach procedura zatrzymuje się. Brak błędu sygnału, timeout itp. Po prostu nie dostaje więcej tweetów. Gdzie robię źle?

+0

znasz stanie odtworzyć to zachowanie? To mógł być problem z połączeniem sieciowym lub problemy z interfejsem API Twittera. –

Odpowiedz

7

Spróbuj dodać do swojej klasy metodę on_disconnect. Może to oznaczać, że Twitter cię rozłącza (nie jest to błąd, także nie ma limitu czasu) i nie radzisz sobie z tym. Jeśli chcesz, możesz inaczej obsługiwać różne błędy na Twitterze.

def on_disconnect(self, notice): 
    """Called when twitter sends a disconnect notice 

    Disconnect codes are listed here: 
    https://dev.twitter.com/docs/streaming-apis/messages#Disconnect_messages_disconnect 
    """ 
    return 

Sprawdź streaming module z tweepy aby uzyskać więcej informacji.

Możesz także spróbować włączyć ostrzeżenia o przeciągnięciu w swoim streamer.filter(). Poniżej znajdują się wszystkie opcje i ich domyślne wartości ze źródła Tweepy:

+0

Starą odpowiedź, którą znam, ale czy mógłbyś to trochę rozwinąć? Chcę ponownie nawiązać połączenie on_disconnect, ale nie jestem pewien, jak najlepiej to zrobić. –

+0

Wyjaśniłem to: w mojej własnej pętli sprawdź 'stream.running'. Jeśli tak nie jest, usuń strumień i uruchom nowy po "n" sekundach. –

1

Możesz zainicjować API z czasu, aby zacząć

api = tweepy.API(auth1,timeout=60)