Skip to content
This repository was archived by the owner on Oct 16, 2024. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Procfile
Original file line number Diff line number Diff line change
@@ -1 +1 @@
web: python exampleapp.py
web: gunicorn exampleapp:app
52 changes: 28 additions & 24 deletions exampleapp.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,12 @@
import base64
import os
import os.path
import urllib
try:
from urllib.parse import urlencode
from urllib.parse import parse_qs
except ImportError:
from urllib import urlencode
from urlparse import parse_qs
import hmac
import json
import hashlib
Expand All @@ -16,7 +21,7 @@
requests = requests.session()

app_url = 'https://graph.facebook.com/{0}'.format(FB_APP_ID)
FB_APP_NAME = json.loads(requests.get(app_url).content).get('name')
FB_APP_NAME = json.loads(requests.get(app_url).text).get('name')
FB_APP_SECRET = os.environ.get('FACEBOOK_SECRET')


Expand All @@ -31,32 +36,32 @@ def oauth_login_url(preserve_path=True, next_url=None):


def simple_dict_serialisation(params):
return "&".join(map(lambda k: "%s=%s" % (k, params[k]), params.keys()))
return "&".join(["%s=%s" % (k, params[k]) for k in list(params.keys())])


def base64_url_encode(data):
return base64.urlsafe_b64encode(data).rstrip('=')


def fbapi_get_string(path,
domain=u'graph', params=None, access_token=None,
encode_func=urllib.urlencode):
domain='graph', params=None, access_token=None,
encode_func=urlencode):
"""Make an API call"""

if not params:
params = {}
params[u'method'] = u'GET'
params['method'] = 'GET'
if access_token:
params[u'access_token'] = access_token
params['access_token'] = access_token

for k, v in params.iteritems():
for k, v in params.items():
if hasattr(v, 'encode'):
params[k] = v.encode('utf-8')

url = u'https://' + domain + u'.facebook.com' + path
url = 'https://' + domain + '.facebook.com' + path
params_encoded = encode_func(params)
url = url + params_encoded
result = requests.get(url).content
result = requests.get(url).text

return result

Expand All @@ -67,7 +72,7 @@ def fbapi_auth(code):
'client_secret': app.config['FB_APP_SECRET'],
'code': code}

result = fbapi_get_string(path=u"/oauth/access_token?", params=params,
result = fbapi_get_string(path="/oauth/access_token?", params=params,
encode_func=simple_dict_serialisation)
pairs = result.split("&", 1)
result_dict = {}
Expand All @@ -79,14 +84,14 @@ def fbapi_auth(code):

def fbapi_get_application_access_token(id):
token = fbapi_get_string(
path=u"/oauth/access_token",
params=dict(grant_type=u'client_credentials', client_id=id,
path="/oauth/access_token",
params=dict(grant_type='client_credentials', client_id=id,
client_secret=app.config['FB_APP_SECRET']),
domain=u'graph')
domain='graph')

token = token.split('=')[-1]
if not str(id) in token:
print 'Token mismatch: %s not in %s' % (id, token)
print('Token mismatch: %s not in %s' % (id, token))
return token


Expand All @@ -99,13 +104,13 @@ def fql(fql, token, args=None):
url = "https://api.facebook.com/method/fql.query"

r = requests.get(url, params=args)
return json.loads(r.content)
return json.loads(r.text)


def fb_call(call, args=None):
url = "https://graph.facebook.com/{0}".format(call)
r = requests.get(url, params=args)
return json.loads(r.content)
return json.loads(r.text)



Expand All @@ -132,14 +137,14 @@ def get_token():

sig = encoded_data[0]
data = json.loads(urlsafe_b64decode(str(encoded_data[1]) +
(64-len(encoded_data[1])%64)*"="))
(64-len(encoded_data[1])%64)*"=").decode("utf-8"))

if not data['algorithm'].upper() == 'HMAC-SHA256':
raise ValueError('unknown algorithm {0}'.format(data['algorithm']))

h = hmac.new(FB_APP_SECRET, digestmod=hashlib.sha256)
h.update(encoded_data[1])
expected_sig = urlsafe_b64encode(h.digest()).replace('=', '')
h = hmac.new(FB_APP_SECRET.encode('utf-8'), digestmod=hashlib.sha256)
h.update(encoded_data[1].encode("utf-8"))
expected_sig = urlsafe_b64encode(h.digest()).decode("utf-8").replace('=', '')

if sig != expected_sig:
raise ValueError('bad signature')
Expand All @@ -153,9 +158,8 @@ def get_token():
'code': data['code']
}

from urlparse import parse_qs
r = requests.get('https://graph.facebook.com/oauth/access_token', params=params)
token = parse_qs(r.content).get('access_token')
token = parse_qs(r.text).get('access_token')

return token

Expand Down Expand Up @@ -218,4 +222,4 @@ def close():
if app.config.get('FB_APP_ID') and app.config.get('FB_APP_SECRET'):
app.run(host='0.0.0.0', port=port)
else:
print 'Cannot start application without Facebook App Id and Secret set'
print('Cannot start application without Facebook App Id and Secret set')
14 changes: 8 additions & 6 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
Flask==0.7.2
Jinja2==2.6
Werkzeug==0.7.1
simplejson==2.2.1
wsgiref==0.1.2
requests==0.10.4
Flask==0.10.1
Jinja2==2.7.1
MarkupSafe==0.18
Werkzeug==0.9.4
gunicorn==18.0
itsdangerous==0.23
requests==2.0.1
simplejson==3.3.1
1 change: 1 addition & 0 deletions runtime.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
python-3.3.2