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

JavaScript使用fetch请求数据时遭遇Cloudflare拦截如何解决?

Cloudflare拦截fetch请求的解决方法

问题根源

原生fetch默认发起的请求缺少真实浏览器的访问特征,且未携带合法会话Cookie时,会被Cloudflare的防护规则识别为爬虫流量,返回人机验证拦截页;同时当前代码存在逻辑缺陷:当接口返回HTML格式的拦截页时,直接调用response.json()会触发JSON解析错误,无法正常拿到返回内容排查问题。

调整步骤

  • 第一步:补全请求配置,模拟真实浏览器的请求特征,同时修正响应解析逻辑,避免解析报错
const response = await fetch(url, {
  headers: {
    'Accept': 'application/json, text/plain, */*',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36',
    'Referer': new URL(url).origin,
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-origin'
  },
  credentials: 'include'
})

const contentType = response.headers.get('content-type')
if (!response.ok) throw new Error(`请求失败,状态码:${response.status}`)

if (contentType?.includes('application/json')) {
  const targetData = await response.json()
  // 此处处理正常返回的目标数据
} else {
  const interceptContent = await response.text()
  console.error('被Cloudflare拦截,返回内容:', interceptContent)
}
  • 第二步:如果补全请求头后依然返回拦截页,说明目标站点开启了强制人机校验(5秒盾、Turnstile验证等),这类校验会验证浏览器的JS执行环境、TLS指纹、WebAPI特征,纯服务端runtime的原生fetch无法伪造这些特征,可选择两种合规方案处理:
    • 优先对接目标站点官方提供的开放API获取数据,官方公开接口通常不会配置Cloudflare爬虫拦截规则
    • 确需调用前端接口时,使用无头浏览器工具模拟真实用户访问,在浏览器环境内完成Cloudflare校验拿到有效会话Cookie后,再携带合法Cookie发起数据请求

注意:禁止使用破解验证、恶意伪造特征的手段访问未授权的站点资源,这类行为违反目标站点服务条款,可能存在合规风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:48:18