diff options
Diffstat (limited to 'facebook.py')
-rw-r--r-- | facebook.py | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/facebook.py b/facebook.py new file mode 100644 index 0000000..c774ecf --- /dev/null +++ b/facebook.py @@ -0,0 +1,185 @@ + +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('<input[^>]*>') + + type_exp = re.compile('type="hidden"') + id_exp = re.compile('id="([^"]*)"') + name_exp = re.compile('name="([^"]*)"') + value_exp = re.compile('value="([^"]*)"') + + form = re.compile('<form.*</form>').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('<input[^>]*>') + + 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) |