Java HttpClient请求遭Cloudflare拦截,如何伪装成Firefox浏览器请求?
Java HttpClient请求遭Cloudflare拦截,如何伪装成Firefox浏览器请求?
碰到Cloudflare的拦截真的挺闹心的,我来帮你拆解下问题所在和可行的解决思路:
核心原因:Cloudflare的检测不止看请求头
Cloudflare的人机验证(尤其是JS挑战)可不是只检查User-Agent这么简单。它会校验一堆浏览器专属的特征:
- 浏览器的JS执行能力:Firefox控制台里的fetch是在完整的浏览器环境中,会自动执行Cloudflare返回的验证JS,完成校验后拿到合法Cookie;但你的Java HttpClient只是模拟了请求头,根本没法执行JS,自然过不了验证。
- 浏览器指纹:比如Canvas、WebGL指纹,这些是Java HttpClient模拟不出来的。
- 请求上下文:比如请求的时序、Cookie状态、甚至是TCP连接的一些细节。
先优化你的请求头试试(临时缓解)
你当前的请求头有几个可能不符合浏览器真实请求的地方,调整后说不定能绕过基础检测:
- 补充浏览器必带的
Accept-Encoding和Connection头 - 修正
Sec-Fetch-*系列头:因为你调用的是API接口,不是加载文档,这些头的值和浏览器加载页面时不一样 - 可能还需要加
Cache-Control头
修改后的请求头示例:
HttpRequest request = HttpRequest.newBuilder() .GET() .uri(new URI("https://api.doggy.market/listings/nfts/minidoges?sortBy=price&sortOrder=asc&offset=0&limit=30")) .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8") .header("Accept-Language","en-US,en;q=0.5") .header("Accept-Encoding", "gzip, deflate, br") // 新增:浏览器都会带压缩编码头 .header("Connection", "keep-alive") // 新增:保持连接复用,符合浏览器行为 .header("Cache-Control", "max-age=0") // 新增:浏览器发起请求时的缓存控制 .header("Sec-Fetch-Dest", "empty") // 修正:API请求的目标是empty,不是document .header("Sec-Fetch-Mode", "cors") // 修正:跨域/同域API请求用cors,不是navigate .header("Sec-Fetch-Site", "same-origin") // 修正:如果是从同域名页面发起的请求,用same-origin .header("TE", "trailers") .header("Upgrade-Insecure-Requests", "1") .header("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:121.0) Gecko/20100101 Firefox/121.0") .build();
临时解决方案:复用浏览器的验证Cookie
如果只是临时测试,你可以先在Firefox里打开这个API地址,完成Cloudflare的验证(比如滑块验证),然后打开浏览器的开发者工具(F12)→ 网络面板→ 找到这个API请求→ 复制它的Cookie(比如cf_clearance、__cf_bm这些),然后把Cookie加到你的Java请求里:
.header("Cookie", "cf_clearance=你的浏览器Cookie值; __cf_bm=你的浏览器Cookie值")
注意:这个Cookie和你的IP、User-Agent绑定,有效期很短,只能临时用。
长期解决方案:模拟真实浏览器环境
如果要长期稳定地绕过Cloudflare,Java HttpClient这类纯HTTP客户端肯定不行,得用能真实模拟浏览器行为的工具:
- Selenium/Playwright:这类工具会真实启动Firefox/Chrome浏览器,自动完成Cloudflare的JS验证、滑块验证,然后你可以直接获取请求结果,完全模拟人的操作,Cloudflare很难检测出来。
- 注意:使用这类工具时,要遵守目标网站的服务条款,不要过度请求给网站造成压力。
备注:内容来源于stack exchange,提问作者Hedayat Mahdipour
相关产品推荐
相关产品推荐

