Изменение ключевых слов Stream.filter в режиме реального времени. Tweepy

#python #multithreading #tweepy

Вопрос:

Я работаю над ботом Twitter для потоковой передачи твитов на основе определенных ключевых слов и пересылки в Telegram. Ключевые слова хранятся в файле Excel и могут быть изменены пользователем. Мой текущий подход:

  • Создание экземпляра подкласса tweepy.Объект потока с измененным методом on_status.
  • Запустите 3 потока в главном:
    • Поток 1 проверяет файл Excel на наличие изменений в ключевых словах и соответствующим образом обновляет keyword_queue.


    • Поток 2 запускает эту функцию для потоковой передачи твитов:
         def stream_tweets(keywords_queue, stream):
      
            while True:
            search_keywords = keywords_queue.get()
            print("Search keywords for filter: {}".format(search_keywords))
            if search_keywords:
                stream.filter(track=search_keywords)
       
    • Поток 3 запускает процедуру для пересылки твитов в telegram.



Проблема в функции stream_tweets . Согласно реализации tweepy, после вызова stream.filter выполнение потока приостанавливается до тех пор, пока соединение не будет закрыто по какой-либо причине. Это плохо работает с моими требованиями, потому что мне нужно иметь возможность изменять аргументы, передаваемые параметру track в stream.filter (search_keywords). Но поскольку поток остановлен, список search_keywords не обновляется в соответствии с данными, предоставленными потоком 1.

Один из возможных обходных путей — отключать поток каждый раз, когда поток 1 замечает изменение в файле ключевых слов, а затем повторно подключаться. Но частые отключения приводят к ошибкам. Другим решением, о котором я подумал, было использование метода on_status для повторной фильтрации твитов перед передачей их в telegram Thread 3, но это противоречит цели stream.filter()

Есть ли какой-либо рекомендуемый способ сделать это? Это мой 2-й раз, когда я использую потоки, поэтому, пожалуйста, будьте добры.

Приветствия 🙂

Ответ №1:

Невозможно изменить параметры потока после подключения к конечной точке POST statuses / filter.
Это ограничение API Twitter.

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

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

Я думаю, что фильтруемый поток API v2 позволяет добавлять и удалять правила при подключении к потоку, но Tweepy пока этого не поддерживает. Для этого см. https://github.com/tweepy/tweepy/issues/1472 .

Ответ №2:

Вам нужно получить бесконечный цикл, чтобы проверить, есть ли какие-либо изменения в ключевых словах из вашего файла Excel. Если есть какие-либо изменения, вам нужно проверить, запущен ли прослушиватель, чтобы отключить его, если это так. После этого вы можете снова начать прослушивание с вашими новыми ключевыми словами.

Чтобы проверить, выполняется ли:

 if stream.running is True:
    stream.disconnect()
    time.sleep(5) # Give some time before reconnect
 

Ваш код будет:

 def stream_tweets(keywords_queue, stream):
    while True:
        search_keywords = keywords_queue.get()
        print("Search keywords for filter: {}".format(search_keywords))
        if search_keywords:
            if stream.running is True:
                stream.disconnect()
                time.sleep(5) # Give some time before reconnect
            stream.filter(track=search_keywords)