Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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'))
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
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)
Ejemplo n.º 7
0
 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)
Ejemplo n.º 8
0
 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)
Ejemplo n.º 9
0
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