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)