X-Git-Url: https://jfr.im/git/z_archive/twitter.git/blobdiff_plain/7a5610b19d0e1f0ad92c34237713cce6106e1d05..780044e6336befd1861d5d4ac194e864c4f53257:/twitter/archiver.py?ds=sidebyside diff --git a/twitter/archiver.py b/twitter/archiver.py index 456ce66..4075409 100644 --- a/twitter/archiver.py +++ b/twitter/archiver.py @@ -129,14 +129,18 @@ def save_tweets(filename, tweets): archive.close() -def format_date(utc, to_localtime=True, isoformat=False): +def format_date(utc, isoformat=False): """Parse Twitter's UTC date into UTC or local time.""" u = datetime.strptime(utc.replace('+0000','UTC'), '%a %b %d %H:%M:%S %Z %Y') + # This is the least painful way I could find to create a non-naive + # datetime including a UTC timezone. Alternative suggestions + # welcome. unew = datetime.combine(u.date(), time(u.time().hour, u.time().minute, u.time().second, tzinfo=UTC)) - if to_localtime and _time.timezone != 0: - unew = unew.astimezone(Local) + # Convert to localtime + unew = unew.astimezone(Local) + if isoformat: return unew.isoformat() else: @@ -238,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.account.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 @@ -281,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.account.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 = { @@ -389,7 +393,7 @@ def main(args=sys.argv[1:]): dms = {} try: dms = load_tweets(filename) - except Exception, e: + except Exception as e: err("Error when loading saved DMs: %s - continuing without" % str(e))