浏览器与curl发送HTTP请求的差异:挪威航空API调用触发人机验证问题
挪威航空API curl请求触发生态验证的原因说明
你遇到的是非常典型的反爬系统识别非浏览器请求的场景,浏览器并没有发送开发者工具未捕获的HTTP头信息,区分依据主要来自HTTP协议层以下的特征,以及请求的隐性规则,具体原因如下:
- TLS指纹识别
绝大多数主流反爬系统都会校验JA3/JA3S指纹,这个指纹由TLS握手阶段的加密套件列表、扩展字段、椭圆曲线参数等信息组合生成,不同客户端(浏览器、curl、Postman等)的默认TLS配置差异极大,哪怕你完全复制了所有HTTP头,反爬系统也可以通过TLS指纹直接判定你用的不是真实浏览器。 - HTTP/2帧特征差异
现在浏览器默认都用HTTP/2协议发起请求,而部分系统的curl默认还是用HTTP/1.1,就算你手动开启curl的HTTP/2支持,两者的HTTP/2帧的发送顺序、流优先级设置、帧参数也有明显差异,这些特征同样会被反爬系统采集校验。 - 请求头顺序不匹配
不同浏览器的请求头发送顺序是固定的,比如Chrome固定先发送authority、然后sec-ch-ua系列、再是upgrade-insecure-requests、user-agent等,而curl的请求头发送顺序会受默认参数、你传入-H参数的顺序影响,一旦和浏览器默认顺序不一致,也会触发拦截。 - 其他隐性校验
部分反爬还会校验TCP握手的TTL值、TCP选项参数,甚至会主动探测客户端是否支持浏览器特有的JS API、WebRTC等特性,这些都不在HTTP头的可见范围内,自然无法通过开发者工具复制。
可行的解决方案
你可以按顺序尝试以下操作:
- 给curl命令增加
--http2参数,强制使用HTTP/2协议发起请求,对齐浏览器的协议层配置 - 严格按照浏览器开发者工具网络面板里显示的请求头顺序,调整你curl命令中
-H参数的排列顺序 - 如果上述操作无效,可以使用专门修改过的
curl-impersonate工具,它可以完全模拟主流浏览器的TLS和HTTP/2指纹,绕过绝大多数这类校验
内容的提问来源于stack exchange,提问作者Matt Immer
相关产品推荐
相关产品推荐

