def fetch_threads(page, next_url=None): api = FacebookAPI(page.access_token) data = api.fetch_raw(next_url) if next_url else api.fetch(page.key.id() + '/threads') docs = [] if data.get('paging', {}).get('next'): taskqueue.Queue('facebook').add( taskqueue.Task( url='/worker/fetch_page_threads', params={ 'key': page.key.urlsafe(), 'next_url': data.get('paging').get('next'), } ) ) for thread in data.get('data'): messages = thread.get('messages').get('data') if len(messages) == 0: continue # Let the first message be the 'post'. message = messages.pop() post_model = Post( parent=page.key, is_private=True, is_reply=False, id=message.get('id'), created_time=FacebookAPI.parse_date(message.get('created_time')), from_id=message.get('from').get('id'), from_name=message.get('from').get('name'), message=message.get('message'), author=scan_for_author(message.get('message')), ) post_model.put() docs.append(search.create_document(post_model)) # Let the rest of the messages be replies: for reply in messages: reply_model = Post( parent=post_model.key, is_private=True, is_reply=True, id=reply.get('id'), created_time=FacebookAPI.parse_date(reply.get('created_time')), from_id=reply.get('from').get('id'), from_name=reply.get('from').get('name'), message=reply.get('message'), author=scan_for_author(reply.get('message')), ) reply_model.put() docs.append(search.create_document(reply_model)) search.index(page, docs)
class FacebookHandler(BaseRequestHandler): def __init__(self, request, response): self.initialize(request, response) self.api = FacebookAPI(self.current_user.facebook_access_token) def _set_access_token_from_page(self, page_id): m = Page.get_by_id(page_id, parent=self.current_user.key) self.api.access_token = m.access_token def get_feed(self, page_id): self._set_access_token_from_page(page_id) data = self.api.fetch(page_id + "/feed") self.response.headers['Content-Type'] = 'application/json' self.response.write(json.dumps(data)) def get_threads(self, page_id): self._set_access_token_from_page(page_id) data = self.api.fetch(page_id + "/threads") self.response.headers['Content-Type'] = 'application/json' self.response.write(json.dumps(data))
def fetch_feed(page, next_url=None): api = FacebookAPI(page.access_token) data = api.fetch_raw(next_url) if next_url else api.fetch(page.key.id() + '/feed') docs = [] if data.get('paging', {}).get('next'): taskqueue.Queue('facebook').add( taskqueue.Task( url='/worker/fetch_page_feed', params={ 'key': page.key.urlsafe(), 'next_url': data.get('paging').get('next'), } ) ) for post in data.get('data'): post_model = Post( parent=page.key, id=post.get('id'), created_time=FacebookAPI.parse_date(post.get('created_time')), updated_time=FacebookAPI.parse_date(post.get('updated_time')), from_id=post.get('from').get('id'), from_name=post.get('from').get('name'), from_category=post.get('from').get('category'), message=post.get('message') or post.get('story'), author=scan_for_author(post.get('message')), ) post_model.put() docs.append(search.create_document(post_model)) if not 'comments' in post: continue for comment in post.get('comments').get('data'): comment_model = Post( parent=post_model.key, is_reply=True, id=comment.get('id'), created_time=FacebookAPI.parse_date(comment.get('created_time')), from_id=comment.get('from').get('id'), from_name=comment.get('from').get('name'), from_category=comment.get('from').get('category'), message=comment.get('message'), author=scan_for_author(comment.get('message')), ) comment_model.put() docs.append(search.create_document(comment_model)) search.index(page, docs)
def fetch_pages(user): api = FacebookAPI(user.facebook_access_token) pages = api.fetch("me/accounts") for page in pages['data']: m = Page( parent=user.key, id=page['id'], access_token=page['access_token'], name=page['name'], ) m.put() taskqueue.Queue('facebook').add( taskqueue.Task( url='/worker/fetch_page', params={ 'key': m.key.urlsafe(), } ) )