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

使用Python Requests登录Facebook并发布动态失败,请求代码排查

问题:使用Python Requests登录Facebook并发布动态失败

我尝试使用Python Requests库登录Facebook并发布动态,但登录的POST请求方法无法正常工作。请帮忙检查以下代码是否存在问题,另外我不希望使用浏览器来实现该功能。

import requests
from bs4 import BeautifulSoup

def login_to_facebook(username, password):
    """Logs into Facebook using the given username and password."""

    # Create a session with the Requests library.
    session = requests.Session()

    # Get the login form data.
    login_data = {
        'email': username,
        'pass': password
    }

    # POST the login data to the Facebook login endpoint. 
    response = session.post('https://www.facebook.com/login.php', data=login_data)
    response_new = session.post('https://web.facebook.com/login/device-based/regular/login/?login_attempt=1&lwv=101', data=login_data)
    print("Contacts" in response.text)

    # Check if the login was successful.
    if response.status_code >= 200:
        return session
    else:
        raise Exception('Login failed.')

if __name__ == '__main__':
    # Get the username and password from the user.
    username = "alif.alemran.2@gmail.com"
    password = "abcd"

    # Log into Facebook.
    session = login_to_facebook(username, password)

    # Do something with the logged-in session.
    # For example, you could post a status update.
    response2 = session.post('https://www.facebook.com/me/posts', data={'status': 'Hello, world!'})
    print(response2.url)

需求目标:登录Facebook并发布一条动态。


问题分析与解决方案

代码存在的核心问题

  • 缺少动态生成的登录参数:Facebook登录表单不止email和pass,还需要lsd、jazoest、m_ts、li等动态参数,这些参数随每次登录请求变化,必须从登录页面HTML中提取,直接硬传账号密码会被拦截。
  • 错误的登录成功判断:用response.status_code >=200判断登录成功完全无效——即使登录失败,Facebook也会返回200状态码,应该检查响应内容是否包含登录后的标识(如"主页"、个人信息相关文本)。
  • 重复发送登录请求:连续向两个不同接口发送登录请求会干扰会话状态,导致登录逻辑混乱。
  • 发布动态的接口错误:https://www.facebook.com/me/posts不是正确的发布接口,且发布动态需要fb_dtsg(CSRF令牌)等多个参数,仅传status无法完成请求。

修正后的代码示例

import requests
from bs4 import BeautifulSoup

def login_to_facebook(username, password):
    session = requests.Session()
    # 模拟浏览器请求头,避免被Facebook拦截
    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'
    }
    session.headers.update(headers)

    # 先获取登录页面,提取动态参数
    login_page = session.get('https://www.facebook.com/login.php')
    soup = BeautifulSoup(login_page.text, 'html.parser')
    
    # 提取登录必需的动态参数
    login_data = {
        'email': username,
        'pass': password,
        'lsd': soup.find('input', {'name': 'lsd'})['value'],
        'jazoest': soup.find('input', {'name': 'jazoest'})['value'],
        'm_ts': soup.find('input', {'name': 'm_ts'})['value'],
        'li': soup.find('input', {'name': 'li'})['value'],
        'login': 'Log In'  # 根据页面语言调整,中文页面用'登录'
    }

    # 发送登录请求
    login_response = session.post('https://www.facebook.com/login.php', data=login_data)
    
    # 验证登录是否成功
    if "Home" in login_response.text or "主页" in login_response.text:
        return session
    else:
        raise Exception('登录失败:可能触发安全验证(如验证码)或参数提取错误')

if __name__ == '__main__':
    username = "your_username"
    password = "your_password"
    try:
        session = login_to_facebook(username, password)
        print("登录成功")

        # 准备发布动态:需从个人主页提取CSRF令牌等参数
        profile_page = session.get('https://www.facebook.com/me')
        soup = BeautifulSoup(profile_page.text, 'html.parser')
        csrf_token = soup.find('input', {'name': 'fb_dtsg'})['value']
        
        # 注意:Facebook发布接口频繁更新,需抓包浏览器请求确认实际参数和地址
        post_data = {
            'fb_dtsg': csrf_token,
            'message': 'Hello, world!',
            # 需补充其他从页面提取的动态参数(如__user、__a等)
        }
        # 示例接口,实际需替换为抓包得到的正确接口
        post_response = session.post('https://www.facebook.com/ajax/updatestatus.php', data=post_data)
        print("发布请求状态码:", post_response.status_code)
        print("发布结果:", post_response.json())
    except Exception as e:
        print(e)

额外注意事项

  1. 安全验证问题:如果账号开启双重验证,或登录环境与常用环境差异大,Facebook会触发验证码/设备验证,此时Requests无法自动处理,需手动完成验证或改用官方Graph API。
  2. 接口稳定性:Facebook的前端接口经常变更,建议用浏览器开发者工具抓包实际发布动态的请求,复制准确的参数和接口地址。
  3. 请求头模拟:必须设置符合浏览器规范的User-Agent,否则请求会被直接拦截。

内容的提问来源于stack exchange,提问作者Alif al emran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:55:13