import re
import requests
class FbAuthenticationError(Exception):
pass
class FacebookAPI(object):
def __init__(self, email, password):
"""Create a new Facebook interface."""
self._email = email
self._password = password
self._session = None
self._login()
def _build_login_params(self, content):
"""Parse HTML code to get POST login parameters."""
params = {}
# Get the form parameters
input_exp = re.compile(']*>')
type_exp = re.compile('type="hidden"')
id_exp = re.compile('id="([^"]*)"')
name_exp = re.compile('name="([^"]*)"')
value_exp = re.compile('value="([^"]*)"')
form = re.compile('
').search(content).group()
for inp in input_exp.findall(form):
match = type_exp.search(inp)
if match is None:
continue
name = name_exp.search(inp)
if name is None:
continue
else:
name = name.group(1)
value = value_exp.search(inp)
if value is None:
value = ''
else:
value = value.group(1)
params[name] = value
# Extend with user login
params["email"] = self._email
params["pass"] = self._password
params["login"] = "1"
return params
def _login(self):
"""Log into Facebook services."""
headers = {
"Host": "www.facebook.com",
"User-agent": "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.5",
"Accept-Encoding": "gzip, deflate",
"DNT": "1",
"Connection": "keep-alive",
"Cache-Control": "max-age=0",
}
self._session = requests.Session()
self._session.headers.update(headers)
response = self._session.post('https://www.facebook.com/login.php', data={})
params = self._build_login_params(str(response.content))
response = self._session.post('https://www.facebook.com/login.php', data=params)
#print('headers', response.headers)
#print('cookies', requests.utils.dict_from_cookiejar(self._session.cookies))
# If c_user cookie is present, login was successful
if not('c_user' in self._session.cookies):
raise FbAuthenticationError()
def get_user_id(self):
"""Get the identifier for the registered user."""
if not('c_user' in self._session.cookies):
raise FbAuthenticationError()
return self._session.cookies['c_user']
def _build_access_params(self, content):
"""Parse HTML code to get POST access parameters."""
params = {}
# Get the form parameters
input_exp = re.compile(']*>')
type_exp = re.compile('type="hidden"')
id_exp = re.compile('id="([^"]*)"')
name_exp = re.compile('name="([^"]*)"')
value_exp = re.compile('value="([^"]*)"')
form = re.compile('platformDialogForm.*form>').search(content).group()
form = form.replace('\\u003C', '<')
form = form.replace('\\', '')
for inp in input_exp.findall(form):
match = type_exp.search(inp)
if match is None:
continue
name = name_exp.search(inp)
if name is None:
continue
else:
name = name.group(1)
value = value_exp.search(inp)
if value is None:
value = ''
else:
value = value.group(1)
params[name] = value
return params
def get_tinder_token(self):
"""Get an access token for Tinder."""
# Cf. https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow
params = {
"redirect_uri": "fb464891386855067://authorize/",
"scope": "user_birthday,user_photos,user_education_history,email,user_relationship_details" \
+ ",user_friends,user_work_history,user_likes",
"response_type": "token,signed_request",
"client_id": "464891386855067"
}
url = 'https://www.facebook.com/v2.6/dialog/oauth'
response = self._session.get(url, params=params)
params = self._build_access_params(str(response.content))
response = self._session.post('https://www.facebook.com/v2.6/dialog/oauth/confirm?dpr=1', data=params)
token_exp = re.compile('access_token=([^&]*)&')
match = token_exp.search(str(response.content))
if match is None:
raise FbAuthenticationError
return match.group(1)