通过Puppeteer处理复选框:实现Cloudflare人机验证复选框点击
用Puppeteer点击Cloudflare「稍等片刻」页面的人机验证复选框
Cloudflare的人机验证复选框通常位于#challenge-form表单内,你提供的原代码中使用的#select-all-checkbox选择器并不匹配实际的验证元素,以下是修正后的实现方案:
核心注意点
- Cloudflare会针对无头浏览器做检测,建议设置真实的用户代理来降低被识别的概率
- 必须等待验证元素完全加载后再执行点击操作,避免因元素未就绪导致报错
- 若验证元素嵌入在iframe中,需要先切换到对应的iframe再进行操作
修正后的代码
const puppeteer = require('puppeteer'); const fs = require('fs'); (async () => { // 启动浏览器,配置接近真实浏览器的环境 const browser = await puppeteer.launch({ args: ['--no-sandbox'], headless: 'new', // 新版无头模式更难被检测 defaultViewport: null // 使用默认视口,模拟真实窗口尺寸 }); const page = await browser.newPage(); // 设置真实用户代理,规避Cloudflare的无头浏览器检测 await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'); const url = process.argv[2]; await page.goto(url, { waitUntil: 'networkidle2' }); // 等待网络空闲,确保验证页面加载完成 try { // 等待Cloudflare验证复选框加载,使用标准选择器定位 const checkbox = await page.waitForSelector('#challenge-form input[type="checkbox"]', { timeout: 10000 }); await checkbox.click(); // 等待验证完成,处理页面跳转或当前页面验证完成的情况 await page.waitForNavigation({ waitUntil: 'networkidle2', timeout: 30000 }).catch(() => { console.log('验证完成,未触发页面跳转'); }); // 保存验证后的页面内容 const pageContent = await page.content(); fs.writeFileSync('wpresponse.txt', pageContent); } catch (error) { console.error('处理Cloudflare验证时出错:', error); } finally { await browser.close(); } })();
代码说明
- 浏览器配置:启用新版无头模式、设置真实用户代理,尽可能模拟真实浏览器环境,减少被Cloudflare拦截的概率
- 页面加载策略:使用
networkidle2等待网络空闲,确保Cloudflare的验证页面完全渲染完成 - 验证元素定位:
#challenge-form input[type="checkbox"]是Cloudflare人机验证页面的标准元素选择器,能精准定位到复选框 - 验证等待逻辑:点击复选框后等待页面跳转,若没有跳转则视为验证在当前页面完成,继续后续操作
- 错误处理:通过try-catch块捕获超时、元素未找到等异常,避免程序直接崩溃
内容的提问来源于stack exchange,提问作者Dhruv Vyas
相关产品推荐
相关产品推荐

