2012-11-04 2 views
5

Я работал с библиотекой Tweepy для python, чтобы получить доступ к публичному потоку твиттера и столкнулся с проблемой, когда, как только поток работает, он не останавливается. Теперь это имеет смысл для того, что он делает, но я хотел, чтобы он начал фильтрацию с пустым списком идентификаторов пользователей, и через некоторое время пользовательские идентификаторы добавляются в список после того, как кто-то твиттит определенное слово трека, чтобы после того, как они произнесли слово , трекер начинает отслеживать все свои твиты. Проблема заключается в том, что как только поток запускается с параметрами исходного фильтра, изменение переменных не влияет на фильтр; он просто продолжает использовать начальные аргументы.Открытый фильтр потока Twifty изменяющейся переменной

userIDs = [] 

trackWords = ["#Obama"] 

def stream(): 

    s = Stream(auth, StreamListener()) 

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

я смог обойти эту проблему раньше, вспоминая определение потока снова после того, как добавляется новое ключевое слово, но у меня есть несколько потоков поиска, и я положил их в отдельных потоках, поэтому все они могут работать одновременно. Я не могу понять, как обновить потоки, поэтому попытка обновления фильтра, не задумываясь над определением, выглядит проще.

Я довольно новичок в программировании, поэтому, возможно, это фундаментальная концепция, которую я еще не знаю, но, надеюсь, есть простой трюк, чтобы заставить ее обновиться.

Вот мой код, если это поможет кому угодно. Выше было просто быстро вещь, чтобы помочь показать то, что я говорю:

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

ответ

1

Tweepy библиотека Python API не поддерживает поведение, которое вы ищете. Невозможно изменить параметры, связанные с потоком, на который подписаны.

Фактически, сам API Twitter не поддерживает изменение параметров в середине потока. Они догадываются об этом. Это не означает, что было бы невозможно заставить его работать (просто будьте осторожны и избегайте превышения лимитов).

Я бы отрегулировал ваш подход для инициализации второго потока с новыми параметрами запроса, используйте идентификаторы твитов, чтобы избежать передачи/сохранения одних и тех же твитов дважды, а затем, как только 2-й поток будет установлен, вы должны закрыть начальный поток ,

0

Если вы хотите, чтобы остановить чирикать в определенное состояние/требования по количеству твитов, редактировать self.num_tweets = 0 и сохранить счетчик на нем, и вы можете использовать в качестве ограничителя, в Защиту on_status

Смежные вопросы