예제 #1
0
    def get_fb_profile(self, user_id: int) -> Dict[str, Any]:

        fb_user = self.get_fb_user_by_django_user_id(user_id)

        if fb_user is None:
            return None

        access_token = fb_user.access_token
        try:
            graph = GraphAPI(access_token)
            graph.extend_access_token(FACEBOOK_APP_ID, FACEBOOK_APP_SECRET)
            profile = graph.get_object('me', fields='id,name,email,verified')
            profile['image'] = graph.get_object('me/picture')['url']
            profile['image_thumb'] = graph.get_object('me/picture')['url']

            return profile
        except GraphAPIError as ex:
            str_ex = str(ex)
            if 'Session has expired' in str_ex:
                return {
                    'id': fb_user.facebook_id,
                    'name': fb_user.name,
                    'email': fb_user.email,
                    'access_token': fb_user.access_token,
                    'verified': fb_user.verified,
                    'image': '',
                    'image_thumb': '',
                    'expired': True
                }
예제 #2
0
def grab_users_posts(facebook_id, start_date=None, end_date=None):
    """
    Grabs users posts from facebook and saves to database

    facebook_id -- users id in facebook
    start_date -- exclude posts created before this date, have to be datetime
    end_date -- exclude posts created after this date, have to be datetime
    """
    if start_date:
        assert type(start_date) is datetime
    if end_date:
        assert type(end_date) is datetime

    user_social_profile = UserSocialAuth.objects.get(uid=facebook_id)

    graph = GraphAPI(user_social_profile.extra_data['access_token'])

    graph.extend_access_token(settings.FACEBOOK_APP_ID, settings.FACEBOOK_API_SECRET)

    # TODO: create real pagination
    limit = 100500

    query = 'SELECT created_time, message, permalink FROM stream ' \
            'WHERE source_id = %(user_id)s and message != ""'

    if start_date:
        query += 'and created_time > %d' % int(time.mktime(start_date.timetuple()))
    if end_date:
        query += 'and created_time < %d' % int(time.mktime(end_date.timetuple()))

    query += ' LIMIT %(limit)d'
    res = graph.fql(query % {'user_id': facebook_id, 'limit': limit})

    for post in res:
        if Post.objects.filter(link=post['permalink']).exists():
            continue

        post = Post(user=user_social_profile.user,
                    created=datetime.fromtimestamp(post['created_time']),
                    content=post['message'],
                    link=post['permalink'],
                    )
        mood_stats = get_text_sentiment_analysis(post.content)
        post.mood = mood_stats['total']
        post.mood_positive = mood_stats['pos']
        post.mood_negative = mood_stats['neg']
        post.mood_neutral = mood_stats['neutral']

        post.save()

    return True
예제 #3
0
파일: views.py 프로젝트: Taaag/taaag
def get_current_user():
    if not session.get('user'):
        result = get_user_from_cookie(cookies=request.cookies, app_id=FB_APP_ID,
                                      app_secret=FB_APP_SECRET)
        if result:
            graph = GraphAPI(result['access_token'])
            profile = graph.get_object('me', fields='link,name,id')
            access_token = graph.extend_access_token(FB_APP_ID, FB_APP_SECRET)['access_token']
            user = User.get_by_id(result['uid'])
            if not user:
                user = User.create(id=profile['id'], name=profile['name'],
                                   profile_url=profile['link'],
                                   access_token=access_token)
                clear_friends_cache(user)
                user.add_default_tag()
                g.new_user = True
            else:
                user.access_token = access_token
                user.update()

            session['user'] = user.id

    g.uid = session.get('user')
    g.user = User.get_by_id(g.uid) if g.uid else None

    if not g.user:
        session['user'] = ''
예제 #4
0
def add_facebook_token():
    """Add token to db"""

    access_token = request.form.get("access_token")
    facebook_user_id = request.form.get("facebook_user_id")

    graph = GraphAPI(access_token)
    app_id = os.environ['FACEBOOK_APP_ID']
    app_secret = os.environ['FACEBOOK_APP_SECRET']
    extended_token = graph.extend_access_token(app_id, app_secret)
    final_token = extended_token['access_token']
    facebook_info = FacebookInfo.query.filter_by(
        facebook_user_id=facebook_user_id, user_id=session['user_id']).first()

    if not facebook_info:
        facebook_info = FacebookInfo(user_id=session["user_id"],
                                     access_token=final_token,
                                     facebook_user_id=facebook_user_id)

    else:
        facebook_info.access_token = access_token

    db.session.add(facebook_info)
    db.session.commit()

    return "success"
예제 #5
0
def get_current_user():
    if not session.get('user'):
        result = get_user_from_cookie(cookies=request.cookies,
                                      app_id=FB_APP_ID,
                                      app_secret=FB_APP_SECRET)
        if result:
            graph = GraphAPI(result['access_token'])
            profile = graph.get_object('me', fields='link,name,id')
            access_token = graph.extend_access_token(
                FB_APP_ID, FB_APP_SECRET)['access_token']
            user = User.get_by_id(result['uid'])
            if not user:
                user = User.create(id=profile['id'],
                                   name=profile['name'],
                                   profile_url=profile['link'],
                                   access_token=access_token)
                clear_friends_cache(user)
                user.add_default_tag()
                g.new_user = True
            else:
                user.access_token = access_token
                user.update()

            session['user'] = user.id

    g.uid = session.get('user')
    g.user = User.get_by_id(g.uid) if g.uid else None

    if not g.user:
        session['user'] = ''
예제 #6
0
def get_current_user():
    """Set g.user to the currently logged in user.

    Called before each request, get_current_user sets the global g.user
    variable to the currently logged in user.  A currently logged in user is
    determined by seeing if it exists in Flask's session dictionary.

    If it is the first time the user is logging into this application it will
    create the user and insert it into the database.  If the user is not logged
    in, None will be set to g.user.
    """

    # Set the user in the session dictionary as a global g.user and bail out
    # of this function early.
    if session.get('user'):
        g.user = session.get('user')
        return

    # Attempt to get the short term access token for the current user.
    result = get_user_from_cookie(cookies=request.cookies,
                                  app_id=FB_APP_ID,
                                  app_secret=FB_APP_SECRET)

    # If there is no result, we assume the user is not logged in.
    if result:
        # Check to see if this user is already in our database.
        user = User.query.filter(User.id == result['uid']).first()

        if not user:
            # Not an existing user so get info
            graph = GraphAPI(result['access_token'])
            extended_token = graph.extend_access_token(
                app_id=FB_APP_ID, app_secret=FB_APP_SECRET)
            access_token = extended_token[
                'access_token'] if extended_token else result['access_token']

            profile = graph.get_object('me')
            if 'link' not in profile:
                profile['link'] = ""

            # Create the user and insert it into the database
            user = User(id=str(profile['id']),
                        name=profile['name'],
                        profile_url=profile['link'],
                        access_token=access_token)
            db.session.add(user)
        elif user.access_token != result['access_token']:
            # If an existing user, update the access token
            user.access_token = result['access_token']

        # Add the user to the current session
        session['user'] = dict(name=user.name,
                               profile_url=user.profile_url,
                               id=user.id,
                               access_token=user.access_token)

    # Commit changes to the database and set the user as a global g.user
    db.session.commit()
    g.user = session.get('user', None)
예제 #7
0
def facebook_callback(request):
    graph = GraphAPI()

    # Получаем Long Term Access Token
    if request.GET.get('code'):
        access_token = graph.get_access_token_from_code(
            request.GET.get('code'), host_url('autoposting-facebook-callback'),
            settings.FACEBOOK_APP_ID, settings.FACEBOOK_APP_SECRET)

    else:
        access_token = graph.get_app_access_token(settings.FACEBOOK_APP_ID,
                                                  settings.FACEBOOK_APP_SECRET)

    graph.access_token = access_token['access_token']
    access_token_response = graph.extend_access_token(
        settings.FACEBOOK_APP_ID, settings.FACEBOOK_APP_SECRET)
    access_token = access_token_response['access_token']
    access_token_expires_at = datetime.datetime.now() + datetime.timedelta(
        seconds=int(access_token_response.get('expires', 60 * 60 * 24 * 60)))

    # Получаем список access_token для каждой из групп, что у нас есть в настройках
    graph = GraphAPI(access_token=access_token)
    group_access_tokens = {}
    after = None
    while True:
        if after:
            objects = graph.get_object('me/accounts', limit=25, after=after)

        else:
            objects = graph.get_object('me/accounts', limit=25)

        for group in objects['data']:
            if group['category'] == 'Community':
                group_access_tokens[group['id']] = group['access_token']

        if objects['paging'].get('next'):
            after = objects['paging']['cursors']['after']

        else:
            break

    facebook_autoposting = FacebookAutoposting.objects.all()
    for fb_autoposting in facebook_autoposting:
        if not group_access_tokens.get(fb_autoposting.page_id):
            messages.error(request,
                           'Access Token for %s not found' % fb_autoposting)
            continue

        fb_autoposting.access_token = group_access_tokens.get(
            fb_autoposting.page_id)
        fb_autoposting.access_token_expires_at = access_token_expires_at
        fb_autoposting.save()

    return redirect(
        reverse('admin:autoposting_facebookautoposting_changelist'))