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

Puppeteer本地运行忽略代理报1020错误但服务器运行正常?

macOS Monterey 环境 Puppeteer 触发 1020 错误的原因及解决方案

1020 属于 Cloudflare 主动拦截返回的状态码,核心触发逻辑是客户端请求的特征被判定为非人类访问,该问题和 macOS 升级到 Monterey 后系统环境的特征变化直接相关,具体原因及对应解决方法如下:

核心原因

  • TLS 指纹差异
    Monterey 升级了系统原生的 TLS 协议栈,Puppeteer 捆绑的 Chromium 会优先调用系统 TLS 库完成握手,生成的 JA3 指纹和 Big Sur、Ubuntu 环境下的指纹存在明显差异,被 Cloudflare 规则识别为异常请求。
  • 系统权限限制
    Monterey 新增了严格的应用网络权限管控,Puppeteer 启动的 Chromium 若未被授予完整网络访问权限,会导致请求头、握手报文出现异常特征,触发拦截。
  • 客户端指纹差异
    升级系统后内置字体库、显卡驱动版本发生变化,Puppeteer 运行时生成的 Canvas、WebGL 指纹和之前的环境存在差异,刚好命中 Cloudflare 的拦截规则。
  • 代理配置未生效
    本地浏览器配置的代理默认不会同步到 Puppeteer 启动的 Chromium 实例,若未在启动参数中显式配置代理,请求会直接从本地IP发起,和你手动访问的链路特征不一致。

解决方案

  • 启用自动化特征隐藏插件
    安装 puppeteer-extra 和 puppeteer-extra-plugin-stealth 插件,隐藏 Puppeteer 的自动化标记,代码示例:
const puppeteer = require('puppeteer-extra')
const StealthPlugin = require('puppeteer-extra-plugin-stealth')
puppeteer.use(StealthPlugin())
  • 显式配置代理参数
    启动时添加代理配置,确保 Puppeteer 的请求链路和你手动访问浏览器的链路一致:
const browser = await puppeteer.launch({
  args: ['--proxy-server=socks5://127.0.0.1:你的代理端口']
})
// 若代理需要认证,额外添加认证逻辑
const page = await browser.newPage()
await page.authenticate({
  username: '代理用户名',
  password: '代理密码'
})
  • 调用本地安装的正式版 Chrome
    放弃使用 Puppeteer 捆绑的 Chromium,指定本地安装的 Chrome 正式版作为运行内核,其指纹和你手动访问的浏览器完全一致:
const browser = await puppeteer.launch({
  executablePath: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
  args: ['--disable-blink-features=AutomationControlled']
})
  • 检查系统权限配置
    进入「系统设置」-「隐私与安全性」,给运行代码的终端、Chromium/Chrome 开放完整网络访问权限,临时关闭系统防火墙测试是否缓解拦截。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:54:02