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
相关产品推荐
相关产品推荐

