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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:40:16