From bf0445149ba01b1268593e046305855bbf6306b6 Mon Sep 17 00:00:00 2001 From: "Brian S. Stephan" Date: Sat, 11 Jul 2015 08:10:35 -0500 Subject: [PATCH] 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 --- dr_botzo/twitter/ircplugin.py | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/dr_botzo/twitter/ircplugin.py b/dr_botzo/twitter/ircplugin.py index ccfb080..1d1f27c 100644 --- a/dr_botzo/twitter/ircplugin.py +++ b/dr_botzo/twitter/ircplugin.py @@ -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")