Skip to content

Instantly share code, notes, and snippets.

@drGrove
Last active November 11, 2016 21:37
Show Gist options
  • Save drGrove/326da806dc489fe77b903b1cd6f0a9b6 to your computer and use it in GitHub Desktop.
Save drGrove/326da806dc489fe77b903b1cd6f0a9b6 to your computer and use it in GitHub Desktop.
A Facebook Graph API preprocessor to get albums for Grow
"""
Convert Facebook Graph API responses to YAML.
To keep data secure. Use environment variable FACEBOOK_ACCESS_TOKEN
instead of storing in podspec
"""
import grow
from protorpc import messages
import requests
import json
import os
import yaml
class Error(Exception):
pass
class InvalidHttpCodeError(Error):
pass
class NoAccessTokenError(Error):
pass
class BaseFbGraphYamlPreprocessor(grow.Preprocessor):
_graph_url = 'https://graph.facebook.com'
def run(self, build=True):
if self.config.access_token is None:
try:
self.config.access_token = os.environ['FACEBOOK_ACCESS_TOKEN']
except:
raise NoAccessTokenError
self.execute(self.config)
def execute(self, config):
raise NotImplementedError
class FbAlbumYamlPreprocessor(BaseFbGraphYamlPreprocessor):
KIND = 'facebook_album_yaml'
_album_url_format = BaseFbGraphYamlPreprocessor._graph_url + '/{version}/{id}/albums?access_token={access_token}&fields={fields}'
class Config(messages.Message):
id = messages.IntegerField(1)
fields = messages.StringField(2)
data_path = messages.StringField(3)
gen_paths = messages.BooleanField(4, default=False)
content_base = messages.StringField(5, default='/content/pages')
album_path = messages.StringField(6, default='/{root}/{base}')
view_path = messages.StringField(7, default='/views/photo-viewer.html')
version = messages.StringField(8, default='v2.8')
access_token = messages.StringField(9)
@classmethod
def get_album_url(cls, config):
return cls._album_url_format.format(id=config.id,
version=config.version,
access_token=config.access_token,
fields=config.fields)
@classmethod
def download(cls, url):
r = requests.get(url)
data = r.json()
return data['data']
def _parse_path(self, path):
if ':' in path:
return path.rsplit(':', 1)
return path, None
def _create_document_for_album(self, config, album_data):
content = {
'$title': album_data['name'],
'$path': config.album_path,
'partials': [{
'partial': config.view_path,
'title': album_data['name'],
'album_id': album_data['id'],
'data_doc': '/data/albums.yaml'
}]
}
album_name = '-'.join(album_data['name'].split(' '))
content = json.dumps(content)
content = yaml.safe_dump(yaml.safe_load(content), default_flow_style=False)
self.logger.info('Album Name: {}'.format(album_name))
file_path = '{}/{}.yaml'.format(config.content_base, album_name.lower())
self.logger.info('Generating file at -> {}'.format(file_path))
self.pod.write_file(file_path, content)
def execute(self, config):
data_path, key_to_update = self._parse_path(config.data_path)
album_url = FbAlbumYamlPreprocessor.get_album_url(config)
content = FbAlbumYamlPreprocessor.download(album_url)
for album in content:
self._create_document_for_album(config, album)
content = json.dumps(content)
content = yaml.safe_dump(yaml.safe_load(content),
default_flow_style=False)
self.logger.info('Downloaded Album Data -> {}'.format(data_path))
self.pod.write_file(data_path, content)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment