twitter: handle twitter API errors better

i think i need to make this client (re)connect on demand or something,
though, i'm getting a lot of timeouts
This commit is contained in:
Brian S. Stephan 2015-07-11 08:10:35 -05:00
parent 6bf2732d7f
commit bf0445149b
1 changed files with 22 additions and 9 deletions

View File

@ -6,6 +6,7 @@ import logging
import thread
import time
import requests
import twython
from django.conf import settings
@ -25,7 +26,9 @@ class Twitter(Plugin):
"""Initialize some stuff."""
self.authed = False
self.twit = twython.Twython(settings.TWITTER_CONSUMER_KEY, settings.TWITTER_CONSUMER_SECRET)
self.twit_args = {'timeout': 30.0}
self.twit = twython.Twython(settings.TWITTER_CONSUMER_KEY, settings.TWITTER_CONSUMER_SECRET,
client_args=self.twit_args)
self.temp_token = None
self.temp_token_secret = None
@ -54,14 +57,17 @@ class Twitter(Plugin):
twittersettings = TwitterClient.objects.get(pk=1)
if twittersettings.oauth_token != '' and twittersettings.oauth_token_secret != '':
self.twit = twython.Twython(settings.TWITTER_CONSUMER_KEY, settings.TWITTER_CONSUMER_SECRET,
twittersettings.oauth_token, twittersettings.oauth_token_secret)
twittersettings.oauth_token, twittersettings.oauth_token_secret,
client_args=self.twit_args)
if self.twit.verify_credentials():
self.authed = True
log.debug("Logged in to Twitter with saved token.")
else:
self.twit = twython.Twython(settings.TWITTER_CONSUMER_KEY, settings.TWITTER_CONSUMER_SECRET)
self.twit = twython.Twython(settings.TWITTER_CONSUMER_KEY, settings.TWITTER_CONSUMER_SECRET,
client_args=self.twit_args)
else:
self.twit = twython.Twython(settings.TWITTER_CONSUMER_KEY, settings.TWITTER_CONSUMER_SECRET)
self.twit = twython.Twython(settings.TWITTER_CONSUMER_KEY, settings.TWITTER_CONSUMER_SECRET,
client_args=self.twit_args)
except TwitterClient.DoesNotExist:
log.error("twitter settings module does not exist")
@ -127,6 +133,8 @@ class Twitter(Plugin):
tweet = tweets[-1*index]
return self._return_tweet_or_retweet_text(event, tweet=tweet, print_source=print_source,
print_id=print_id)
except requests.exceptions.SSLError as ssle:
return self.bot.reply(event, "Couldn't obtain status: {0:s}, you can maybe try again".format(ssle))
except twython.exceptions.TwythonError as e:
return self.bot.reply(event, "Couldn't obtain status: {0:s}".format(e))
except ValueError as e:
@ -178,10 +186,12 @@ class Twitter(Plugin):
try:
if not self.twit.verify_credentials():
self.authed = False
self.twit = twython.Twython(settings.TWITTER_CONSUMER_KEY, settings.TWITTER_CONSUMER_SECRET)
self.twit = twython.Twython(settings.TWITTER_CONSUMER_KEY, settings.TWITTER_CONSUMER_SECRET,
client_args=self.twit_args)
except twython.TwythonError:
self.authed = False
self.twit = twython.Twython(settings.TWITTER_CONSUMER_KEY, settings.TWITTER_CONSUMER_SECRET)
self.twit = twython.Twython(settings.TWITTER_CONSUMER_KEY, settings.TWITTER_CONSUMER_SECRET,
client_args=self.twit_args)
auth = self.twit.get_authentication_tokens()
self.temp_token = auth['oauth_token']
@ -194,11 +204,13 @@ class Twitter(Plugin):
oauth_verifier = match.group(1)
self.twit = twython.Twython(settings.TWITTER_CONSUMER_KEY, settings.TWITTER_CONSUMER_SECRET,
self.temp_token, self.temp_token_secret)
self.temp_token, self.temp_token_secret,
client_args=self.twit_args)
final_step = self.twit.get_authorized_tokens(oauth_verifier)
self.twit = twython.Twython(settings.TWITTER_CONSUMER_KEY, settings.TWITTER_CONSUMER_SECRET,
final_step['oauth_token'], final_step['oauth_token_secret'])
final_step['oauth_token'], final_step['oauth_token_secret'],
client_args=self.twit_args)
try:
twittersettings = TwitterClient.objects.get(pk=1)
@ -212,7 +224,8 @@ class Twitter(Plugin):
# print timeline stuff. this will set up the appropriate timer
return self.bot.reply(event, "The bot is now logged in.")
else:
self.twit = twython.Twython(settings.TWITTER_CONSUMER_KEY, settings.TWITTER_CONSUMER_SECRET)
self.twit = twython.Twython(settings.TWITTER_CONSUMER_KEY, settings.TWITTER_CONSUMER_SECRET,
client_args=self.twit_args)
return self.bot.reply(event, "The bot was not able to authenticate.")
except TwitterClient.DoesNotExist:
log.error("twitter settings object does not exist")