-r --followers display followers of the given user (default)
-g --following display users the given user is following
-a --api-rate see your current API rate limit status
+ -i --ids prepend user id to each line. useful to tracking renames
AUTHENTICATION
Authenticate to Twitter using OAuth to see following/followers of private
from __future__ import print_function
-import os, sys, time, calendar, urllib2, httplib
+import os, sys, time, calendar
from getopt import gnu_getopt as getopt, GetoptError
+try:
+ import urllib.request as urllib2
+ import http.client as httplib
+except ImportError:
+ import urllib2
+ import httplib
+
# T-Follow (Twitter-Follow) application registered by @stalkr_
CONSUMER_KEY='USRZQfvFFjB6UvZIN2Edww'
CONSUMER_SECRET='AwGAaSzZa5r0TDL8RKCDtffnI9H9mooZUdOa95nw8'
from .auth import NoAuth
from .util import Fail, err
+
def parse_args(args, options):
"""Parse arguments from command-line to set options."""
- long_opts = ['help', 'oauth', 'followers', 'following', 'api-rate']
- short_opts = "horga"
+ long_opts = ['help', 'oauth', 'followers', 'following', 'api-rate', 'ids']
+ short_opts = "horgai"
opts, extra_args = getopt(args, short_opts, long_opts)
for opt, arg in opts:
options['followers'] = False
elif opt in ('-a', '--api-rate'):
options['api-rate' ] = True
+ elif opt in ('-i', '--ids'):
+ options['show_id'] = True
options['extra_args'] = extra_args
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.account.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:
% ("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.account.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
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 = {
'oauth': False,
'followers': True,
- 'api-rate': False
+ 'api-rate': False,
+ 'show_id': False
}
try:
parse_args(args, options)
else:
auth = NoAuth()
- twitter = Twitter(auth=auth, api_version='1', domain='api.twitter.com')
+ twitter = Twitter(auth=auth, api_version='1.1', domain='api.twitter.com')
if options['api-rate']:
rate_limit_status(twitter)
raise SystemExit(1)
for uid in user_ids:
- print(users[uid].encode("utf-8"))
+ if options['show_id']:
+ try:
+ print(str(uid) + "\t" + users[uid].encode("utf-8"))
+ except KeyError:
+ pass
+
+ else:
+ try:
+ print(users[uid].encode("utf-8"))
+ except KeyError:
+ pass
# print total on stderr to separate from user list on stdout
if options['followers']: