Python Tweepy StreamListener过了一段时间就过时了--如何正确维护流连接?
我正在构建一个我希望持续运行(始终打开/侦听)的bot,Tweepy twitter API StreamListener在一段时间后变得过时,并且变得没有响应 当我启动它时,它工作得很好,响应也应该如此——但如果我让它坐着不从流中获取任何输入,它就会像僵尸一样。不会退出/退出,但也不会获取任何新数据 我认为我有理由解释超时,但很明显,要么我做得不对,要么这不是问题所在。我应该补充一点,我正在使用supervisord在Ubuntu中作为守护进程运行它 我已经确定了两种可能的解决方案,但想看看是否有一种“正确”的方法。以下是我当前的设置(不包括运行良好的on_数据): 我找到的解决方案之一是在末尾循环侦听器块并检查stream.running,如果没有,则删除流并启动新的流。我相信使用Python Tweepy StreamListener过了一段时间就过时了--如何正确维护流连接?,python,twitter,tweepy,supervisord,Python,Twitter,Tweepy,Supervisord,我正在构建一个我希望持续运行(始终打开/侦听)的bot,Tweepy twitter API StreamListener在一段时间后变得过时,并且变得没有响应 当我启动它时,它工作得很好,响应也应该如此——但如果我让它坐着不从流中获取任何输入,它就会像僵尸一样。不会退出/退出,但也不会获取任何新数据 我认为我有理由解释超时,但很明显,要么我做得不对,要么这不是问题所在。我应该补充一点,我正在使用supervisord在Ubuntu中作为守护进程运行它 我已经确定了两种可能的解决方案,但想看看是
stream.running
然后使用stream.disconnect()
这种方法的变体是每隔几分钟/小时循环一次提要,然后重新连接以保持在旧连接的顶部
但另一个stackoverflow帖子建议从以下位置执行try/except:
流维护是否有一个最佳实践,即:让它优雅地处理自己,或者通过每24小时关闭一次流并重新打开它来保持在流的顶部
tweepy的流式API有一些很好的文档,但没有任何真正好的示例。我还认为我可能应该使用async,因为这个bot将使用指定的hashtag响应tweet,并且我可能希望侦听器在它自己的线程中
提前谢谢。也许你可以在
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"])
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