summaryrefslogtreecommitdiff
path: root/facebook.py
diff options
context:
space:
mode:
Diffstat (limited to 'facebook.py')
-rw-r--r--facebook.py185
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)