问题
I am using nirgs forked version of Tweepy, which I need to use to get tweets between 2017-01-31
and 2017-02-01
. My code works and due to Twitters Rate Limits I have to switch between multiple auth handlers to be able to work with tweets which dates are as far away as mentioned before. I am using this instruction, but after reaching Rate Limit and trying to switch to the next auth handler by using api.auth_idx += 1
I get the following error:
File "build/bdist.macosx-10.11-intel/egg/tweepy/api.py", line 45, in auth_idx
IndexError: Index out of bounds
The main code looks something like this:
oauth_keys = [["consumer_key_1", "consumer_secret_1", "access_token_1", "access_token_secret_1"], ["consumer_key_2", "consumer_secret_2", "access_token_2", "access_token_secret_2"]]
auths = []
for consumer_key, consumer_secret, access_key, access_secret in oauth_keys:
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_key, access_secret)
auths.append(auth)
api = tweepy.API(auths, monitor_rate_limit=True)
while True:
try:
for tweet in tweepy.Cursor(api.search, q='bitcoin', since=datetime.date(2017, 1, 31), lang='en').items(3000):
...
except tweepy.TweepError as e:
api.auth_idx += 1
continue
I don't know what I am doing wrong. Any help is appreciated a lot!
回答1:
Here is the solution.
The error was indexing the object itself. I had to create a variable as an index:
switch += 1
api.auth_idx = switch
And here is the full code, in case anybody tries to build the same app:
oauth_keys = [
["consumer_key_1", "consumer_secret_1", "access_token_1", "access_token_secret_1"],
["consumer_key_2", "consumer_secret_2", "access_token_2", "access_token_secret_2"]
]
auths = []
for consumer_key, consumer_secret, access_key, access_secret in oauth_keys:
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_key, access_secret)
auths.append(auth)
# api
api = tweepy.API(auths)
currentCursor = tweepy.Cursor(api.search, q = 'bitcoin', since='2017-02-01', until='2017-02-02', lang='en')
c = currentCursor.items()
switch = 0
api.auth_idx = switch
tweets = []
early_dt_val = datetime.datetime.strptime('2017-01-31 22:34:48', '%Y-%m-%d %H:%M:%S')
later_dt_val = datetime.datetime.strptime('2017-02-01 01:25:30', '%Y-%m-%d %H:%M:%S')
maxId = 0
while True:
try:
#for tweet in tweepy.Cursor(api.search, q='bitcoin', since=datetime.date(2017, 1, 31), lang='en').items(3000)
for tweet in c:
tweets.append(tweet)
maxId = tweet.id
for tweet in reversed(tweets):
tweetTime = tweet.created_at
if tweetTime < later_dt_val and tweetTime > early_dt_val:
print('Date: ' + str(tweet.created_at))
print('Tweet: ' + tweet.text)
except tweepy.TweepError as e:
print e
print "---------------------------Rate limit exceeded.---------------------------"
print "switching keys..."
switch += 1
if switch > 4:
print "Limit reached"
break
else:
api.auth_idx = switch # naechster Key
currentCursor = tweepy.Cursor(api.search, q='bitcoin', since='2017-02-01', until='2017-02-02', lang='en', max_id=maxId)
来源:https://stackoverflow.com/questions/42059191/tweepy-multiple-auth-handler