2012-11-04 11 views
5

Pracowałem z biblioteką Tweepy dla Pythona, aby uzyskać dostęp do publicznego strumienia twitter i napotkałem problem, gdy po uruchomieniu strumienia, to się nie zatrzymuje. Teraz ma to sens w tym, co robi, ale chciałem, aby zaczęło filtrowanie z pustą listą identyfikatorów użytkowników, a po pewnym czasie identyfikatory użytkownika zostaną dodane do listy po tym, jak ktoś zrobi tweetowanie określonego słowa utworu, tak, że po tweetowaniu słowa , tracker zaczyna śledzić wszystkie swoje tweety. Problem polega na tym, że po uruchomieniu strumienia z początkowymi opcjami filtrowania zmiana zmiennych nie wpływa na filtr; po prostu używa początkowych argumentów.Publiczny filtr strumienia Tweepy przez zmienną zmienną

userIDs = [] 

trackWords = ["#Obama"] 

def stream(): 

    s = Stream(auth, StreamListener()) 

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

udało mi się obejść ten problem wcześniej od przypomnienia definicji strumienia ponownie po nowe słowo kluczowe dodaje, ale mam wielu strumieni poszukiwania i umieścić je w oddzielnych wątkach więc wszystkie one mogą działać jednocześnie. Nie wiem, jak odświeżyć wątki, więc próba odświeżenia filtru bez przywoływania definicji wydaje się łatwiejsza.

Jestem dość nowy w programowaniu, więc być może jest to podstawowa koncepcja, której jeszcze nie znam, ale mam nadzieję, że jest prosta sztuczka, aby ją odświeżyć.

Oto cały mój odpowiedni kod, jeśli to pomoże każdemu. Powyższe było szybką rzeczą, aby pomóc pokazać, o czym mówię:

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

Odpowiedz

1

Biblioteka API pythonów Tweepy nie obsługuje zachowania, którego szukasz. Nie można modyfikować parametrów związanych z subskrybowanym strumieniem.

W rzeczywistości sam interfejs Twitter API nie obsługuje zmiany parametrów w połowie strumienia. Posuwają się nawet do ostrzeżenia przed nim. Nie oznacza to, że nie byłoby możliwe, aby to działało (po prostu bądź ostrożny i unikaj przekraczania limitów stawek).

Dostosowałbym twoje podejście do zainicjowania drugiego strumienia z nowymi parametrami zapytania, użyję tweetów, aby uniknąć dwukrotnego przechodzenia/utrzymywania tych samych tweetów, a gdy drugi strumień zostanie ustanowiony, zamkniesz początkowy strumień .

0

Jeśli chcesz zatrzymać tweet na pewien warunek/zapotrzebowania na liczbę tweets, edytować self.num_tweets = 0 i prowadź na nią liczyć i można korzystać jako ogranicznik, w def on_status