class FacebookResource: FB_URL_PATTERN = re.compile('(?:(?:http|https)://)?(?:www.)?(mbasic.facebook|m\.facebook|facebook|fb)\.(com|me)/') def __init__(self, app_id, app_secret): self.facebook = GraphAPI() self.facebook.access_token = self.facebook.get_app_access_token(app_id, app_secret) def extract_fanpage_name_from_url(self, url: str): if self.FB_URL_PATTERN.match(url, 0): sub_url = self.FB_URL_PATTERN.sub('', url) return sub_url.rsplit('/', 1)[0].replace('/', '') return url def get_all_posts(self, page_name: str): return self.__get_all_connections(page_name, 'posts') def get_all_comments(self, post_id: str): return self.__get_all_connections(post_id, 'comments') def __get_all_connections(self, id: str, connection: str, **args): assert id is not None assert connection is not None while True: page = self.facebook.get_connections(id, connection, **args) for item in page['data']: yield item next_page = page.get('paging', {}).get('next') if not next_page: return args = parse_qs(urlparse(next_page).query) del args['access_token']
def __init__(self): graph_api = GraphAPI() self.access_token = graph_api.get_app_access_token(config.FACEBOOK_APP_ID, config.FACEBOOK_APP_SECRET) self.api_connection = facebook.GraphAPI(self.access_token, version=config.FACEBOOK_VERSION) self.validate_connection()
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'))
class FacebookResource: FB_URL_PATTERN = re.compile( '(?:(?:http|https)://)?(?:www.)?(mbasic.facebook|m\.facebook|facebook|fb)\.(com|me)/' ) def __init__(self, app_id, app_secret): self.facebook = GraphAPI() self.facebook.access_token = self.facebook.get_app_access_token( app_id, app_secret) def extract_fanpage_name_from_url(self, url: str): if self.FB_URL_PATTERN.match(url, 0): sub_url = self.FB_URL_PATTERN.sub('', url) return sub_url.rsplit('/', 1)[0].replace('/', '') return url def get_all_posts(self, page_name: str): return self.__get_all_connections(page_name, 'posts') def get_all_comments(self, post_id: str): return self.__get_all_connections(post_id, 'comments') def __get_all_connections(self, id: str, connection: str, **args): assert id is not None assert connection is not None while True: page = self.facebook.get_connections(id, connection, **args) for item in page['data']: yield item next_page = page.get('paging', {}).get('next') if not next_page: return args = parse_qs(urlparse(next_page).query) del args['access_token']