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

如何将Playwright会话Cookie迁移至requests实现合法API访问?

解决Playwright会话Cookie迁移至requests时的403 Forbidden问题

核心问题分析

你遇到的403问题通常是因为Cookie传递不完整、请求头与浏览器实际请求不一致,或者服务器对会话做了额外绑定(如IP、UA、浏览器指纹)导致的。以下是针对性的排查和解决方法:


排查与解决方案

1. 完整传递Cookie的Domain/Path属性

Playwright返回的Cookie包含domain、path等关键属性,手动构建Cookie字典会丢失这些信息,导致requests发送的Cookie不被服务器识别。正确做法是将Cookie完整导入requests的CookieJar:

import requests
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()
    context = browser.new_context()
    page = context.new_page()
    
    # 执行登录操作...
    
    # 获取包含完整属性的Cookie列表
    playwright_cookies = context.cookies()
    
    # 初始化requests会话并导入Cookie
    session = requests.Session()
    for cookie in playwright_cookies:
        session.cookies.set(
            name=cookie["name"],
            value=cookie["value"],
            domain=cookie["domain"],
            path=cookie["path"],
            secure=cookie["secure"],
            httponly=cookie["httpOnly"]
        )
    
    # 后续请求直接用session发送
    response = session.get("https://example.com/api/data")

2. 验证CSRF令牌的传递正确性

很多网站的CSRF令牌并非直接取自Cookie,而是来自页面的<meta>标签或响应头,且请求头名称可能不是csrf-token(常见的有X-CSRF-Token、X-XSRF-TOKEN):

# 从页面meta标签获取CSRF令牌(以Rails/Django常见格式为例)
csrf_token = page.locator('meta[name="csrf-token"]').get_attribute('content')

# 构建与浏览器一致的请求头
headers = {
    "accept": "application/json",
    "X-CSRF-Token": csrf_token,  # 替换为实际请求头名称
    "user-agent": page.context.browser.user_agent()  # 完全复用Playwright的UA
}

# 发送请求
response = session.get("https://example.com/api/data", headers=headers)

3. 避免浏览器指纹不一致问题

部分网站会绑定会话与浏览器指纹(如navigator属性、Canvas指纹),Playwright的浏览器环境与requests的纯HTTP请求环境差异较大,导致服务器识别为非法会话。此时最可靠的方案是直接用Playwright发送API请求,跳过Cookie迁移:

# 登录后直接使用Playwright的context发送API请求
response = context.request.get(
    "https://example.com/api/data",
    headers={
        "accept": "application/json",
        "X-CSRF-Token": csrf_token  # 从页面或Cookie获取
    }
)

# 解析响应
print(response.status_code)
print(response.json())

4. 对比浏览器与requests的请求差异

用浏览器开发者工具(Network面板)捕获成功的API请求,对比以下内容与requests请求的差异:

  • 请求头的所有字段(尤其是User-Agent、Referer、Origin)
  • 发送的Cookie列表(名称、值、属性)
  • 请求方法和URL参数

关键检查点

  • 确保Cookie的domain与请求域名完全匹配(如.example.com需覆盖example.com)
  • 不要遗漏Secure/HttpOnly属性,requests会自动处理这些属性但需正确导入
  • 确认CSRF令牌的来源和请求头名称与浏览器一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 12:27:32