@@ -107,6 +107,10 @@ def session_factory() -> requests.Session:
107107 return session
108108
109109
110+ def login_cookies (at : datetime .datetime ):
111+ return {"act" : "{}/0" .format (_util .datetime_to_millis (at ))}
112+
113+
110114def client_id_factory () -> str :
111115 return hex (int (random .random () * 2 ** 31 ))[2 :]
112116
@@ -143,23 +147,29 @@ def two_factor_helper(session: requests.Session, r, on_2fa_callback):
143147 while "approvals_code" in data :
144148 data ["approvals_code" ] = on_2fa_callback ()
145149 log .info ("Submitting 2FA code" )
146- r = session .post (url , data = data , allow_redirects = False )
150+ r = session .post (
151+ url , data = data , allow_redirects = False , cookies = login_cookies (_util .now ())
152+ )
147153 log .debug ("2FA location: %s" , r .headers .get ("Location" ))
148154 url , data = find_form_request (r .content .decode ("utf-8" ))
149155
150156 # TODO: Can be missing if checkup flow was done on another device in the meantime?
151157 if "name_action_selected" in data :
152158 data ["name_action_selected" ] = "save_device"
153159 log .info ("Saving browser" )
154- r = session .post (url , data = data , allow_redirects = False )
160+ r = session .post (
161+ url , data = data , allow_redirects = False , cookies = login_cookies (_util .now ())
162+ )
155163 log .debug ("2FA location: %s" , r .headers .get ("Location" ))
156164 url = r .headers .get ("Location" )
157165 if url and url .startswith ("https://www.messenger.com/login/auth_token/" ):
158166 return url
159167 url , data = find_form_request (r .content .decode ("utf-8" ))
160168
161169 log .info ("Starting Facebook checkup flow" )
162- r = session .post (url , data = data , allow_redirects = False )
170+ r = session .post (
171+ url , data = data , allow_redirects = False , cookies = login_cookies (_util .now ())
172+ )
163173 log .debug ("2FA location: %s" , r .headers .get ("Location" ))
164174
165175 url , data = find_form_request (r .content .decode ("utf-8" ))
@@ -172,15 +182,19 @@ def two_factor_helper(session: requests.Session, r, on_2fa_callback):
172182 data ["submit[This was me]" ] = "[any value]"
173183 del data ["submit[This wasn't me]" ]
174184 log .info ("Verifying login attempt" )
175- r = session .post (url , data = data , allow_redirects = False )
185+ r = session .post (
186+ url , data = data , allow_redirects = False , cookies = login_cookies (_util .now ())
187+ )
176188 log .debug ("2FA location: %s" , r .headers .get ("Location" ))
177189
178190 url , data = find_form_request (r .content .decode ("utf-8" ))
179191 if "name_action_selected" not in data :
180192 raise _exception .ParseError ("Could not fill out form properly (3)" , data = data )
181193 data ["name_action_selected" ] = "save_device"
182194 log .info ("Saving device again" )
183- r = session .post (url , data = data , allow_redirects = False )
195+ r = session .post (
196+ url , data = data , allow_redirects = False , cookies = login_cookies (_util .now ())
197+ )
184198 log .debug ("2FA location: %s" , r .headers .get ("Location" ))
185199 return r .headers .get ("Location" )
186200
@@ -296,6 +310,7 @@ def login(
296310 "https://www.messenger.com/login/password/" ,
297311 data = data ,
298312 allow_redirects = False ,
313+ cookies = login_cookies (_util .now ()),
299314 )
300315 except requests .RequestException as e :
301316 _exception .handle_requests_error (e )
@@ -319,18 +334,24 @@ def login(
319334 if not url .startswith ("https://www.facebook.com/checkpoint/start/" ):
320335 raise _exception .ParseError ("Failed 2fa flow (1)" , data = url )
321336
322- r = session .get (url , allow_redirects = False )
337+ r = session .get (
338+ url , allow_redirects = False , cookies = login_cookies (_util .now ())
339+ )
323340 url = r .headers .get ("Location" )
324341 if not url or not url .startswith ("https://www.facebook.com/checkpoint/" ):
325342 raise _exception .ParseError ("Failed 2fa flow (2)" , data = url )
326343
327- r = session .get (url , allow_redirects = False )
344+ r = session .get (
345+ url , allow_redirects = False , cookies = login_cookies (_util .now ())
346+ )
328347 url = two_factor_helper (session , r , on_2fa_callback )
329348
330349 if not url .startswith ("https://www.messenger.com/login/auth_token/" ):
331350 raise _exception .ParseError ("Failed 2fa flow (3)" , data = url )
332351
333- r = session .get (url , allow_redirects = False )
352+ r = session .get (
353+ url , allow_redirects = False , cookies = login_cookies (_util .now ())
354+ )
334355 url = r .headers .get ("Location" )
335356
336357 if url != "https://www.messenger.com/" :
0 commit comments