def post_to_twitter(user, status): """Helper function to post a user's status to her authorized Twitter account.""" posting_status = '' try: tw_prof = user.get_profile().twitter_profile if tw_prof and tw_prof.access_token: _log.debug("Posting %s's status - %s", user.username.title(), status) tw = TwitterAPI() posting_status = tw.post_status(tw_prof.access_token, status) tw.close() s = json.loads(posting_status) if s.get('id', False): _log.debug("Posted %s's status - %s", user.username.title(), s.get("text", "NO TEXT")) return s else: _log.error("Could not post %s's status:\n%s\n", user.username.title(), posting_status) return False except Exception, e: _log.exception(e) if posting_status: _log.debug("Posting status error:\n%s", posting_status) if tw_prof and 'invalid oauth request' in posting_status.lower( ) or 'failed to validate oauth' in posting_status.lower(): # Remove unusable access token tw_prof.access_token = u'' tw_prof.save() return False
def authorize(request): """Get an unauth token and redirect user to Twitter's authorization URL.""" next = request.GET.get('next', None) if next: request.session['TWITTER_NEXT_URL'] = next try: tw = TwitterAPI() try: token = tw.get_unauthorised_request_token() except KeyError: # retry once tw.close() tw = TwitterAPI() token = tw.get_unauthorised_request_token() request.session['TWITTER_UNAUTH_TOKEN'] = token.to_string() auth_url = tw.get_authorisation_url(token) response = HttpResponseRedirect(auth_url) tw.close() return response except Exception, e: _log.exception(e) if request.user.is_authenticated(): add_message(request, u"We are unable to connect to Twitter at the moment. Please try again in a few minutes.") else: add_message(request, u"We are unable to connect to Twitter at the moment. Please continue signing up below. You will be able to connect your account to Twitter later from our homepage.") return _denied_response(request)
def get_followers_or_followees(twitter_user_id, twitter_url, retry=0, oauth=False, access_token=''): """Return a list of followers or followees of a Twitter user""" x = [] tw = None params = {'user_id': twitter_user_id, 'cursor': '-1'} try: px = urlencode(params) if oauth: if not access_token: tw_prof = TwitterProfile.objects.active().filter( appuser_id=twitter_user_id).exclude( access_token=u'').order_by("-updated_on")[:1].get() access_token = tw_prof.access_token tw = TwitterAPI() if PROTOCOL == 'https': twitter_url = twitter_url.replace('http:', 'https:') _url = twitter_url % px _log.debug("OAuth URL %s" % _url) ret = tw.get_url(access_token, _url) tw.close() else: _url = twitter_url % px _log.debug(_url) req = urllib2.Request(_url) req.add_header("Content-type", "application/x-www-form-urlencoded") req.add_header('User-Agent', settings.USER_AGENT) resp = urllib2.urlopen(req) ret = resp.read() resp.close() results = json.loads(ret) if type(results) == dict: x = results.get('ids', []) else: x = results time.sleep(settings.TWITTER_SLEEP) return x except urllib2.HTTPError, h: if h.code == 401 and retry < 2: # Try with OAuth return get_followers_or_followees(twitter_user_id, twitter_url, retry=retry + 1, oauth=True, access_token=access_token) _log.error("%s failed for twitter id: %s (HTTP Error)", twitter_url, twitter_user_id) _log.exception(h) if h.code in (503, 502, 420): time.sleep(30 + retry * 30) # throttle if x or retry > 1: return x return get_followers_or_followees(twitter_user_id, twitter_url, retry=retry + 1, oauth=oauth, access_token=access_token)
def register(request, template='registration/registration_form.html', redirect_field_name='next'): if request.user.is_authenticated(): prof = request.user_profile u = prof.user if prof.is_sso and prof.twitter_profile: # populate current open profile into session t = prof.twitter_profile # get profile image URL from Twitter profile_image = '' try: tw = TwitterAPI() twitter_profile = tw.get_profile(t.access_token) tw.close() if twitter_profile: p = simplejson.loads(twitter_profile) profile_image = p.get('profile_image_url', '') if '/images/default_profile' in profile_image: profile_image = '' except Exception, e: _log.exception(e) # continue without profile image open_profile = dict( profile_type=u'twitter', screen_name=t.screen_name, first_name=u.first_name, last_name=u.last_name, appuser_id=t.appuser_id, profile_image_url=profile_image, access_token=t.access_token ) # logout(request) # request.user_profile = None request.session['OPEN_PROFILE'] = open_profile else: return HttpResponseRedirect(reverse('account'))
def post_to_twitter(user, status): """Helper function to post a user's status to her authorized Twitter account.""" posting_status = '' try: tw_prof = user.get_profile().twitter_profile if tw_prof and tw_prof.access_token: _log.debug("Posting %s's status - %s", user.username.title(), status) tw = TwitterAPI() posting_status = tw.post_status(tw_prof.access_token, status) tw.close() s = json.loads(posting_status) if s.get('id', False): _log.debug("Posted %s's status - %s", user.username.title(), s.get("text", "NO TEXT")) return s else: _log.error("Could not post %s's status:\n%s\n", user.username.title(), posting_status) return False except Exception, e: _log.exception(e) if posting_status: _log.debug("Posting status error:\n%s", posting_status) if tw_prof and 'invalid oauth request' in posting_status.lower() or 'failed to validate oauth' in posting_status.lower(): # Remove unusable access token tw_prof.access_token = u'' tw_prof.save() return False
def get_followers_or_followees(twitter_user_id, twitter_url, retry=0, oauth=False, access_token=''): """Return a list of followers or followees of a Twitter user""" x = [] tw = None params = {'user_id':twitter_user_id, 'cursor':'-1'} try: px = urlencode(params) if oauth: if not access_token: tw_prof = TwitterProfile.objects.active().filter( appuser_id=twitter_user_id ).exclude(access_token=u'').order_by("-updated_on")[:1].get() access_token = tw_prof.access_token tw = TwitterAPI() if PROTOCOL == 'https': twitter_url = twitter_url.replace('http:', 'https:') _url = twitter_url % px _log.debug("OAuth URL %s" % _url) ret = tw.get_url(access_token, _url) tw.close() else: _url = twitter_url % px _log.debug(_url) req = urllib2.Request(_url) req.add_header("Content-type", "application/x-www-form-urlencoded") req.add_header('User-Agent', settings.USER_AGENT) resp = urllib2.urlopen(req) ret = resp.read() resp.close() results = json.loads(ret) if type(results) == dict: x = results.get('ids', []) else: x = results time.sleep(settings.TWITTER_SLEEP) return x except urllib2.HTTPError, h: if h.code == 401 and retry < 2: # Try with OAuth return get_followers_or_followees(twitter_user_id, twitter_url, retry=retry+1, oauth=True, access_token=access_token) _log.error("%s failed for twitter id: %s (HTTP Error)", twitter_url, twitter_user_id) _log.exception(h) if h.code in (503, 502, 420): time.sleep(30 + retry*30) # throttle if x or retry > 1: return x return get_followers_or_followees(twitter_user_id, twitter_url, retry=retry+1, oauth=oauth, access_token=access_token)
def save(self, commit=True): comment = super(CommentForm, self).save(commit=False) comment.user = self.user comment.content_type = self.content_type comment.object_pk = self.object_pk comment.is_public = self.is_public comment.submit_date = datetime.now() comment.site = self.site comment.save() try: if self.cleaned_data.get("do_tweet", False) and getattr(settings, 'ENABLE_COMMENT_TWEET', True): tw_prof = self.user.get_profile().twitter_profile if tw_prof and tw_prof.access_token: tw = TwitterAPI() tweet = tw.post_status(tw_prof.access_token, comment.comment) tw.close() self.tweet_posted(comment, tweet) except Exception, e: _log.exception(e)
def save(self, commit=True): comment = super(CommentForm, self).save(commit=False) comment.user = self.user comment.content_type = self.content_type comment.object_pk = self.object_pk comment.is_public = self.is_public comment.submit_date = datetime.now() comment.site = self.site comment.save() try: if self.cleaned_data.get("do_tweet", False) and getattr( settings, 'ENABLE_COMMENT_TWEET', True): tw_prof = self.user.get_profile().twitter_profile if tw_prof and tw_prof.access_token: tw = TwitterAPI() tweet = tw.post_status(tw_prof.access_token, comment.comment) tw.close() self.tweet_posted(comment, tweet) except Exception, e: _log.exception(e)
def callback(request): """This is where Twitter will redirect the user after this app has been authorized.""" try: unauthed_token = request.session.get('TWITTER_UNAUTH_TOKEN', None) oauth_verifier = request.GET.get('oauth_verifier', None) try: if unauthed_token: del request.session['TWITTER_UNAUTH_TOKEN'] except KeyError: pass if not unauthed_token: _log.debug("Unauthenticated token not found in session") return _denied_response(request) token = oauth.OAuthToken.from_string(unauthed_token) oauth_token = request.GET.get('oauth_token', None) if token.key != oauth_token: _log.debug("Tokens did not match %s - %s", token.key, oauth_token) return _denied_response(request) tw = TwitterAPI() try: access_token = tw.exchange_request_token_for_access_token(token, oauth_verifier) except KeyError: tw.close() return _denied_response(request) twitter_profile = tw.get_profile(access_token) tw.close() if twitter_profile: _log.debug("Twitter profile downloaded:\n%s", twitter_profile) try: p = simplejson.loads(twitter_profile) except Exception, e: # try one more time try: tw = TwitterAPI() twitter_profile = tw.get_profile(access_token) tw.close() _log.debug("Twitter profile downloaded on retry:\n%s", twitter_profile) if not twitter_profile: raise Exception("OAuth error: retry failed on get_profile") p = simplejson.loads(twitter_profile) except Exception, e: _log.warn("Twitter profile could not be JSON decoded.\n%s", twitter_profile) _log.exception(e) add_message(request, u"We are unable to connect to Twitter at the moment. Please try again in a few minutes.") return _denied_response(request) _log.debug(p) screen_name = p.get('screen_name') full_name = p.get('name', p['screen_name']) # Split full_name into first name and last name x = full_name.split(' ', 1) first_name, last_name = u'', u'' if len(x) > 1: first_name, last_name = x[0], x[1] elif len(x) == 1: first_name, last_name = u'', x[0] profile_image = p.get('profile_image_url', '') if '/images/default_profile' in profile_image: profile_image = '' profile = dict( profile_type=u'twitter', screen_name=screen_name, first_name=first_name, last_name=last_name, appuser_id=p['id'], profile_image_url=profile_image, access_token=access_token.to_string() ) if request.user.is_authenticated(): user = request.user p = save_open_profile(user, profile) add_message(request, u"You've connected your Twitter account successfully.") # user.message_set.create(message=_(u"Thank you for authorizing us to update your Twitter status!")) else: request.session['OPEN_PROFILE'] = profile