From: Mike Verdone Date: Thu, 20 Mar 2014 17:45:44 +0000 (+0100) Subject: Merge pull request #214 from edi-bice/master X-Git-Tag: twitter-1.14.2~2 X-Git-Url: https://jfr.im/git/z_archive/twitter.git/commitdiff_plain/ac98c9826c24f6eae0a1d0b5b59db11759a3652c?hp=a5110e32dd8a557227c02821d53cdf50c9c98bb6 Merge pull request #214 from edi-bice/master Fixed broken rate limiting error handling in archiver/follow. Twitter changed rate limiting response objects quite a bit in v1.1. In addition there were bugs due to import of time module and time object from datetime module. --- diff --git a/setup.py b/setup.py index 57b37ac..9716813 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ from setuptools import setup, find_packages import sys, os -version = '1.14.1' +version = '1.14.2' install_requires = [ # -*- Extra requirements: -*- diff --git a/twitter/archiver.py b/twitter/archiver.py index 641329e..4075409 100644 --- a/twitter/archiver.py +++ b/twitter/archiver.py @@ -242,15 +242,15 @@ def statuses(twitter, screen_name, tweets, mentions=False, favorites=False, rece err("Fail: %i Unauthorized (tweets of that user are protected)" % e.e.code) break - elif e.e.code == 400: + elif e.e.code == 429: err("Fail: %i API rate limit exceeded" % e.e.code) - rate = twitter.application.rate_limit_status() - reset = rate['reset_time_in_seconds'] - reset = time.asctime(time.localtime(reset)) - delay = int(rate['reset_time_in_seconds'] - - time.time()) + 5 # avoid race - err("Hourly limit of %i requests reached, next reset on %s: " - "going to sleep for %i secs" % (rate['hourly_limit'], + rls = twitter.application.rate_limit_status() + reset = rls.rate_limit_reset + reset = _time.asctime(_time.localtime(reset)) + delay = int(rls.rate_limit_reset + - _time.time()) + 5 # avoid race + err("Interval limit of %i requests reached, next reset on %s: " + "going to sleep for %i secs" % (rls.rate_limit_limit, reset, delay)) fail.wait(delay) continue @@ -285,12 +285,12 @@ def statuses(twitter, screen_name, tweets, mentions=False, favorites=False, rece def rate_limit_status(twitter): """Print current Twitter API rate limit status.""" - r = twitter.application.rate_limit_status() - print("Remaining API requests: %i/%i (hourly limit)" - % (r['remaining_hits'], r['hourly_limit'])) + rls = twitter.application.rate_limit_status() + print("Remaining API requests: %i/%i (interval limit)" + % (rls.rate_limit_remaining, rls.rate_limit_limit)) print("Next reset in %is (%s)" - % (int(r['reset_time_in_seconds'] - time.time()), - time.asctime(time.localtime(r['reset_time_in_seconds'])))) + % (int(rls.rate_limit_reset - _time.time()), + _time.asctime(_time.localtime(rls.rate_limit_reset)))) def main(args=sys.argv[1:]): options = { diff --git a/twitter/follow.py b/twitter/follow.py index fda7bbc..8c763c1 100644 --- a/twitter/follow.py +++ b/twitter/follow.py @@ -81,16 +81,16 @@ def lookup(twitter, user_ids): try: portion = lookup_portion(twitter, user_ids[i:][:api_limit]) except TwitterError as e: - if e.e.code == 400: + if e.e.code == 429: err("Fail: %i API rate limit exceeded" % e.e.code) - rate = twitter.application.rate_limit_status() - reset = rate['reset_time_in_seconds'] + rls = twitter.application.rate_limit_status() + reset = rls.rate_limit_reset reset = time.asctime(time.localtime(reset)) - delay = int(rate['reset_time_in_seconds'] + delay = int(rls.rate_limit_reset - time.time()) + 5 # avoid race - err("Hourly limit of %i requests reached, next reset on " + err("Interval limit of %i requests reached, next reset on " "%s: going to sleep for %i secs" - % (rate['hourly_limit'], reset, delay)) + % (rls.rate_limit_limit, reset, delay)) fail.wait(delay) continue elif e.e.code == 502: @@ -139,15 +139,15 @@ def follow(twitter, screen_name, followers=True): % ("ers" if followers else "ing")) err("Fail: %i Unauthorized (%s)" % (e.e.code, reason)) break - elif e.e.code == 400: + elif e.e.code == 429: err("Fail: %i API rate limit exceeded" % e.e.code) - rate = twitter.application.rate_limit_status() - reset = rate['reset_time_in_seconds'] + rls = twitter.application.rate_limit_status() + reset = rls.rate_limit_reset reset = time.asctime(time.localtime(reset)) - delay = int(rate['reset_time_in_seconds'] + delay = int(rls.rate_limit_reset - time.time()) + 5 # avoid race - err("Hourly limit of %i requests reached, next reset on %s: " - "going to sleep for %i secs" % (rate['hourly_limit'], + err("Interval limit of %i requests reached, next reset on %s: " + "going to sleep for %i secs" % (rls.rate_limit_limit, reset, delay)) fail.wait(delay) continue @@ -180,12 +180,12 @@ def follow(twitter, screen_name, followers=True): def rate_limit_status(twitter): """Print current Twitter API rate limit status.""" - r = twitter.application.rate_limit_status() - print("Remaining API requests: %i/%i (hourly limit)" - % (r['remaining_hits'], r['hourly_limit'])) + rls = twitter.application.rate_limit_status() + print("Remaining API requests: %i/%i (interval limit)" + % (rls.rate_limit_remaining, rls.rate_limit_limit)) print("Next reset in %is (%s)" - % (int(r['reset_time_in_seconds'] - time.time()), - time.asctime(time.localtime(r['reset_time_in_seconds'])))) + % (int(rls.rate_limit_reset - time.time()), + time.asctime(time.localtime(rls.rate_limit_reset)))) def main(args=sys.argv[1:]): options = {