过某开源滑动验证码

过某开源滑动验证码

今天早上我有一点空闲时间,想着回顾一下前几天在某查询网站遇到的滑动验证码,以免时间久了忘记了。那个网站可能使用的是较早版本的开源滑块验证码系统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)

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

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

开始尝试从0写一个项目--前端(三)

器材管理板块 添加器材管理导航 src\views\home\Home.vue src\router\index.js src\views\equipment\Equipment.vue <template><div>hello!</div></template> 测试 搜索导航分页查询 src\views\equipment\Equipment.vue <template><div&…

【React】详解 Redux 状态管理

文章目录 一、Redux 的基本概念1. 什么是 Redux&#xff1f;2. Redux 的三大原则 二、Redux 的核心组件1. Store2. Action3. Reducer 三、Redux 的使用流程1. 安装 Redux 及其 React 绑定2. 创建 Action3. 创建 Reducer4. 创建 Store5. 在 React 应用中使用 Store6. 连接 React…

Apache Flink窗口详解

Apache Flink窗口详解 Apache Flink 的核心功能之一是窗口处理&#xff0c;它允许开发人员以基于时间或基于计数的方式分组和处理数据流。 窗口技术是一种根据某些标准将数据流划分为有限块&#xff08;称为窗口&#xff09;的技术。 窗口&#xff08;Window&#xff09;是处…

活动报名小程序

#活动报名工具# # 活动报名小程序 ## 项目简介 一款通用的活动报名工具&#xff0c;包含活动展示&#xff0c;微信支付&#xff0c;订单管理&#xff0c;分享评价等功能。 品客聚精彩&#xff0c;有你才精彩&#xff01;不只有线下活动还可以进行线上裂变活动。 …

HTTP ESP8266 获取天气请求 单片机,嵌入式 2024/7/26 日志

通过http请求获取天气信息: 这里借鉴一下 中国气象局网站举例 首先根据网址 分析: http://weather.cma.cn/ 通过vscode插件:REST Client 发送请求我们会得到内容 首先我们的打开浏览器调试工具查看请求格式 筛选以下几个关键的格式,试着用插件发送请求 GET /web/weather…

【项目日记(三)】梦幻笔耕-前端模块

❣博主主页: 33的博客❣ ▶️文章专栏分类:项目日记◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多项目内容 目录 1.前言,2.登录界面3.注册界面4.博客列表界面5.博客编辑页6.博客详情页7.博客更新界面…

Java 8 中 20 个高频面试题及答案

文章目录 前言20 道高频题问题 1&#xff1a;给定一个整数列表&#xff0c;使用 Stream 函数找出列表中所有的偶数&#xff1f;问题 2&#xff1a;给定一个整数列表&#xff0c;使用 Stream 函数找出所有以 1 开头的数字&#xff1f;问题 3&#xff1a;如何使用 Stream 函数在给…

stm32入门-----TIM定时器(输入捕获模式——下)

目录 前言 一、C语言编程初始化步骤 1.开启时钟 2.配置GPIO口 3.配置时基单元 4.配置输入捕获单元&#xff08;主模式&#xff09; 5.配置触发源于从模式 6.开启定时器 二、项目实操&#xff08;测周法&#xff09; 1.定时器测量方波 2.定时器测量方波的占空比 前言 接…

el-table表格 及其el-pagination分页 封装及其使用

1、首页在components文件夹中新建table文件夹 table文件夹下table.vue全部代码&#xff1a; <template><el-table:stripe"stripe":row-key"handlerRowKey()":tree-props"treeProps":border"border":show-summary"showS…

无人机之降落操作及紧急情况处理

一、无人机降落操作 1、选择降落地点 a.提前选择一个平坦且没有障碍物的降落点&#xff1b; b.确认降落点周围没有行人或障碍物&#xff0c;保证降落的安全性。 2、降低飞行高度 a.缓慢降低飞行高度&#xff0c;尽量保持匀速下降&#xff0c;防止因下降过快导致无人机受损…

Android 软键盘挡住输入框

Android原生输入法软键盘挡住输入框,网上各种解法,但不起效。 输入框都是被挡住了,第二张图的小点,实际就是输入法的光标。 解法: packages\inputmethods\LatinIME\java\res\values-land config.xml <!-- <fraction name="config_min_keyboard_height"&g…

数据库变更导致的 Salesforce 史上最严重安全事故

这两天的 Windows 全球蓝屏事件让大家又一次看到了光鲜软件背后的脆落。借此我们也来回顾另一个软件巨头 Salesforce 史上最严重的一次安全事故。 1 事件回顾 事情发生在 2019 年 5 月 19 日&#xff0c;同样是一个周五。 Salesforce 的工程师往旗下产品 Pardot (B2B Marketi…

董宇辉离职,我一点都不意外!只不过感觉来的太快

下面这张图&#xff0c;是我在半年多前写的一段随笔&#xff0c;没想到来的这么快&#xff01; 碰巧的是今天中午&#xff0c;在开发者群里有两位老铁自曝&#xff0c;本以为能公司干到老&#xff0c;但公司却不给机会&#xff0c;已经不在是公司员工了。 最近&#xff0c;晓衡…

加速下载,揭秘Internet Download Manager2024下载器的威力!

1. Internet Download Manager&#xff08;IDM&#xff09;是一款广受欢迎的下载管理软件&#xff0c;以其强大的下载加速功能和用户友好的界面著称。 IDM马丁正版下载如下: https://wm.makeding.com/iclk/?zoneid34275 idm最新绿色版一键安装包链接&#xff1a;抓紧保存以…

学习在测试时学习(Learning at Test Time): 具有表达性隐藏状态的循环神经网络(RNNs)

摘要 https://arxiv.org/pdf/2407.04620 自注意力机制在长文本语境中表现良好&#xff0c;但其复杂度为二次方。现有的循环神经网络&#xff08;RNN&#xff09;层具有线性复杂度&#xff0c;但其在长文本语境中的性能受到隐藏状态表达能力的限制。我们提出了一种新的序列建模…

Django Form表单,常用表单字段

在Django中&#xff0c;表单&#xff08;Forms&#xff09;是处理用户输入数据的重要工具。Django提供了两种主要方式来创建和处理表单&#xff1a;使用Django的表单API手动创建表单&#xff0c;或者使用模型表单&#xff08;ModelForms&#xff09;自动从数据库模型生成表单。…

[SaaS] 盒马设计->AI如何为企业经营创造价值

D20【AIGC x 零售】AI设计如何为企业经营创造价值&#xff1f;AIGC能力不仅仅是设计师的效率工具&#xff0c;也可以当好企业的大脑&#xff0c;帮助构建企业自己的数字化设计工作流&#xff0c;让设计资产和数据发挥更大价值https://mp.weixin.qq.com/s/tk1ahorN_yQ0N-RTZ2U9x…

【告别截图烦恼】4款超神截图软件,让你的设计工作飞起来!

你是否还在为截图时的繁琐操作头疼&#xff1f;网页内容截不全&#xff0c;图片模糊不清&#xff0c;或是在图层中翻找素材时手忙脚乱&#xff1f;今天&#xff0c;米兔要带你摆脱这些烦恼&#xff0c;介绍四款让你事半功倍的截图软件&#xff01; 1. Snipaste&#xff1a;简单…

ArrayList底层原理

1. ArrayList 的基本结构 ArrayList 内部使用一个 Object 类型的数组 elementData 来存储所有的元素。数组的长度可以动态调整。 2. 初始容量和扩容机制 初始容量&#xff1a;当使用无参构造创建一个 ArrayList 实例时会在底层创建一个默认长度为0的数组&#xff0c;可以通过…

解决vscode+UE5中vscode无法识别头文件,无法函数无法跳转,也无法自动补全的问题。

一、概述 接上一条博客&#xff0c;虽然解决了报错的问题&#xff0c;但是实际上的问题却没有解决&#xff0c;无论我怎么点击&#xff0c;其都无法完成跳转&#xff0c;也无法完成自动补全的问题。 在网络上搜索了很多资料后&#xff0c;发现是在使用vscode时候UE5在vscode中的…