Compare commits

...

3 Commits

Author SHA1 Message Date
Mads Marquart
43aa16c32d Remove stupid, obviously flaky test 2020-06-14 23:18:07 +02:00
Mads Marquart
427ae6bc5e Bump version: 2.0.0a4 -> 2.0.0a5 2020-06-14 23:15:50 +02:00
Mads Marquart
d650946531 Add act cookie on login 2020-06-14 23:00:40 +02:00
3 changed files with 30 additions and 14 deletions

View File

@@ -118,7 +118,7 @@ from ._listen import Listener
from ._client import Client from ._client import Client
__version__ = "2.0.0a4" __version__ = "2.0.0a5"
__all__ = ("Session", "Listener", "Client") __all__ = ("Session", "Listener", "Client")

View File

@@ -107,6 +107,10 @@ def session_factory() -> requests.Session:
return session return session
def login_cookies(at: datetime.datetime):
return {"act": "{}/0".format(_util.datetime_to_millis(at))}
def client_id_factory() -> str: def client_id_factory() -> str:
return hex(int(random.random() * 2 ** 31))[2:] return hex(int(random.random() * 2 ** 31))[2:]
@@ -143,7 +147,9 @@ def two_factor_helper(session: requests.Session, r, on_2fa_callback):
while "approvals_code" in data: while "approvals_code" in data:
data["approvals_code"] = on_2fa_callback() data["approvals_code"] = on_2fa_callback()
log.info("Submitting 2FA code") log.info("Submitting 2FA code")
r = session.post(url, data=data, allow_redirects=False) r = session.post(
url, data=data, allow_redirects=False, cookies=login_cookies(_util.now())
)
log.debug("2FA location: %s", r.headers.get("Location")) log.debug("2FA location: %s", r.headers.get("Location"))
url, data = find_form_request(r.content.decode("utf-8")) url, data = find_form_request(r.content.decode("utf-8"))
@@ -151,7 +157,9 @@ def two_factor_helper(session: requests.Session, r, on_2fa_callback):
if "name_action_selected" in data: if "name_action_selected" in data:
data["name_action_selected"] = "save_device" data["name_action_selected"] = "save_device"
log.info("Saving browser") log.info("Saving browser")
r = session.post(url, data=data, allow_redirects=False) r = session.post(
url, data=data, allow_redirects=False, cookies=login_cookies(_util.now())
)
log.debug("2FA location: %s", r.headers.get("Location")) log.debug("2FA location: %s", r.headers.get("Location"))
url = r.headers.get("Location") url = r.headers.get("Location")
if url and url.startswith("https://www.messenger.com/login/auth_token/"): if url and url.startswith("https://www.messenger.com/login/auth_token/"):
@@ -159,7 +167,9 @@ def two_factor_helper(session: requests.Session, r, on_2fa_callback):
url, data = find_form_request(r.content.decode("utf-8")) url, data = find_form_request(r.content.decode("utf-8"))
log.info("Starting Facebook checkup flow") log.info("Starting Facebook checkup flow")
r = session.post(url, data=data, allow_redirects=False) r = session.post(
url, data=data, allow_redirects=False, cookies=login_cookies(_util.now())
)
log.debug("2FA location: %s", r.headers.get("Location")) log.debug("2FA location: %s", r.headers.get("Location"))
url, data = find_form_request(r.content.decode("utf-8")) url, data = find_form_request(r.content.decode("utf-8"))
@@ -172,7 +182,9 @@ def two_factor_helper(session: requests.Session, r, on_2fa_callback):
data["submit[This was me]"] = "[any value]" data["submit[This was me]"] = "[any value]"
del data["submit[This wasn't me]"] del data["submit[This wasn't me]"]
log.info("Verifying login attempt") log.info("Verifying login attempt")
r = session.post(url, data=data, allow_redirects=False) r = session.post(
url, data=data, allow_redirects=False, cookies=login_cookies(_util.now())
)
log.debug("2FA location: %s", r.headers.get("Location")) log.debug("2FA location: %s", r.headers.get("Location"))
url, data = find_form_request(r.content.decode("utf-8")) url, data = find_form_request(r.content.decode("utf-8"))
@@ -180,7 +192,9 @@ def two_factor_helper(session: requests.Session, r, on_2fa_callback):
raise _exception.ParseError("Could not fill out form properly (3)", data=data) raise _exception.ParseError("Could not fill out form properly (3)", data=data)
data["name_action_selected"] = "save_device" data["name_action_selected"] = "save_device"
log.info("Saving device again") log.info("Saving device again")
r = session.post(url, data=data, allow_redirects=False) r = session.post(
url, data=data, allow_redirects=False, cookies=login_cookies(_util.now())
)
log.debug("2FA location: %s", r.headers.get("Location")) log.debug("2FA location: %s", r.headers.get("Location"))
return r.headers.get("Location") return r.headers.get("Location")
@@ -296,6 +310,7 @@ class Session:
"https://www.messenger.com/login/password/", "https://www.messenger.com/login/password/",
data=data, data=data,
allow_redirects=False, allow_redirects=False,
cookies=login_cookies(_util.now()),
) )
except requests.RequestException as e: except requests.RequestException as e:
_exception.handle_requests_error(e) _exception.handle_requests_error(e)
@@ -319,18 +334,24 @@ class Session:
if not url.startswith("https://www.facebook.com/checkpoint/start/"): if not url.startswith("https://www.facebook.com/checkpoint/start/"):
raise _exception.ParseError("Failed 2fa flow (1)", data=url) raise _exception.ParseError("Failed 2fa flow (1)", data=url)
r = session.get(url, allow_redirects=False) r = session.get(
url, allow_redirects=False, cookies=login_cookies(_util.now())
)
url = r.headers.get("Location") url = r.headers.get("Location")
if not url or not url.startswith("https://www.facebook.com/checkpoint/"): if not url or not url.startswith("https://www.facebook.com/checkpoint/"):
raise _exception.ParseError("Failed 2fa flow (2)", data=url) raise _exception.ParseError("Failed 2fa flow (2)", data=url)
r = session.get(url, allow_redirects=False) r = session.get(
url, allow_redirects=False, cookies=login_cookies(_util.now())
)
url = two_factor_helper(session, r, on_2fa_callback) url = two_factor_helper(session, r, on_2fa_callback)
if not url.startswith("https://www.messenger.com/login/auth_token/"): if not url.startswith("https://www.messenger.com/login/auth_token/"):
raise _exception.ParseError("Failed 2fa flow (3)", data=url) raise _exception.ParseError("Failed 2fa flow (3)", data=url)
r = session.get(url, allow_redirects=False) r = session.get(
url, allow_redirects=False, cookies=login_cookies(_util.now())
)
url = r.headers.get("Location") url = r.headers.get("Location")
if url != "https://www.messenger.com/": if url != "https://www.messenger.com/":

View File

@@ -15,7 +15,6 @@ from fbchat._util import (
seconds_to_timedelta, seconds_to_timedelta,
millis_to_timedelta, millis_to_timedelta,
timedelta_to_seconds, timedelta_to_seconds,
now,
) )
@@ -246,7 +245,3 @@ def test_timedelta_to_seconds():
assert timedelta_to_seconds(datetime.timedelta(seconds=1)) == 1 assert timedelta_to_seconds(datetime.timedelta(seconds=1)) == 1
assert timedelta_to_seconds(datetime.timedelta(hours=1)) == 3600 assert timedelta_to_seconds(datetime.timedelta(hours=1)) == 3600
assert timedelta_to_seconds(datetime.timedelta(days=1)) == 86400 assert timedelta_to_seconds(datetime.timedelta(days=1)) == 86400
def test_now():
assert datetime_to_millis(now()) == datetime_to_millis(datetime.datetime.now())