爬虫逆向实战小记——解决captcha滑动验证码
注意!!!!某XX网站实例仅作为学习案例,禁止其他个人以及团体做谋利用途!!!
IGh0dHBzOi8vY2FwdGNoYS5ydWlqaWUuY29tLmNuLw==
第一步: 分析请求网址和响应内容

(1)通过观察,滑块滑动到指定位置即认为验证成功

(2)验证码请求网址和参数。ts 是毫秒级时间戳,clientUid和captchaType固定

(3)请求验证码的响应内容,可以看到有2张图片编码形式的字段originalImageBase64和jigsawImageBase64(一张原始图,一张滑块图), secretKey和token

(4)滑动滑块后无论是否成功,会存在一个check验证码 的网址和参数。可以看出pointJson 是加密的,token对应get验证码请求的响应内容(如果不太懂,自己请求一下即可明白)

(5) check验证码响应内容如上图所示即为成功,否则均为失败
第二步:解决参数加密(逆向)

(1) 在XHR处添加 /captcha/check, 重新请求,可以看到会在 标蓝 处停住,通过堆栈查看,能够看到在end处,为pointJson的加密生成。

(2) 去掉XHR的勾选,在(1)中找到的end中,var r 打断点,重新请求。此处猜测r 为滑块的位移值(r 比真实位移值大需要将真实位置+一个数值区间, 可将浏览器请求的图片放在本地进行对比,在此不在赘述),同时pointJson 生成调用了a 并传入了转为JSON字符串的{x,y}坐标

(3)a 函数可以看出是AES加密ECB模式PKcs7。参数t 是 secretKey(这个可以再实战操作时验证)
第三步: 验证滑块是否成功


浏览器上check 验证码响应成功展示
第四步: 部分代码展示
JS 加密部分
// 加密部分
CryptoJS = require('crypto-js')
function H(e, t) {var i = CryptoJS.enc.Utf8.parse(t), n = CryptoJS.enc.Utf8.parse(e), r = CryptoJS.AES.encrypt(n, i, {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});return r.toString()
}
python 请求部分
# -*- coding:utf-8 -*-
# @Time : 2025/2/18 14:31
# @Author: 水兵没月
# @File : captcha_滑块验证码.py
# @Software: PyCharm
import base64
import random
import timeimport execjs
import requests
from fake_useragent import UserAgentfrom shuibingmeiyue import req_payload # 可以写成requests.post(url, body=json.dumps(data), headers=headers)s = requests.Session()
headers = {"Accept": "application/json, text/plain, */*","Accept-Encoding": "gzip, deflate, br, zstd","Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6","Cache-Control": "no-cache","Connection": "keep-alive","Content-Length": "106","Content-Type": "application/json; charset=UTF-8","Host": "captcha.ruijie.com.cn","Origin": "https://captcha.ruijie.com.cn","Pragma": "no-cache","Referer": "https://captcha.ruijie.com.cn/","User-Agent": UserAgent().Chrome,
}
# 此处忽略一些非重点代码
# 此处忽略一些非重点代码
# 此处忽略一些非重点代码
def get_slide(target_bytes, background_bytes):'''获取滑块位移值'''import ddddocr# 关闭广告显示ocr = ddddocr.DdddOcr(show_ad=False, det=False, ocr=False, )res = ocr.slide_match(target_bytes, background_bytes, simple_target=True)print(res)target_json = float(res["target"][0] + float('{}'.format(random.choice([15.5, 16.5]))))# target_json = res["target"][0]return target_json
def get_AES():'''获取AES的JS源码'''with open('./captche_AES.js', 'r', encoding="utf-8")as f:AES_source = f.read()f.close()return AES_sourcedef get_image_Base64(img_json):'''获取图片编码以及其他参数'''img_repData = img_json.get("repData")secretKey = img_repData.get("secretKey")originalImageBase64 = img_repData.get("originalImageBase64")jigsawImageBase64 = img_repData.get("jigsawImageBase64")token = img_repData.get("token")# origin_Base64和jigsaw_Base64 已被忽略。作用保存图片origin_Base64(originalImageBase64)jigsaw_Base64(jigsawImageBase64)# 读取滑块图片和背景图片的二进制数据# read_origin和read_jigsaw 已被忽略。 作用读取图片 target_bytes = read_origin()background_bytes = read_jigsaw()# 得到滑块位移target_json = get_slide(target_bytes, background_bytes)return secretKey, target_json, tokendef get_pic():'''请求验证码网址'''url = "https://captcha.ruijie.com.cn/captcha/get"data = {"captchaType":"blockPuzzle","clientUid":"slider-9d5611b7-e5a0-40a2-a813-a18ecf0ccaf9","ts":int(time.time()*1000)}res = req_payload(s, url, headers, data)res_json = res.json()secretKey, target_json, token = get_image_Base64(res_json)return secretKey, target_json, tokendef check_captcha(secretKey, target_json, token):'''检测验证码是否成功'''print(target_json)i = int(target_json)i = 310 * i / int(330)e = '{"x":' + str(i) + ',"y":5}'AES_source = get_AES()AES_ctx = execjs.compile(AES_source)get_AES = AES_ctx.call("H", e, secretKey)print('get_AES--', get_AES, len(get_AES))#url = "https://captcha.ruijie.com.cn/captcha/check"pointJson = get_AESdata = {"captchaType":"blockPuzzle","pointJson":pointJson,"token":token}print(data)res = req_payload(s, url, headers, data)print(res.text)secretKey, target_json, token = get_pic()
check_captcha(secretKey, target_json, token)

仅作为笔记记录,如有问题请各位大佬来指导
相关文章:
爬虫逆向实战小记——解决captcha滑动验证码
注意!!!!某XX网站实例仅作为学习案例,禁止其他个人以及团体做谋利用途!!! IGh0dHBzOi8vY2FwdGNoYS5ydWlqaWUuY29tLmNuLw 第一步: 分析请求网址和响应内容 (1)通过观察,滑…...
Spring Boot3+Vue3极速整合: 10分钟搭建DeepSeek AI对话系统(进阶)
Spring Boot3Vue3极速整合: 10分钟搭建DeepSeek AI对话系统(进阶) 前言 在上次实战指南《Spring Boot3Vue2极速整合: 10分钟搭建DeepSeek AI对话系统》引发读者热议后,我通过200真实用户反馈锁定了几个问题进行优化进阶处理: 每次对话都需重复上下文背…...
Python 图像处理之 Pillow 库:玩转图片
哈喽,大家好,我是木头左! Pillow 库作为 Python 图像处理的重要工具之一,为提供了便捷且功能丰富的接口,让能够轻松地对图像进行各种操作,从简单的裁剪、旋转到复杂的滤镜应用、图像合成等,几乎无所不能。接下来,就让一起深入探索如何使用 Pillow 库来处理图片,开启一…...
Node.js学习分享(上)
Node.js fs文件系统模块fs.readFile()fs.writeFile() path路径模块路径拼接path.join()获取路径中的文件名path.basename()的语法格式 获取路径中的文件扩展名path.extname()的语法格式 http模块服务器相关概念IP地址域名和域名服务器端口号 创建最基本的web服务器创建web服务器…...
Java 第十一章 GUI编程(2)
目录 GUI 事件处理 基本思路 添加事件监听器 对话框 实例 GUI 事件处理 对于采用了图形用户界面的程序来说,事件控制是非常重要的;到目前为止, 我们编写的图形用户界面程序都仅仅只是完成了界面,而没有任何实际的功能&…...
anaconda 安装geemap配置详细教程
本章教程,主要介绍如何通过anaconda 安装ee 和geemap模块 一、示例代码 创建一个测试文件:geemapTets.ipynb # 导入 Google Earth Engine (GEE) 库,用于处理地理空间数据 import ee # 导入 geemap 库,用于可视化和交互式处理 GEE 数据 import geemap # 创建一个 geemap.M…...
4G工业路由器在公交充电桩中的应用与优势
随着电动公交车的普及,公交充电桩的稳定运行和高效管理是交通营运部门最关心的问题。4G工业路由器凭借其卓越的数据采集和通讯能力,成为实现充电桩智能化管理的关键。 公交充电桩运维管理需求概述: 1.实时性:实时监控充电状态、剩…...
【设计模式】单例模式|饿汉模式|懒汉模式|指令重排序
目录 1.什么是单例模式? 2.如何保证单例? 3.两种写法 (1)饿汉模式(早创建) (2)懒汉模式(缓执行,可能不执行) 4.应用场景 🔥5.多…...
Microsoft.Office.Interop.Excel 的简单操作
Microsoft.Office.Interop.Excel 的简单操作 1、安装 Microsoft.Office.Interop.Excel2、声明引用 Microsoft.Office.Interop.Excel3、简单的新建 EXCEL 操作代码4、将 DataGridView 表数据写到 EXCEL 操作代码5、将 EXCEL 表数据读取到 C# 数据表 DataTable 操作代码 1、安装 …...
说一下redis事务底层原理
Redis事务 1. 事务的基本流程 Redis 事务通过 MULTI、EXEC、WATCH 等命令实现,底层原理可以分为以下几个步骤: (1) MULTI 命令 当客户端发送 MULTI 命令时,Redis 会将客户端标记为“事务模式”。在事务模式下,客户端发送的所有…...
【powerjob】 powerjobserver注册服务IP错误
1、问题:powerjobserver 4.3.6 的服务器上有多个网卡对应多个ip,示例 eth0 :IP1 ,docker0:IP2 和worker 进行通信时 正确的应该时IP1 但是注册显示获取的确实IP2,导致 worker 通过ip2和server通信,网络不通,注册不上 2、解决方案 …...
01. HarmonyOS应用开发实践与技术解析
文章目录 前言项目概述HarmonyOS应用架构项目结构Ability生命周期 ArkTS语言特性装饰器状态管理 UI组件与布局基础组件响应式布局样式与主题 页面路由与参数传递页面跳转参数接收 数据绑定与循环渲染数据接口定义循环渲染 条件渲染组件生命周期最佳实践与性能优化组件复用响应式…...
【NLP 30、文本匹配任务 —— 传统机器学习算法】
目录 一、文本匹配任务的定义 1.狭义解释 2.广义解释 二、文本匹配的应用 1.问答对话 2.信息检索 3.文本匹配任务应用 三、智能问答 1.智能问答的基本思路 依照基础资源划分: 依照答案产出方式划分 依照NLP相关技术划分 四、智能问答的价值 1.智能客服 2.Faq知识库问…...
爬虫Incapsula reese84加密案例:Etihad航空
声明: 该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关 一、找出需要加密的参数 1.js运行 atob(‘aHR0cHM6Ly93d3cuZXRpaGFkLmNvbS96aC1jbi8=’) 拿到网址,F12打开调试工具,随便搜索航班,切换到network搜索一个时间点可以找…...
【Vue教程】使用Vite快速搭建前端工程化项目 Vue3 Vite Node.js
??大家好!我是毛毛张! ??个人首页: ??今天毛毛张分享的是关于如何快速??♂搭建一个前端工程化的项目的环境搭建以及流程?? 文章目录 1.前端工程化环境搭建?? 1.1 什么是前端工程化1.2 nodejs的简介和安装 1.2.1 什么是Nodejs1.2.2 如何安装…...
如何将飞书多维表格与DeepSeek R1结合使用:效率提升的完美搭档
将飞书的多维表格与DeepSeek R1结合使用,就像为你的数据管理和分析之旅装上一台涡轮增压器。两者的合作,不仅仅在速度上让人耳目一新,更是将智能化分析带入了日常的工作场景。以下是它们如何相辅相成并改变我们工作方式的一些分享。 --- 在…...
算数操作符、赋值操作符、单目操作符、强制类型转换
一、算术操作符(、 -、 *、 /、 %) • - * / %操作符都是双⽬操作符,有**两个操作数**的符号就叫做双目操作符 10 4| || | 操作数1 操作数2// - % / * 以此类推•操作符也被叫做:运算符 1. 符号、符号 - 和 符号* •…...
为AI聊天工具添加一个知识系统 之133 详细设计之74通用编程语言 之4 架构及其核心
本篇继续讨论 通用编程语言。 说明:本阶段的所有讨论都是围绕这一主题展开的,但前面的讨论分成了三个大部分(后面列出了这一段的讨论题目的归属关系)-区别distinguish(各别): 文化和习俗。知识…...
RNN实现精神分裂症患者诊断(pytorch)
RNN理论知识 RNN(Recurrent Neural Network,循环神经网络) 是一种 专门用于处理序列数据(如时间序列、文本、语音、视频等)的神经网络。与普通的前馈神经网络(如 MLP、CNN)不同,RNN…...
私有云基础架构
基础配置 使用 VMWare Workstation 创建三台 2 CPU、8G内存、100 GB硬盘 的虚拟机 主机 IP 安装服务 web01 192.168.184.110 Apache、PHP database 192.168.184.111 MariaDB web02 192.168.184.112 Apache、PHP 由于 openEuler 22.09 系统已经停止维护了ÿ…...
rust学习笔记11-集合349. 两个数组的交集
rust除了结构体,还有集合类型,同样也很重要,常见的有数组(Array)、向量(Vector)、哈希表(HashMap) 和 集合(HashSet)字符串等,好意外呀…...
全栈(Java+vue)实习面试题(含答案)
在广州一个小公司(BOSS标注是0-20人,薪资2-3k),直接面试没有笔试,一开始就直接拿着简历问,也没有自我介绍,问题是结合场景题和八股文、基础。废话不多说,直接分享面试题目个大家做参考。 1、能…...
SQL经典常用查询语句
1. 基础查询语句 1.1 查询表中所有数据 在SQL中,查询表中所有数据是最基本的操作之一。通过使用SELECT * FROM table_name;语句,可以获取指定表中的所有记录和列。例如,假设有一个名为employees的表,包含员工的基本信息…...
超详细:数据库的基本架构
MySQL基础架构 下面这个图是我给出的一个MySQL基础架构图,可以清楚的了解到SQL语句在MySQL的各个模块进行执行过程。 然后MySQL可以分为两个部分,一个是server层,另一个是存储引擎。 server层 Server层涵盖了MySQL的大多数核心服务功能&am…...
AI催化新一轮创业潮与创富潮:深圳在抢跑
作者:尺度商业大掌柜黄利明 2025年春节伊始至今,从DeepSeek R1开源模型持续引发全球围观,到腾讯混元Turbo S模型发布秀出了"秒回"绝活,再到国务院发布《新一代人工智能发展规划(2025-2030)》重磅…...
Docker 深度解析:适合零基础用户的详解
此博客涵盖 Docker 的基本概念和作用、架构和核心组件、与传统虚拟机的对比、安装与基本操作,以及在实际开发和运维中的应用场景。 首先,详细解释了 Docker 的基本概念,包括它的诞生背景、作用及其如何解决传统应用部署中的问题。然后&#…...
SpringBoot生成唯一ID的方式
1.为什么要生成唯一ID? 数据唯一性:每个记录都需要有一个独一无二的标识符来确保数据的唯一性。这可以避免重复的数据行,并有助于准确地查询、更新或删除特定的记录。 数据完整性:通过使用唯一ID,可以保证数据库中的数…...
FastGPT 源码:RRF、Rerank 相关代码
文章目录 FastGPT 源码:RRF、Rerank 相关代码1. RRF (Reciprocal Rank Fusion) 合并实现2. Rerank 二次排序实现3. 重排序的主要特点4. 整个搜索流程5. 这种方式的优势 FastGPT 源码:RRF、Rerank 相关代码 下边介绍 RRF 合并和 Rerank 二次排序的相关实…...
Android视频流畅播放要素
要让 Android 设备流畅播放视频,需根据设备性能(低端、中端、高端)和播放场景(本地播放、在线流媒体)动态调整视频参数。以下是针对不同设备的推荐配置方案: 一、通用推荐配置(平衡兼容性与流畅…...
Python:类型转换和深浅拷贝,可变与不可变对象
int():转换为一个整数,只能转换由纯数字组成的字符串 浮点型强转整型会去掉小数点及后面的数,只保留整数部分 #如果字符串中有数字和正负号以外的字符就会报错 float():整形转换为浮点型会自动添加一位小数 .0 如果字符串中有…...
