Puppeteer遇Cloudflare人机验证无限循环,手动及插件均无效求助
Puppeteer有头浏览器无法通过Cloudflare人机验证(循环验证问题)
问题详情
- 不管是手动完成验证还是使用绕过插件,Puppeteer有头浏览器始终无法通过Cloudflare的“我是人类”验证,此前可用的Chrome绕过插件如今陷入验证循环。
- 怀疑原因:之前在普通Chrome(非自动化环境)中安装代理管理器插件后出现过完全相同的问题,清除浏览器数据无效,只有卸载插件才能解决;安装验证码破解插件时也遇到过同类情况。
已尝试的解决方案(均无效)
- 无插件的普通Chrome可正常访问目标网站,但Puppeteer仍存在验证循环问题
- 尝试用Chrome、Chromium、Brave、Opera等不同浏览器启动Puppeteer,结果一致
- 自定义User Agent、请求头,访问目标网站前清除缓存和Cookie,均未解决问题
最小复现代码
const puppeteerExtra = require("puppeteer-extra"); const Stealth = require("puppeteer-extra-plugin-stealth"); puppeteerExtra.use(Stealth()); const appointementURL = "https://fr.mywebsite.com/appointment/ma/maOUD2fr/17831533"; (async () => { const browser = await puppeteerExtra.launch({ headless: false, // 显示浏览器窗口 args: ["--proxy-server=pr.oxylabs.io:7777"], // 添加代理服务器参数 }); const page = await browser.newPage(); // 设置User Agent和请求头 await page.setUserAgent( "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" ); await page.setExtraHTTPHeaders({ "Accept-Language": "en-US,en;q=0.9", }); // 代理身份验证 await page.authenticate({ username: "user", password: "pass", }); await page.goto(appointementURL, { waitUntil: "networkidle2", timeout: 0, // 等待网络空闲 }); // 等待邮箱输入框加载 await page.waitForSelector("#username"); await page.type("#username", "email"); // 替换为你的邮箱 // 等待密码输入框加载 await page.waitForSelector("#password"); await page.type("#password", "password"); // 替换为你的密码 // 点击登录按钮 await page.waitForSelector("#kc-login"); await page.click("#kc-login"); // 可选:等待登录后的导航完成 await page.waitForNavigation({ waitUntil: "networkidle2", timeout: 0 }); await page.screenshot({ path: "appointment.png" }); // await browser.close(); })();
可行解决建议
1. 使用干净的浏览器用户数据目录
Puppeteer默认使用临时目录,但如果残留了旧插件配置或异常缓存,会导致Cloudflare检测异常。手动指定一个全新的空目录:
const browser = await puppeteerExtra.launch({ headless: false, args: ["--proxy-server=pr.oxylabs.io:7777"], userDataDir: "./fresh-chrome-profile" // 新建一个干净目录,确保无残留数据 });
2. 优化代理与指纹一致性
- 确保代理地区与
Accept-Language、User Agent的地区匹配(比如你用en-US,优先选美国地区的代理) - 改用独享代理,避免共享代理因被大量滥用而被Cloudflare标记
3. 升级并调整stealth插件
- 升级到最新版本的插件,修复已知的检测漏洞:
npm update puppeteer-extra puppeteer-extra-plugin-stealth - 可配合
puppeteer-extra-plugin-adblocker屏蔽广告和追踪脚本,减少不必要的请求干扰验证流程
4. 模拟真实用户交互节奏
代码操作速度过快会被判定为机器人,在输入、点击之间增加随机延迟:
// 输入邮箱前随机延迟500-1500ms await page.waitForTimeout(Math.random() * 1000 + 500); // 模拟真实打字速度(每个字符延迟20-70ms) await page.type("#username", "email", { delay: Math.random() * 50 + 20 }); // 输入密码同理 await page.waitForTimeout(Math.random() * 1000 + 500); await page.type("#password", "password", { delay: Math.random() * 50 + 20 }); // 点击登录前随机延迟300-1100ms await page.waitForTimeout(Math.random() * 800 + 300); await page.click("#kc-login");
5. 隐藏自动化特征
- 添加
--disable-blink-features=AutomationControlled参数,进一步隐藏自动化标识:args: [ "--proxy-server=pr.oxylabs.io:7777", "--disable-blink-features=AutomationControlled" ] - 避免在页面加载前调用
page.authenticate,部分代理提供商建议通过代理管理器配置认证,或在请求头中传递认证信息,减少异常触发点
内容的提问来源于stack exchange,提问作者HeDoesAutomation
相关产品推荐
相关产品推荐

