在 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:

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 请求。

    npm install puppeteer axios
    
  2. 获取极验验证码信息:
    使用 Puppeteer 导航到包含极验验证码的页面,提取必要的参数(如 gtchallengecaptchaId),并将其提交给 CapSolver 的 API 以解决。

代码示例

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 等第三方验证码解决方案服务,该服务专门高效地处理复杂的挑战。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/473058.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos7 升级openssl 与升级openssh 安装卸载 telnet-server

前言: 服务器被安全扫描,扫出了漏洞需要修复,根据提示将openssh升级为9.8p1的版本,同时需要升级openssl,但是升级openssh可能会导致ssh连接失败,从而无法继续操作,特别是远程机房尤为危险&#…

PETR/PETRv2/StreamPETR论文阅读

1. PETR PETR网络结构如下,主要包括image-backbone,3D Coordinates Generator,3D Position Encoder,transformer Decoder四个模块。 把N 个视角的图像输入到骨干网络中以提取 2D 多视图特征。在 3D 坐标生成器中,首先…

若点集A=B则A必能恒等变换地变为B=A这一几何常识推翻直线(平面)公理

黄小宁 关键词:“更无理”复数 复平面z各点z的对应点z1的全体是z1面。z面平移变为z1面就使x轴⊂z面沿本身平移变为ux1轴。R可几何化为R轴,R轴可沿本身平移变为R′轴,R′轴可沿本身平移变为R″轴,...。直线公理和平面公理使几百年…

在Node.js中如何使用TypeScript

第一步:创建一个Node.js项目的package.json文件 npm init -y第二步:添加TypeScript、添加node.d.ts npm install typescript -D npm install types/node -D第三步:初始化一个tsconfig.json文件 npx tsc --init --rootDir src --outDir lib…

海康大华宇视视频平台EasyCVR私有化视频平台服务器选购主要参数有哪些?

在构建现代服务器和视频监控系统时,选择合适的硬件配置和关键技术是确保系统性能和稳定性的基础。服务器选购涉及到多个关键参数,这些参数直接影响到服务器的处理能力、数据存储、网络通信等多个方面。 同时,随着视频监控技术的发展&#xf…

async 和 await的使用

一、需求 点击按钮处理重复提交,想要通过disabled的方式实现。 但是点击按钮调用的方法里有ajax、跳转、弹窗等一系列逻辑操作,需要等方法里流程都走完,再把disabled设为false,这样下次点击按钮时就可以继续走方法里的ajax等操作…

【Pikachu】XML外部实体注入实战

若天下不定&#xff0c;吾往&#xff1b;若世道不平&#xff0c;不回&#xff01; 1.XXE漏洞实战 首先写入一个合法的xml文档 <?xml version "1.0"?> <!DOCTYPE gfzq [<!ENTITY gfzq "gfzq"> ]> <name>&gfzq;</name&…

g++与gdb简单学习

本文的内容由智谱清言产生 ------ 使用g编译C程序 使用gdb设置断点&#xff0c;反汇编代码&#xff0c;单步执行 int main() {int a 1;a;return 0; } 1.编译程序&#xff1a;使用 g 编译器将 C 源代码编译成 IA-32 可执行文件。 这可以通过添加 -m32 标志来实现&#xff0…

【小白可懂】微信小程序---课表渲染

结果展示&#xff1a;&#xff08;代码在最后&#xff09; WeChat_20241116174431 项目简介 在数字化校园建设的大背景下&#xff0c;为了更好地服务于在校师生&#xff0c;我们开发了一款基于微信小程序的课表管理系统。该系统采用了现代化的前端技术和优雅的设计风格&#x…

【实验11】卷积神经网络(2)-基于LeNet实现手写体数字识别

&#x1f449;&#x1f3fc;目录&#x1f448;&#x1f3fc; &#x1f352;1. 数据 1.1 准备数据 1.2 数据预处理 &#x1f352;2. 模型构建 2.1 模型测试 2.2 测试网络运算速度 2.3 输出模型参数量 2.4 输出模型计算量 &#x1f352;3. 模型训练 &#x1f352;4.模…

Python酷库之旅-第三方库Pandas(221)

目录 一、用法精讲 1036、pandas.DatetimeIndex.to_pydatetime方法 1036-1、语法 1036-2、参数 1036-3、功能 1036-4、返回值 1036-5、说明 1036-6、用法 1036-6-1、数据准备 1036-6-2、代码示例 1036-6-3、结果输出 1037、pandas.DatetimeIndex.to_series方法 10…

【WPF】Prism学习(三)

Prism Commands 1.复合命令&#xff08;Composite Commanding&#xff09; 这段内容主要介绍了在应用程序中如何使用复合命令&#xff08;Composite Commands&#xff09;来实现多个视图模型&#xff08;ViewModels&#xff09;上的命令。以下是对这段内容的解释&#xff1a; …

【Oracle篇】掌握SQL Tuning Advisor优化工具:从工具使用到SQL优化的全方位指南(第六篇,总共七篇)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…

【一键整合包及教程】AI照片数字人工具EchoMimic技术解析

在数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;正以前所未有的速度改变着我们的生活。EchoMimic&#xff0c;作为蚂蚁集团旗下支付宝推出的开源项目&#xff0c;不仅为数字人技术的发展掀开了新的一页&#xff0c;更为娱乐、教育、虚拟现实、在线会议等多个领域带…

基于Lora通讯加STM32空气质量检测WIFI通讯

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着环境污染问题的日益严重&#xff0c;空气质量的监测与管理已经…

GitLab 降级安装出现 500 错误,如何解决?

本文分享 GitLab 中文版在降级的过程中出现 500 错误的修复方法。 写在前面 强烈不建议大家自行降级&#xff0c;如果真有降级需求&#xff0c;要么自己能力过硬&#xff0c;要么寻求专业服务【https://dl.gitlab.cn/cm33bsfv】&#xff0c;要不出问题很麻烦&#xff01; 问…

2024-11-16 串的存储结构

一、顺序存储。 1.首先定一个静态数组&#xff0c;然后定义i记录串的实际长度。&#xff08;缺点&#xff1a;长度不可变&#xff09; 2.使用malloc申请动态空间&#xff0c;定义指针指向串的地址。&#xff08;需手动ferr&#xff09; 方案一&#xff1a; 数组末尾记录长度 …

PCHMI串口接收实验

插入的唯一一行代码 config1.START((Control)this, System.Reflection.Assembly.GetExecutingAssembly().GetTypes(), null);

代码随想录第46期 单调栈

这道题主要是单调栈的简单应用 class Solution { public:vector<int> dailyTemperatures(vector<int>& T) {vector<int> result(T.size(),0);stack<int> st;st.push(0);for(int i1;i<T.size();i){if(T[i]<T[st.top()]){st.push(i);}else{wh…

Spring 中的 BeanDefinitionParserDelegate 和 NamespaceHandler

一、BeanDefinitionParserDelegate Spring在解析xml文件的时候&#xff0c;在遇到<bean>标签的时候&#xff0c;我们会使用BeanDefinitionParserDelegate对象类解析<bean>标签的内容&#xff0c;包括<bean>标签的多个属性&#xff0c;例如 id name class in…