diff --git a/Procfile b/Procfile index 4bf2638..61a145e 100644 --- a/Procfile +++ b/Procfile @@ -1 +1 @@ -web: python exampleapp.py +web: gunicorn exampleapp:app diff --git a/exampleapp.py b/exampleapp.py index 8a120a3..3c75572 100644 --- a/exampleapp.py +++ b/exampleapp.py @@ -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 @@ -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') @@ -31,7 +36,7 @@ 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): @@ -39,24 +44,24 @@ def base64_url_encode(data): 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 @@ -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 = {} @@ -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 @@ -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) @@ -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') @@ -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 @@ -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') diff --git a/requirements.txt b/requirements.txt index ddac052..758d5e0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -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 diff --git a/runtime.txt b/runtime.txt new file mode 100644 index 0000000..237bde8 --- /dev/null +++ b/runtime.txt @@ -0,0 +1 @@ +python-3.3.2