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 }
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
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'] = ''
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"
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'] = ''
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)
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'))