【问题标题】:Changing Stream.filter keywords in realtime. Tweepy实时更改 Stream.filter 关键字。呸呸呸
【发布时间】:2022-03-08 04:02:05
【问题描述】:

我正在开发一个 twitter 机器人,以根据某些关键字流式传输推文并转发到 Telegram。关键字存储在 Excel 文件中,可由用户更改。我目前的做法是:

  • 使用修改后的 on_status 方法实例化子类 tweepy.Stream 对象。
  • 在 main 中启动 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 运行例程将推文转发到电报。

问题出在 stream_tweets 函数中。根据 tweepy 的实现,一旦 stream.filter 被调用,线程执行就会停在那里,直到连接由于任何原因关闭。这不符合我的要求,因为我需要能够修改传递给 stream.filter (search_keywords) 中的 track 参数的参数。但由于线程停止,search_keywords 列表并没有根据线程 1 提供的数据进行更新。

一种可能的解决方法是每次线程 1 注意到关键字文件发生更改时断开流,然后重新连接。但是频繁断开会导致错误。我想到的另一个解决方案是使用 on_status 方法再次过滤推文,然后再将它们传递给电报线程 3,但这违背了 stream.filter() 的目的

有什么推荐的方法吗?这是我第二次使用线程,所以请善待。

干杯:)

【问题讨论】:

    标签: python multithreading tweepy


    【解决方案1】:

    连接到POST statuses/filter 端点后,无法更改流的参数。
    这是 Twitter API 限制。

    一种可能的解决方法是每次线程 1 注意到关键字文件发生更改时断开流,然后重新连接。但是频繁断开连接会导致错误。

    这也是改变流的唯一方法。
    是的,过于频繁地重新连接会使您受到速率限制。一种处理方法是增加一分钟或几分钟的延迟。在断开连接并使用新参数重新连接之前。
    请参阅Twitter API documentation on connecting

    我认为 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)
      

      【讨论】:

        猜你喜欢
        • 2015-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-13
        • 2018-06-06
        • 1970-01-01
        • 1970-01-01
        • 2012-06-10
        相关资源
        最近更新 更多