Tweepy。让流永远运行

时间:2015-04-11 19:27:26

标签: python twitter tweepy

我对tweepy python库比较新。 我想确保我的流python脚本始终在远程服务器上运行。因此,如果有人分享如何实现这一目标的最佳实践,那就太棒了。

现在我这样做:

if __name__ == '__main__':

while True:

    try:

        # create instance of the tweepy tweet stream listener
        listener = TweetStreamListener()

        # set twitter keys/tokens
        auth = OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
        auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

        # create instance of the tweepy stream
        stream = Stream(auth, listener)

        stream.userstream()
    except Exception as e:
        print "Error. Restarting Stream.... Error: "
        print e.__doc__
        print e.message
        time.sleep(5)

我在每个方法上都返回Falseon_error(), on_disconnect(), on_timeout()。 因此,通过返回False,流停止,然后在无限循环中重新连接。

3 个答案:

答案 0 :(得分:5)

这是我如何做我的,它已经运行了将近一年,在两台计算机上处​​理阻止流在这里和那里的错误。

#They don't need to be in the loop.
auth = OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

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

    try:
        stream.userstream()

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

要确保它永远运行,您应该重新定义on_error方法以处理重新连接尝试之间的时间。你的5秒睡眠会妨碍你成功重新连接的机会,因为Twitter会发现你试图过于频繁地进行重新连接。但这是另一个问题。

答案 1 :(得分:1)

我只有两美分。

我收到很多错误420,这很奇怪,因为我没有为流API请求太多关键字。

所以我发现流侦听器类的on_data()方法必须始终返回True

有时,我的返回了False,所以tweepy切断了连接,并像循环一样直接重新创建了连接,twitter不太喜欢它...

答案 2 :(得分:0)

我还通过针对异常递归创建新流来解决该问题。

这是我的完整代码。只需更改 mytrack 变量,放置您的密钥并使用 pm2python 运行它。

from tweepy import OAuthHandler, Stream, StreamListener
import json


mytrack = ['netmine', 'bitkhar', 'bitcoin']

consumer_key = ""
consumer_secret = ""
access_token = ""
access_token_secret = ""

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


class StdOutListener(StreamListener):
    def __init__(self, listener, track_list, repeat_times):
        self.repeat_times = repeat_times
        self.track_list = track_list
        print('************** initialized : #', self.repeat_times)

    def on_data(self, data):
        print(self.repeat_times, 'tweet id : ', json.loads(data)['id'])

    def on_exception(self, exception):
        print('exception', exception)
        new_stream(auth, self.track_list, self.repeat_times+1)

    def on_error(self, status):
        print('err', status)
        if status == 420:
            # returning False in on_data disconnects the stream
            return False


def new_stream(auth, track_list, repeat_times):
    listener = StdOutListener(StreamListener, track_list, repeat_times)
    stream = Stream(auth, listener).filter(track=track_list, is_async=True)


new_stream(auth, mytrack, repeat_times=0)