Tweepy StreamListener在一段时间后过时了 - 如何正确维护流连接?

时间:2017-12-13 15:47:39

标签: python twitter tweepy supervisord

我正在构建一个我想要持续运行的机器人(总是在/正在聆听)并且在一段时间后,Tweepy twitter API StreamListener出现问题并且变得没有响应。

当我启动它时,它运行良好并且响应它应该 - 但是如果我离开它而没有从流中获得任何输入它就会僵尸化。不退出/死亡,但也没有获得任何新数据。

我认为我有逻辑来解释超时,但显然要么我做得不对,要么就是问题。我应该补充一点,我正在使用supervisord将其作为Ubuntu中的守护进程运行。

我已经确定了两种可能的解决方案,但想知道是否有“正确”的方法。这是我当前的设置(不包括on_data,效果很好):

from tweepy import StreamListener
from tweepy import Stream

class StreamListener(tweepy.StreamListener):

    def on_data(self, tweet_payload):
        # do some stuff

    def on_error(self, status_code):
        print >> stderr, "Encountered an error with status code:" 
        sys.stderr.flush()

        # if the error for bad credentials, end stream
        if status_code == 401:
            return False

        # rate limit, close
        if status_code == 420:
            return False

    # When timed out
    def on_timeout(self):

        # Print timeout message
        print >> stderr, "Timeout..."

        # Wait 10 seconds
        time.sleep(60)

        # Return nothing
        return

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)

logging.debug("Starting request stream with %s at %s" % (api.me().name, str(datetime.datetime.now())))
stream_listener = StreamListener()
stream = Stream(auth=api.auth, listener=stream_listener)
stream.filter(track=["#hashtagtotrackone", "#hashtagtotracktwo"])

我发现的一个解决方案是在最后循环监听器块并检查stream.running,如果不是,则删除流并启动新流。我相信使用stream.running然后使用stream.disconnect()此变体就是每隔几分钟/小时循环一次Feed并重新连接以保持在陈旧连接之上。

但是另一个stackoverflow帖子建议做一下try / except,from: Tweepy. Make stream run forever

while True:
    listener = TweetStreamListener()
    stream = Stream(auth, listener, timeout=60)

    try:
        stream.filter(track=["#hashtagtotrackone", "#hashtagtotracktwo"])

    except Exception, e:
        print "Error. Restarting Stream.... Error: "
        print e.__doc__
        print e.message

是否有流媒体维护的最佳实践,即:让它优雅地处理自己,或者每隔24小时关闭一次流并将其打开以保持最佳状态?

tweepy的流API有一些很好的文档,但没有任何真正好的例子。我也在想我应该使用异步,因为这个机器人会响应带有指定主题标签的推文,我可能想要它自己的线程中的监听器。

提前致谢。

0 个答案:

没有答案