当前位置: 首页 > news >正文

过某开源滑动验证码

过某开源滑动验证码

今天早上我有一点空闲时间,想着回顾一下前几天在某查询网站遇到的滑动验证码,以免时间久了忘记了。那个网站可能使用的是较早版本的开源滑块验证码系统tianai-captcha,但我不确定是否正确。
在这里插入图片描述

整体思路:

获取背景大图和模板小图,用ddddocr识别缺口位置,模拟人滑动,从通过了验证的载荷来看,主要是模拟形成这个trackList

在这里插入图片描述

基本步骤:

1、获取背景图与模板小图,这个容易,试着滑动一下,从图中接口可以得到backgroundImagetemplateImage

在这里插入图片描述

将获取的图片base64解码保存到本地,保存图片时要注意“固定尺寸”与“渲染大小”之间的关系。

# 将base64编码的图转换为图片def decode_base64_to_image(base64_string, output_filename, target_size=None):# 分割base64字符串,去掉前缀(如果有的话)base64_data = base64_string.split(',')[1] if ',' in base64_string else base64_string# 解码base64字符串image_data = base64.b64decode(base64_data)# 使用BytesIO将字节数据转为图像image = Image.open(BytesIO(image_data))# 如果指定了尺寸,调整图像大小if target_size:image = image.resize(target_size, Image.LANCZOS)# 保存图像到本地文件image.save(output_filename)def get_image_id():url = "http://xxx.xxx.xxx/x_xxxx/gen"params = {"type": "SLIDER"}data = '^^{^}^'.encode('unicode_escape')response = session.post(url, headers=headers, cookies=cookies, params=params, data=data, verify=False)json_data = json.loads(response.text)backgroundImage = json_data['captcha']['backgroundImage'].split(',')[1]templateImage = json_data['captcha']['templateImage'].split(',')[1]# # 保存图片到本地文件decode_base64_to_image(backgroundImage, "backgroundImage.jpg", (300, 180)) #注意这里的尺寸是原图的 1/2decode_base64_to_image(templateImage, "templateImage.png", (55, 180))return json_data['id']
2、用ddddocr识别缺口位置
# 识别偏移量
def get_slider_offset_ddddocr(target, background):det = ddddocr.DdddOcr(det=False, ocr=False, show_ad=False)with open(target, 'rb') as f:target_bytes = f.read()with open(background, 'rb') as f:background_bytes = f.read()res = det.slide_match(target_bytes, background_bytes)return res
3、得到缺口位置后,模拟滑动(此乃核心部分),程序中随机数区间可以自行调整,以便获得更高的通过率。
def generate_trajectory(x):trajectory = []current_x = 0current_y = 0current_time = random.randint(824, 3065)# start with 'down' eventtrajectory.append({"x": current_x, "y": current_y, "type": "down", "t": current_time})# add 'move' eventswhile current_x < x:current_time += random.randint(10, 30)move_x = random.randint(1, int(max(1, (x - current_x) / 20)))  # adjust move speed based on distance leftmove_y = random.randint(-2, 2)  # random minor variance in ycurrent_x += move_xcurrent_y = move_y# ensure current_x does not exceed target xif current_x > x:current_x = xtrajectory.append({"x": current_x, "y": current_y, "type": "move", "t": current_time})# end with 'up' eventcurrent_time += random.randint(100, 1000)  # randomly determine time taken to lift fingertrajectory.append({"x": current_x, "y": current_y, "type": "up", "t": current_time})return trajectory
4、组装数据提交,我就按照载荷数据的形式组装的,没有去校验各个参数能否更简单。

在这里插入图片描述

def generate_data(trajectory, id):import datetime# 当前时间为滑动开始时间start_time = datetime.datetime.now()# 将轨迹时间转换为合适的时间戳,并取毫秒部分updated_trajectory = []for event in trajectory:# 计算事件时间event_time = start_time + datetime.timedelta(milliseconds=event['t'])# 获取毫秒部分的最后三位数字,转为三位字符串milli_str = ('000' + str(event_time.microsecond // 1000))[-3:]updated_event = {"x": event['x'],"y": event['y'],"type": event['type'],"t": milli_str  # 只保留时间的最后三位}updated_trajectory.append(updated_event)# 设置滑动结束时间end_time = start_time + datetime.timedelta(milliseconds=trajectory[-1]['t'])# 将时间格式化start_sliding_time = start_time.isoformat() + "Z"end_sliding_time = end_time.isoformat() + "Z"# 提交的数据对象from datetime import datetimedata = {"id": id,"data": {"bgImageWidth": 300,"bgImageHeight": 180,"startSlidingTime": datetime.fromisoformat(start_sliding_time.replace('Z', '+00:00')).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z',"endSlidingTime": datetime.fromisoformat(end_sliding_time.replace('Z', '+00:00')).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z',"trackList": updated_trajectory}}return json.dumps(data, separators=(',', ':'))
5、如果通过校验返回如下状态,可以检测中的某一个Key,如果没有通过,重新获取。
{"code":200,"data":{"id":"get_image_id函数所获取的id"},"msg":"OK","success":true}

整个程序通过率90%吧。在生成轨迹时,当时我滑动了大约近二十组数据,将它提供给gpt-4o,让它进行了分析。 以下轨迹分析的程序,你可以根据它分析的结果,来确定generate_trajectory()中随机数。以下是分析程序。

'''
@File    : 轨迹
@Author  : Bobo
@Blog    : https://blog.csdn.net/chinagaobo
@Note    : This code is for learning and communication purposes only
'''
import jsonguiji1 = [] #校验通过后的轨迹列表
guiji2= []
guiji3 = []
guiji4= []
...def analyze_trajectories(trajectories):for i, trajectory in enumerate(trajectories):print(f"Analysis of track {i + 1}:")for j in range(1, len(trajectory)):dx = trajectory[j]['x'] - trajectory[j - 1]['x']dy = trajectory[j]['y'] - trajectory[j - 1]['y']dt = trajectory[j]['t'] - trajectory[j - 1]['t']print(f"Step {j} -> dx: {dx}, dy: {dy}, dt: {dt}")print()# 将四组轨迹放入列表
trajectories = [guiji1, guiji2, guiji3, guiji4]# 分析轨迹
analyze_trajectories(trajectories)

整篇文章给出了解决此种滑动验证的思路及代码,如果您有好的思路,还请不吝赐教。

相关文章:

过某开源滑动验证码

过某开源滑动验证码 今天早上我有一点空闲时间&#xff0c;想着回顾一下前几天在某查询网站遇到的滑动验证码&#xff0c;以免时间久了忘记了。那个网站可能使用的是较早版本的开源滑块验证码系统tianai-captcha&#xff0c;但我不确定是否正确。 整体思路&#xff1a; 获取…...

一文解决 | Linux(Ubuntn)系统安装 | 硬盘挂载 | 用户创建 | 生信分析配置

原文链接&#xff1a;一文解决 | Linux&#xff08;Ubuntn&#xff09;系统安装 | 硬盘挂载 | 用户创建 | 生信分析配置 本期教程 获得本期教程文本文档&#xff0c;在后台回复&#xff1a;20240724。请大家看清楚回复关键词&#xff0c;每天都有很多人回复错误关键词&#xf…...

Matlab M_map工具箱绘制Interrupted Mollweide Projection

GMT自带了许多的地图投影&#xff0c;但是对于Interrupted Mollweide投影效果却不好。 作为平替的m_map工具箱中带有的投影类型可完美解决这一问题。 Interrupted Mollweide Projection长这样 全球陆地 全球海洋 使用Matlab工具箱m_map展示全球海平面变化的空间分布 addpath(…...

Python 变量与基本数据类型

重点内容 1 掌握变量及厂里在数据输入、输出及计算中的应用&#xff1b; 2 熟练使用datetime模块来处理日期和时间问题&#xff1b; 3 熟练掌握abs()、round()、pow()、sum()、min()、max()等的应用&#xff1b; 4 利用变量、字符等知识模拟开发中一些场景的输入与输出&…...

Pytorch深度学习实践(5)逻辑回归

逻辑回归 逻辑回归主要是解决分类问题 回归任务&#xff1a;结果是一个连续的实数分类任务&#xff1a;结果是一个离散的值 分类任务不能直接使用回归去预测&#xff0c;比如在手写识别中&#xff08;识别手写 0 − − 9 0 -- 9 0−−9&#xff09;&#xff0c;因为各个类别…...

认识漏洞-GitLab 远程命令执行漏洞、致远OA-ajax.do未授权任意文件上传漏洞

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 [GitLab 远程命令执行漏洞复现(CVE-2021-22205)](https://mp.weixin.qq.com/s/4QT-vxKpBn4ppNM9ipt-nQ)02 [致远OA-ajax.do未授权任意文件上传Getshell](https://mp.weixin.qq.com/s/TH2A5J5TXU36Y…...

vue实现电子签名、图片合成、及预览功能

业务功能&#xff1a;电子签名、图片合成、及预览功能 业务背景&#xff1a;需求说想要实现一个电子签名&#xff0c;然后需要提供一个预览的功能&#xff0c;可以查看签完名之后的完整效果。 需求探讨&#xff1a;后端大佬跟我说&#xff0c;文档我返回给你一个PDF的oss链接…...

【flink】之如何消费kafka数据?

为了编写一个使用Apache Flink来读取Apache Kafka消息的示例&#xff0c;我们需要确保我们的环境已经安装了Flink和Kafka&#xff0c;并且它们都能正常运行。此外&#xff0c;我们还需要在项目中引入相应的依赖库。以下是一个详细的步骤指南&#xff0c;包括依赖添加、代码编写…...

科研绘图系列:R语言山脊图(Ridgeline Chart)

介绍 山脊图(Ridge Chart)是一种用于展示数据分布和比较不同类别或组之间差异的数据可视化技术。它通常用于展示多个维度或变量之间的关系,以及它们在不同组中的分布情况。山脊图的特点: 多变量展示:山脊图可以同时展示多个变量的分布情况,允许用户比较不同变量之间的关…...

Boost搜索引擎:如何建立 用户搜索内容 与 网页文件内容 之间的关系

如果想使“用户搜索内容”和“网页文件内容”之间产生联系&#xff0c;就应该将“用户搜索内容”和“网页文件”分为很小的单元 &#xff08;这个单元就是关键词&#xff09;&#xff0c;寻找用户搜索单元是否出现在这个文档之中&#xff0c;如果出现就证明这个网页文件和用户搜…...

【QT】QT 窗口(菜单栏、工具栏、状态栏、浮动窗口、对话框)

Qt 窗口是通过 QMainWindow类来实现的。 QMainWindow 是一个为用户提供主窗口程序的类&#xff0c;继承自 QWidget 类&#xff0c;并且提供了⼀个预定义的布局。QMainWindow 包含一个菜单栏&#xff08;Menu Bar&#xff09;、多个工具栏&#xff08;Tool Bars&#xff09;、…...

Golang | Leetcode Golang题解之第283题移动零

题目&#xff1a; 题解&#xff1a; func moveZeroes(nums []int) {left, right, n : 0, 0, len(nums)for right < n {if nums[right] ! 0 {nums[left], nums[right] nums[right], nums[left]left}right} }...

ubuntu22.04 安装 NVIDIA 驱动以及CUDA

目录 1、事前问题解决 2、安装 nvidia 驱动 3、卸载 nvidia 驱动方法 4、安装 CUDA 5、安装 Anaconda 6、安装 PyTorch 1、事前问题解决 在安装完ubuntu之后&#xff0c;如果进入ubuntu出现黑屏情况&#xff0c;一般就是nvidia驱动与linux自带的不兼容&#xff0c;可以通…...

数据结构·AVL树

1. AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果存数据时接近有序&#xff0c;二叉搜索将退化为单支树&#xff0c;此时查找元素效率相当于在顺序表中查找&#xff0c;效率低下。因此两位俄罗斯数学家 G.M.Adelson-Velskii 和E.M.Landis 在1962年发明了一种解…...

记一次Mycat分库分表实践

接了个活,又搞分库分表。 一、分库分表 在系统的研发过程中,随着数据量的不断增长,单库单表已无法满足数据的存储需求,此时就需要对数据库进行分库分表操作。 分库分表是随着业务的不断发展,单库单表无法承载整体的数据存储时,采取的一种将整体数据分散存储到不同服务…...

数据分析:微生物数据的荟萃分析框架

介绍 Meta-analysis of fecal metagenomes reveals global microbial signatures that are specific for colorectal cancer提供了一种荟萃分析的框架&#xff0c;它主要基于常用的Wilcoxon rank-sum test和Blocked Wilcoxon rank-sum test 方法计算显著性&#xff0c;再使用分…...

Django—admin后台管理

Django官网 https://www.djangoproject.com/ 如果已经有了Django跳过这步 安装Django&#xff1a; 如果你还没有安装Django&#xff0c;可以通过Python的包管理器pip来安装&#xff1a; pip install django 创建项目&#xff1a; 使用Django创建一个新的项目&#xff1a; …...

数字图像处理中的常用特殊矩阵及MATLAB应用

一、前言 Matlab的名称来源于“矩阵实验室&#xff08;Matrix Laboratory&#xff09;”&#xff0c;其对矩阵的操作具有先天性的优势&#xff08;特别是相对于C语言的数组来说&#xff09;。在数字图像处理中&#xff0c;为了提高编程效率&#xff0c;我们可以使用多种方式来创…...

vue侦听器(Watch)精彩案例剖析一

目录 watch介绍 监视普通数据类型 监视对象类型 watch介绍 在 Vue 中,watch主要用于监视数据的变化,并执行相应操作。一旦被监视的属性发生变化,回调函数将自动被触发。当在 Vue 中使用watch来响应数据变化时,首先要清楚,watch本质上是一个对象,且必须以对象的…...

HTTP 协议浅析

HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是应用层最重要的协议之一。它定义了客户端和服务器之间的数据传输方式&#xff0c;并成为万维网&#xff08;World Wide Web&#xff09;的基石。本文将深入解析 HTTP 协议的基础知识、工作…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接&#xff1a;【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

机器学习的数学基础:线性模型

线性模型 线性模型的基本形式为&#xff1a; f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法&#xff0c;得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...

[特殊字符] 手撸 Redis 互斥锁那些坑

&#x1f4d6; 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作&#xff0c;想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁&#xff0c;也顺便跟 Redisson 的 RLock 机制对比了下&#xff0c;记录一波&#xff0c;别踩我踩过…...