You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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)

问题分析

  1. 会话提前关闭:return_cookies函数中调用了session.close(),导致后续POST请求使用已失效的会话,无法维持登录状态。
  2. 动态参数硬编码:ab_test_data、lgndim等参数是Facebook动态生成的验证参数,硬编码固定值会触发反爬验证,导致请求被拒绝。
  3. Cookie手动拼接错误:Requests的Session会自动管理Cookie,手动拼接Cookie会覆盖或破坏会话中的有效Cookie,导致身份验证失败。
  4. 密码加密逻辑偏差:encpass的时间戳计算(timestamp()+200)不符合Facebook当前的加密规则,且加密格式可能已更新。
  5. 无效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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:48:05