我正在研究一个twitter机器人,根据某些关键字流推文并转发到Telegram。关键字存储在excel文件中,用户可以对其进行修改。我目前的方法是:
- 实例化一个子类。使用修改的on_status方法的流对象。在main中启动3个线程
Thread 1检查excel文件中关键字的变化,并相应地更新keyword_queue。
线程2运行这个函数来传输tweet:
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运行一个例程将tweet转发到telegram。
问题是在stream_tweets功能。根据tweepy的实现,一次流。Filter被调用时,线程的执行将在那里暂停,直到连接由于任何原因而关闭。这不能很好地满足我的需求,因为我需要能够修改流中传递给track参数的参数。过滤器(search_keywords)。但是由于线程处于停滞状态,search_keywords列表不会根据线程1提供的数据进行更新。
一个可能的解决方法是每次线程1注意到关键字文件的变化时断开流,然后重新连接。但是频繁的断线会导致错误。我想到的另一个解决方案是,在将tweet传递给电报线程3之前,使用on_status方法再次过滤tweet,但这有点违背了stream.filter()
的目的。有什么推荐的方法吗?这是我第二次使用线程,所以请友好。
欢呼:)
在连接到POST状态/过滤器端点后,无法更改流的参数。
这是一个Twitter API限制。
一旦可能的解决方案是断开流每次线程1注意到关键字文件的变化,然后重新连接。但是频繁的断线会导致错误。
这将是改变流的唯一方法。
是的,过于频繁地重新连接会使您的速率受到限制。处理这个问题的一种方法是在断开连接并重新连接新参数之前添加一分钟或几分钟的延迟。
参见Twitter API文档。
你需要得到一个无限循环来检查你的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)