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

如何使用Python的curl-cffi实现Multipart/Form-Data登录POST请求

用curl-cffi实现Multipart/Form-Data登录(匹配requests成功逻辑)

下面是和你requests代码逻辑完全对齐的curl-cffi实现,可解决登录失败问题。需要注意curl-cffi的会话管理、请求构造细节,尤其是UA头设置(部分网站会校验用户代理):

from curl_cffi import requests
from html.parser import HTMLParser

class CSRFTokenScraper(HTMLParser):
    def __init__(self):
        super().__init__()
        self.csrf_token = []

    def handle_starttag(self, tag, attrs):
        if tag == 'input':
            attrs_dict = dict(attrs)
            if attrs_dict.get('name') == 'csrf_token':
                self.csrf_token.append(attrs_dict.get('value'))

class Session:
    def __init__(self, login_url, username, password, timeout=10):
        self.login_url = login_url
        self.username = username
        self.password = password
        self.timeout = timeout
        # 初始化curl-cffi会话,自动保持cookie
        self.session = requests.Session()
        self.session.verify = False
        # 设置常见浏览器UA,避免网站拦截
        self.session.headers.update({
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
        })
        self.csrf_token_scraper = CSRFTokenScraper()

    def login(self):
        # 步骤1:访问登录页提取CSRF token
        token_response = self.session.get(self.login_url, timeout=self.timeout)
        self.csrf_token_scraper.feed(token_response.text)
        csrf_token = self.csrf_token_scraper.csrf_token[0]

        # 步骤2:构造Multipart/Form-Data payload,格式与requests一致
        files = {
            'csrf_token': (None, csrf_token),
            'username': (None, self.username),
            'password': (None, self.password),
        }

        # 步骤3:发送POST请求,携带Referer头
        headers = {
            'Referer': self.login_url,
        }
        response = self.session.post(
            self.login_url,
            files=files,
            headers=headers,
            timeout=self.timeout
        )
        return response

if __name__ == "__main__":
    URL = "你的登录URL"
    USER = "你的用户名"
    PWD = "你的密码"

    session = Session(login_url=URL, username=USER, password=PWD)
    login_response = session.login()
    print(f"状态码: {login_response.status_code}")
    print(f"响应内容片段: {login_response.text[:500]}")

关键注意点

  • 会话保持:必须用curl-cffi的requests.Session()管理cookie,确保GET登录页的会话信息能传递到POST请求。
  • UA头设置:curl-cffi默认UA与requests不同,部分网站会通过UA拦截请求,设置常见浏览器UA可规避该问题。
  • Multipart格式:curl-cffi的files参数格式与requests完全兼容,(None, 值)表示该字段为普通表单字段,会自动生成正确的Multipart边界和格式。
  • 证书验证:verify=False仅用于测试环境,生产环境建议开启证书验证。

如果仍失败,可排查:

  • 查看响应内容是否有明确错误提示(如CSRF无效、账号密码错误等)。
  • 对比requests和curl-cffi的请求头,确保必要字段一致。
  • 检查登录页是否有其他隐藏表单字段,需一并加入files中提交。

内容的提问来源于stack exchange,提问作者kyrlon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 19:15:56