X-Git-Url: https://jfr.im/git/z_archive/twitter.git/blobdiff_plain/7ab9bcfe12f83c1a2ea7fd727fc3e2252d18cbc8..c2176d4e0365bb0764ff6962721053acaa1d1e39:/twitter/archiver.py?ds=sidebyside diff --git a/twitter/archiver.py b/twitter/archiver.py index 6f2468a..ef2dc1f 100644 --- a/twitter/archiver.py +++ b/twitter/archiver.py @@ -97,8 +97,11 @@ def load_tweets(filename): tweets = {} for line in archive.readlines(): - tid, text = line.strip().split(" ", 1) - tweets[int(tid)] = text.decode("utf-8") + try: + tid, text = line.strip().split(" ", 1) + tweets[int(tid)] = text.decode("utf-8") + except Exception as e: + err("loading tweet %s failed due to %s" % (line, unicode(e))) archive.close() return tweets @@ -125,7 +128,10 @@ def save_tweets(filename, tweets): return for k in sorted(tweets.keys()): - archive.write("%i %s\n" % (k, tweets[k].encode('utf-8'))) + try: + archive.write("%i %s\n" % (k, tweets[k].encode('utf-8'))) + except Exception as ex: + err("archiving tweet %s failed due to %s" % (k, unicode(ex))) archive.close() @@ -242,15 +248,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 @@ -285,12 +291,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 = { @@ -322,8 +328,11 @@ def main(args=sys.argv[1:]): # authenticate using OAuth, asking for token if necessary if options['oauth']: - oauth_filename = (os.getenv("HOME", "") + os.sep - + ".twitter-archiver_oauth") + oauth_filename = (os.environ.get('HOME', + os.environ.get('USERPROFILE', '')) + + os.sep + + '.twitter-archiver_oauth') + if not os.path.exists(oauth_filename): oauth_dance("Twitter-Archiver", CONSUMER_KEY, CONSUMER_SECRET, oauth_filename)