Пример #1
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