单纯改User-Agent无效,因为Cloudflare、Akamai等WAF在TLS握手阶段就通过SNI、ALPN、椭圆曲线顺序、扩展字段等生成JA3/JA4指纹识别客户端;Python requests底层依赖OpenSSL,指纹高度统一且缺失浏览器特有扩展,极易被识别。

为什么单纯改User-Agent根本过不了Cloudflare或Akamai?
因为现代WAF(比如Cloudflare的Managed Rules、Akamai Bot Manager)早就不只看HTTP头了。它们会在TLS握手阶段就采集客户端指纹:SNI域名、ALPN协议列表、椭圆曲线偏好顺序、扩展字段顺序、密钥交换参数等。Python默认的requests底层用的是系统OpenSSL,指纹高度统一,一扫一个准。
requests + urllib3 默认TLS指纹长什么样?
用curl -v https://example.com对比就能看出差异:Python发起的请求在Client Hello里通常只带ecdh_x25519和secp256r1两个曲线,且顺序固定;ALPN只发http/1.1;不带application_settings、signed_certificate_timestamp等常见浏览器扩展。这些全是硬伤。
实操建议:
- 别碰
requests.adapters.HTTPAdapter的ssl_context——它没法控制扩展顺序和曲线排列 - 避免用
pyOpenSSL手动构造——版本兼容差,容易触发WAF的“异常握手”规则 - 优先考虑
httpx+trustme或tls-client这类专为指纹模拟设计的库
用 tls-client 实现可配置的TLS指纹
tls-client(Go写的核心,Python封装)能精确控制Client Hello每个字节,包括扩展ID顺序、曲线ID排列、甚至伪造JA3哈希值。它不是“绕过”,而是“长得像Chrome/Firefox”。
关键点:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 安装:
pip install tls-client - 必须显式指定
ja3_string或fingerprint参数,否则用默认指纹(仍易被识别) - 真实浏览器指纹要从
chrome-devtools-protocol或ja3er.com抓取,不能手写 - 注意并发限制:每个
Session实例绑定一个TLS指纹,多账号需独立实例
示例(简化):
import tls_client
session = tls_client.Session(
client_identifier="chrome_120",
random_tls_extension_order=True
)
response = session.get("https://target.com/login")
哪些TLS特征改动反而会触发更严检测?
不是越“像浏览器”越安全。WAF有启发式规则,比如:
- 声称是Chrome 120但ALPN支持
h3-32(已废弃)→ 触发invalid_alpn规则 - 曲线列表包含
secp192r1(现代Chrome已弃用)→ 被标记为“老旧爬虫” - 发送
padding扩展但长度不符合TLS 1.3规范 → 直接RST - 同一IP短时间内切换多个JA3哈希 → 触发
ja3_flood速率限制
最常被忽略的一点:SNI域名必须和Host头、证书验证目标一致。用tls-client伪造SNI却访问另一个域名,OpenSSL层就报ssl.SSLCertVerificationError,根本到不了WAF。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










