使用Python Requests库实现Facebook自动化登录遇响应异常求助
Facebook自动化登录问题排查与修复(Python Requests)
我尝试用Python Requests库实现Facebook自动化登录,自行通过浏览器抓包分析登录流程后编写了代码,但response.text无法返回能判断登录成功与否的正确响应,请求协助解决。
原代码
import requests import json from datetime import datetime from bs4 import BeautifulSoup import time EMAIL = 'useremail@domain.com' PASS = 'userpassword' LOGIN_URL = 'https://www.facebook.com/login.php' LOGIN_URL_MAIN = 'https://www.facebook.com/login/device-based/regular/login/?login_attempt=1&lwv=100' ACCEPTED_RESPONSE_TYPE = 'text/html; charset="utf-8"' COOKIE_NAME = 'datr' COOKIE_DIVIDER = '","' COOKIE_LEN = 24 _data = {} cookie_lst = [] headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'Cookie': '467x635', 'Sec-Ch-Ua-Platform' : '"Windows"', 'Sec-Ch-Ua-Platform-Version':'"10.0.0"', 'Sec-Fetch-Mode':'navigate', 'Upgrade-Insecure-Requests':'1', 'Sec-Fetch-User':'?1', 'Sec-Fetch-Dest': 'document', 'Viewport-Width': '467' } session = requests.Session() _source = session.get(LOGIN_URL, headers=headers) def return_cookies(url): ''' Attempt to fetch the cookie from /login.php { lgndim = eyJ3IjoxMzY2LCJoIjo3NjgsImF3IjoxMzY2LCJhaCI6NzM4LCJjIjoyNH0= lgnjs = the current time } = [+] This remains constant { ab_test_data = AAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV//VAAAABDAA } = [!] This doesn't remain constant ! ''' if _source.headers.get('Content-Type') == ACCEPTED_RESPONSE_TYPE: if _source.text.index('datr') != -1: split_scr = _source.text.split(COOKIE_NAME+COOKIE_DIVIDER) datr_cookie = split_scr[1][:COOKIE_LEN] for c in _source.cookies: if c.name or c.value: cookie_lst.append(c.name+'='+c.value) cookie_lst.append('datr='+datr_cookie) cookie_lst.append('wd=467x635') cookie_txt = "; ".join(cookie_lst) session.close() return cookie_txt def login(email, password): bs = BeautifulSoup(_source.text, 'html5lib') _hiddeninputs = bs.findAll('input', attrs={'type': 'hidden'}) for _hiddeninput in _hiddeninputs: if _hiddeninput.get('name') != None: _data[_hiddeninput.get('name')] = _hiddeninput.get('value') if _hiddeninput.get('value') == None: _data[_hiddeninput.get('name')] = '' _data['ab_test_data'] = 'AAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVA/A/AAAABCAA' _data['lgndim'] = 'eyJ3IjoxMzY2LCJoIjo3NjgsImF3IjoxMzY2LCJhaCI6NzM4LCJjIjoyNH0=' _data['lgnjs'] = int(datetime.now().timestamp()) _data['timezone'] = '-330' _data['email'] = email _data.pop(None) print(_data['had_password_prefilled']) headers['Cookie'] = return_cookies(LOGIN_URL) headers['Content-Type'] = 'application/x-www-form-urlencoded' headers['Origin'] = 'https://www.facebook.com' headers['Referer'] = LOGIN_URL time.sleep(5) _data['encpass'] = f'#PWD_BROWSER:5:{int(datetime.now().timestamp())+200}:{password}' response = session.post(LOGIN_URL_MAIN, data=_data, headers=headers, allow_redirects=True) print(response.status_code) # time.sleep(5) for h in headers: print(h) print('\n') for d in _data: print(d) login(EMAIL, PASS)
问题分析
- 会话提前关闭:
return_cookies函数中调用了session.close(),导致后续POST请求使用已失效的会话,无法维持登录状态。 - 动态参数硬编码:
ab_test_data、lgndim等参数是Facebook动态生成的验证参数,硬编码固定值会触发反爬验证,导致请求被拒绝。 - Cookie手动拼接错误:Requests的Session会自动管理Cookie,手动拼接Cookie会覆盖或破坏会话中的有效Cookie,导致身份验证失败。
- 密码加密逻辑偏差:
encpass的时间戳计算(timestamp()+200)不符合Facebook当前的加密规则,且加密格式可能已更新。 - 无效Header设置:初始Header中的
Cookie: 467x635是无效值,会干扰Session的Cookie管理。
修正后的代码
import requests from datetime import datetime from bs4 import BeautifulSoup import time EMAIL = 'useremail@domain.com' PASS = 'userpassword' LOGIN_URL = 'https://www.facebook.com/login.php' LOGIN_POST_URL = 'https://www.facebook.com/login/device-based/regular/login/' # 只保留必要的Header,避免冗余参数触发反爬 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'Accept-Language': 'en-US,en;q=0.9' } session = requests.Session() def login(email, password): # 第一步:获取登录页面,提取必要的表单参数和会话Cookie login_page = session.get(LOGIN_URL, headers=headers) soup = BeautifulSoup(login_page.text, 'html5lib') # 提取所有隐藏表单参数 form_data = {} for hidden_input in soup.find_all('input', type='hidden'): name = hidden_input.get('name') value = hidden_input.get('value', '') if name: form_data[name] = value # 填充必要的动态参数 form_data['email'] = email form_data['lgnjs'] = int(datetime.now().timestamp()) form_data['timezone'] = '-330' # 密码加密格式遵循Facebook当前规则,时间戳用当前时间 form_data['encpass'] = f'#PWD_BROWSER:5:{int(datetime.now().timestamp())}:{password}' # 第二步:发送登录POST请求,Session自动管理Cookie headers.update({ 'Origin': 'https://www.facebook.com', 'Referer': LOGIN_URL, 'Content-Type': 'application/x-www-form-urlencoded' }) time.sleep(3) # 简单延迟,避免触发速率限制 response = session.post(LOGIN_POST_URL, data=form_data, headers=headers, allow_redirects=True) # 判断登录成功的方式:检查响应是否包含主页特征,或重定向到主页 if 'Facebook' in response.text and 'Home' in response.text: print('登录成功') elif 'checkpoint' in response.url: print('触发验证,需要手动处理') else: print('登录失败,响应状态码:', response.status_code) print('响应内容片段:', response.text[:500]) login(EMAIL, PASS)
关键修改说明
- 保留会话活跃:移除
session.close(),让Session全程管理Cookie和会话状态。 - 动态提取参数:直接从登录页面提取所有隐藏表单参数,不再硬编码
ab_test_data、lgndim等动态值。 - 简化Header:只保留必要的
User-Agent和Accept-Language,避免冗余参数触发反爬机制。 - 修正密码加密:使用当前时间戳生成
encpass,符合Facebook的加密格式要求。 - 登录状态判断:通过响应内容中的主页特征或重定向URL判断登录结果,更准确可靠。
内容的提问来源于stack exchange,提问作者9309 Huzefa Dayanji
相关产品推荐
相关产品推荐

