核心原则
86103 风控的根因是「字段不像」,不是 IP 被封或频次太高。
必检清单(按优先级)
1. TLS impersonate 版本
from curl_cffi.requests.impersonate import BrowserType
supported = [b for b in dir(BrowserType) if 'chrome' in b.lower()]
规则:impersonate 版本落后真实 Chrome ≥2 个大版本必被拦。
import curl_cffi.requests as req
session = req.Session(impersonate='chrome132')
2. sec-ch-ua greasy brand
Chrome 每次构建轮换 greasy brand 字符:.A/、?A_、(A:、-A.、_A
import random
greasy_chars = ['.A/', '?A_', '(A:', '-A.', '_A ']
headers['sec-ch-ua'] = (
f'"Google Chrome";v="132", "Chromium";v="132", "{random.choice(greasy_chars)}Brand";v="99"'
)
3. accept-encoding 必须含 zstd
Chrome 117+ 强制带 zstd,不带就是脚本特征:
headers['accept-encoding'] = 'gzip, deflate, br, zstd'
4. Cookie domain 隔离陷阱
# 错误:domain 与目标请求域名不一致,cookie 不会发出
session.cookies.set('_uuid', 'xxx', domain='.bilibili.com')
# 正确:domain 必须与目标请求域名一致
session.cookies.set('_uuid', 'xxx', domain='.huasheng.cn')
排查流程
- 用 chrome-devtools-mcp 驱动真实 Chrome 跑完整流程,抓真包 headers
- 与协议层 dump 的 headers 做字节级 diff
- 优先修字段顺序、greasy brand、accept-encoding