2012-11-04 5 views
5

ich mit der Tweepy Bibliothek für Python Arbeiten wurde die Öffentlichkeit Twitter-Stream zugreifen und lief in ein Problem, wo einmal der Strom läuft, ist es nicht zu stoppen. Nun, das macht Sinn für das, was es tut, aber ich wollte, dass es mit einer leeren Liste von Benutzer-IDs filtert und nach einer Weile werden Benutzer-IDs zu der Liste hinzugefügt, nachdem jemand ein bestimmtes Titelwort getweetet hat, so dass sie ein Wort twittern , beginnt der Tracker alle ihre Tweets zu verfolgen. Das Problem ist, dass das Ändern der Variablen den Filter nicht beeinflusst, sobald der Stream mit den anfänglichen Filteroptionen gestartet wird; Es verwendet nur die anfänglichen Argumente.Tweepy öffentlichen Stromfilter durch eine sich ändernde Variable

userIDs = [] 

trackWords = ["#Obama"] 

def stream(): 

    s = Stream(auth, StreamListener()) 

    s.filter(follow = userIDs, track = trackWords) 

ich war in der Lage, um dieses Ziel früher zu erreichen, indem die Stromdefinition wieder, nachdem ein neues Schlüsselwort hinzugefügt wird erinnert, aber ich habe mehrere Streams suchen und ich habe sie in separaten Threads, so dass sie alle gleichzeitig ausgeführt werden können. Ich kann nicht herausfinden, wie die Threads aktualisiert werden. Daher scheint es einfacher zu sein, den Filter zu aktualisieren, ohne die Definition erneut aufzurufen.

Ich bin ziemlich neu in der Programmierung, so vielleicht ist dies ein grundlegendes Konzept ist, weiß ich noch nicht, aber hoffentlich gibt es einen einfachen Trick es auffrischen zu bekommen.

Hier ist meine ganze relevante Code, wenn das jemand hilft. Die oben war nur eine kurze Sache zu zeigen, zu helfen, was ich spreche:

userIDs = [] 
userNames = [] 

account = ['@DMS_423'] 

publicKeyWords = ['the','be','to','of','and','are','is','were','was'] 

class AStreamListener(StreamListener): 
    def on_status(self, status): 
     if status.author.screen_name not in userNames: 
      userNames.append(str(status.author.screen_name)) 
      userIDs.append(str(api.get_user(str(status.author.screen_name)).id)) 
      print status.author.screen_name, "has joined the game." 

def uStream(): 
    s = Stream(auth, StreamListener()) 
    s.filter(follow = userIDs) 

def pStream(): 
    ps = PStream(pAuth, PStreamListener()) 
    ps.filter(track = publicKeyWords) 

def aStream(): 
    adds = Stream(auth, AStreamListener()) 
    adds.filter(track = account) 

t1 = Thread(target = aStream) 
t2 = Thread(target = uStream) 
t3 = Thread(target = pStream) 

def run(): 
    t1.start() 
    t2.start() 
    t3.start() 

run() 

Antwort

1

Die Tweepy Python-Bibliothek API unterstützt nicht das Verhalten, die Sie suchen. Es gibt keine Möglichkeit, die Parameter zu ändern, die mit dem abonnierten Stream verknüpft sind.

In der Tat, die Twitter-API selbst unterstützt keine Parameter der Mitte des Stromes zu ändern. Sie gehen so weit, davor zu warnen. Das soll nicht heißen, dass es nicht möglich wäre, es zum Laufen zu bringen (seien Sie vorsichtig und vermeiden Sie es, die Ratengrenzen zu überschreiten).

Ich würde Ihren Ansatz anpassen, um einen zweiten Stream mit den neuen Abfrageparametern zu initialisieren, verwenden Sie die Tweet-IDs, um zu vermeiden/zweimal die gleichen Tweets zu bestehen, und sobald der zweite Stream erstellt ist, würden Sie den ursprünglichen Stream schließen .

0

Wenn Sie den Tweet zu einer bestimmten Zustand/Anforderung nach Anzahl der Tweets stoppen wollen, bearbeiten self.num_tweets = 0 und eine Zählung hält auf sie und u kann als Limiter, in def verwenden on_status