在 Node.js 中解决极验验证码:使用 Puppeteer 自动化

近年来,极验验证码在区分真实用户和自动化系统方面越来越先进,使其成为网页抓取和自动化的重大障碍。如果您正在使用 Node.js 并致力于在自动化流程中解决极验验证码,那么使用 Puppeteer 是一种有效的方法。Puppeteer 提供了一个高级 API 来控制无头 Chrome 或 Chromium 浏览器,使其成为处理复杂验证码的理想选择。

本文将指导您使用 Node.js 和 Puppeteer 自动化极验验证码,包括代码示例和最佳实践,以提高成功率。

什么是极验?

极验是一种高级验证码解决方案,通过复杂的挑战区分人类用户和自动化机器人来保护网站。它以其滑动验证码而闻名,用户需要将拼图块或滑块拖动到特定位置。这种类型的验证码提供了一种交互式和直观的方式来验证真实用户行为。

难以克服重复的失败,完全解决恼人的验证码?

发现CapSolver AI 驱动的自动网页解封技术的无缝自动验证码解决方案!

索取 ++优惠码++ 享受顶级验证码解决方案:CapSolver: WEBS。兑换后,每次充值可获得额外 5% 奖励,无限次

极验滑动验证码的关键特性

滑动验证码比传统的基于文本的验证码更加复杂,并包括以下关键组件:

  1. 拖放拼图: 用户必须将拼图块滑到适当的位置,通常是通过将其拖动以匹配图像的缺失部分。此任务需要鼠标移动,对于机器人来说很难准确地模拟。

  2. 类人行为检测: 极验分析各种因素,如拖动的速度和路径、暂停,甚至用户做出的微调。这些细微的指标帮助极验区分真实用户和机器人。

  3. 自适应安全: 极验会根据检测到的行为模式动态调整其难度。例如,如果用户以不自然的精确度在一条直线上完美地执行滑动,则验证码可能会提示额外的验证。

  4. 行为数据分析: 除了解决拼图之外,极验还会收集有关鼠标移动、点击和交互时间的数据,从而增强其检测机器人的能力。这意味着除非交互非常类似于真实用户的动作,否则验证码很难通过。

滑动验证码的适应性和行为分析使其在自动化任务中成为一项艰巨的挑战,通常需要复杂的解决方案来模拟其所需的人类交互。这就是像Puppeteer 这样的自动化工具特别有用的地方,因为它们允许精确地控制鼠标和拖动操作,帮助机器人以更真实的方式与极验验证码交互。

为什么使用 Puppeteer?

Puppeteer 是一个 Node.js 库,允许开发人员控制无头 Chrome 或 Chromium 浏览器。对于验证码处理,它能够:

  1. 精确的鼠标移动模拟: Puppeteer 允许您定义精确的鼠标移动,可以调整以模拟人类交互。
  2. 视觉反馈: 您可以捕获屏幕截图并获得视觉数据以确认交互。
  3. 易于使用的 API: Puppeteer 拥有一个直观的 API,使其成为自动化的热门选择。

这些功能使 Puppeteer 成为处理和解决极验验证码的出色工具。

开始使用 Puppeteer 和 Node.js

首先,确保已安装 Node.js。然后,创建一个新的项目目录并使用 npm 安装 Puppeteer:

bash 复制代码
mkdir geetest-solver
cd geetest-solver
npm init -y
npm install puppeteer

此设置将创建一个新的 Node.js 项目并安装 Puppeteer。

要将 CapSolverPuppeteer 集成以解决极验验证码,我们可以修改您的原始代码以使用 Puppeteer 与页面交互并提取必要的价值观以提交给 CapSolver。以下是如何将 CapSolver 与 Puppeteer 结合使用的更新方法,而不是使用 Axios:

分步指南:使用 CapSolver 和 Puppeteer 解决极验验证码

  1. 安装依赖项 :

    首先,您需要安装 Puppeteer 和 Axios,用于向 CapSolver 发送 API 请求。

    bash 复制代码
    npm install puppeteer axios
  2. 获取极验验证码信息 :

    使用 Puppeteer 导航到包含极验验证码的页面,提取必要的参数(如 gtchallengecaptchaId),并将其提交给 CapSolver 的 API 以解决。

代码示例

javascript 复制代码
const puppeteer = require('puppeteer');
const axios = require('axios');

// 替换为您的实际 API 密钥
const api_key = "YOUR_API_KEY";

// CapSolver API 端点
const createTaskUrl = "https://api.capsolver.com/createTask";
const getResultUrl = "https://api.capsolver.com/getTaskResult";

// 第一步:启动 Puppeteer 与极验验证码交互
async function solveGeetestCaptcha() {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();

  // 第二步:导航到包含验证码的页面
  await page.goto('https://yourwebsite.com/'); // 替换为实际 URL

  // 第三步:获取所需的极验验证码参数(gt、challenge 和 captchaId)
  const captchaParams = await page.evaluate(() => {
    // 从页面中提取极验参数
    const gt = document.querySelector('#gt').value; // 极验 GT 参数
    const challenge = document.querySelector('#challenge').value; // 极验 Challenge 参数
    const captchaId = document.querySelector('#captchaId').value; // 极验 CaptchaId 参数

    return { gt, challenge, captchaId };
  });

  // 提取后关闭浏览器
  await browser.close();

  // 第四步:将验证码数据提交给 CapSolver 以解决
  const payload = {
    clientKey: api_key,
    task: {
      type: 'GeeTestTaskProxyLess',
      websiteURL: 'https://yourwebsite.com/',
      gt: captchaParams.gt,
      challenge: captchaParams.challenge,
      captchaId: captchaParams.captchaId,
    }
  };

  // 第五步:向 CapSolver 发送请求以创建任务
  try {
    const res = await axios.post(createTaskUrl, payload);
    const taskId = res.data.taskId;

    if (!taskId) {
      console.log('创建任务失败:', res.data);
      return;
    }

    console.log('获取 taskId:', taskId);

    // 第六步:轮询 CapSolver 以获取结果
    while (true) {
      await new Promise(resolve => setTimeout(resolve, 1000)); // 延迟 1 秒

      const getResultPayload = { clientKey: api_key, taskId };
      const resultResponse = await axios.post(getResultUrl, getResultPayload);

      const status = resultResponse.data.status;

      if (status === 'ready') {
        console.log('极验已解决:', resultResponse.data.solution);
        return resultResponse.data.solution;
      }

      if (status === 'failed' || resultResponse.data.errorId) {
        console.log('解决失败!响应:', resultResponse.data);
        return;
      }
    }
  } catch (error) {
    console.error('错误:', error);
  }
}

// 运行函数以解决极验验证码
solveGeetestCaptcha().then(solution => {
  console.log(solution);
});

代码说明:

  1. 启动 Puppeteer:

    • 我们首先启动 Puppeteer 并打开包含极验验证码的页面。
    • 进入页面后,我们从隐藏的表单字段或 JavaScript 变量中提取 gtchallengecaptchaId 值(基于页面的结构)。
  2. 提交给 CapSolver:

    • 提取完所需的值后,我们将向 CapSolver API😃 发送请求,使用 GeeTestTaskProxyLess 类型创建任务。
    • API 请求包含 gtchallengecaptchaId 参数,这些参数对于解决极验验证码至关重要。
  3. 轮询结果:

    • 任务创建后,我们会不断轮询 CapSolver,查看解决方案是否已准备就绪。如果状态为 "ready",我们将检索解决方案(验证码响应)。
    • 如果任务失败或遇到错误,函数会通过记录失败来处理。

CapSolver API 集成:

  • createTask : 我们将验证码参数 (gtchallengecaptchaId) 提交给 CapSolver 以创建任务。
  • getTaskResult : 我们不断轮询,直到任务完成(状态为 "ready"),并且我们收到解决方案。

结论

使用 Puppeteer 解决极验验证码需要一种对人类交互的现实方法。虽然本指南提供了一种基本方法,但您可能需要根据具体的极验实现调整策略。对于更具挑战性的验证码,请考虑使用 CapSolver 等第三方验证码解决方案服务,该服务专门高效地处理复杂的挑战。

相关推荐
二哈喇子!30 分钟前
openFuyao 容器平台快速入门:Nginx 应用部署全流程实操
运维·nginx·openfuyao
齐鲁大虾36 分钟前
国产 Linux 系统核心优缺点与适用场景
linux·运维·服务器
雨大王5121 小时前
工业生产执行系统(MES)在汽车制造行业的应用案例
运维·人工智能
Awkwardx1 小时前
Linux网络编程—数据链路层
linux·运维·网络
hxmmm1 小时前
自定义封装 vue多页项目新增项目脚手架
前端·javascript·node.js
濮水大叔1 小时前
VonaJS是如何做到文件级别精确HMR(热更新)的?
typescript·node.js·nestjs
树下水月2 小时前
docker 启动后 如何通过对应的进程 找docker-compose.yaml 编排文件
运维·docker·容器
凯子坚持 c2 小时前
Docker 网络管理深度解析与实践指南
运维·docker·容器
liwenzhen20052 小时前
Linux OOM 问题之 DMSERVER 受害者
linux·运维·oom
我送炭你添花2 小时前
Pelco KBD300A 模拟器:05+1.本项目中的链式调用类设计详解
python·自动化·运维开发