自动登录 RPA 的进阶:滑块验证的巧妙实现
在RPA的众多应用场景的探索中,自动登录是一个至关重要的环节,它为后续的自动化操作奠定了基础。然而,当我们面对滑块验证这一常见的挑战时,常常会感到困惑和无从下手。本文就来分享自动登录RPA的进阶----滑块验证如何实现。
在分享自动登录RPA的进阶之前,我们先来了解一个工具包–ddddocr
一、ddddocr:验证码识别的利器
ddddocr是一个功能强大的验证码识别工具包,专门用于处理各种复杂的验证码,包括滑块验证码、文字点选、算术、字母、数字等类型。它基于深度学习技术,能够准确地识别图像中的滑块位置,并提供相应的操作指令。
二、使用ddddocr实现滑块验证
在先前的探索中,如《揭秘AI+RPA:CSDN热榜数据抓取RPA与AI融合之道-CSDN博客》和《揭秘AI+RPA:CSDN 自动登录 RPA 的实现之道-CSDN博客》的所述,我们可以成功获取到谷歌浏览器的客户端。
option = ChromiumOptions().set_paths(local_port=port).set_argument('--start-maximized')client = ChromiumPage(addr_or_opts=option, timeout=10)
本文以知乎账号密码登录时的滑块验证为例,展示如何利用 ddddocr 来攻克这一难题。
1. 寻找拖拽的iframe标签
首先,我们需要在页面中找到拖拽滑块的 iframe 标签,这是后续操作的基础。
iframe = client.get_frame(1)sleep(1)
2. 获取完整图片
接下来,获取包含滑块背景的完整图片。通过定位完整图片的元素,并获取其图片的 URL,然后使用 requests 库获取图片数据。
image_ele = iframe.ele('@id:yidun_bg-img')image_url = image_ele.attr('src')response = requests.get(image_url)if response.status_code == 200:image_data = response.contentelse:raise Exception('Failed to retrieve the image')
3. 获取缺口图片
和2一样的方法,获取带有缺口的图片数据。
gap_image_ele = iframe.ele('@id:yidun_jigsaw')gap_image_url = image_ele.attr('src')response = requests.get(image_url)if response.status_code == 200:gap_image_data = response.contentelse:raise Exception('Failed to retrieve the gap image')
4. 利用ddddocr工具包计算缺口的位置
这里是很关键的一步,使用 ddddocr 工具包的强大功能来计算缺口的准确位置。
slider_ocr = ddddocr.DdddOcr(det=True,show_ad=False)slider_ocr.slide_match(gap_image_data, image_data)target = result.get('target')
让我们来分析一下slide_match方法,在我们的例子中,走的是else分支,所以simple_target对象先忽略。
该方法中有两个核心方法cv2.matchTemplate和cv2.minMaxLoc,cv2.matchTemplate使用了相关系数归一化方法进行目标图像和背景图像的匹配,而cv2.minMaxLoc方法用于在cv2.matchTemplate方法匹配的结果中获取最小、最大匹配值以及位置。
def slide_match(self, target_bytes: bytes = None, background_bytes: bytes = None, simple_target: bool = False,flag: bool = False):if not simple_target:……# 会走elseelse:target = cv2.imdecode(np.frombuffer(target_bytes, np.uint8), cv2.IMREAD_ANYCOLOR)target_y = 0target_x = 0background = cv2.imdecode(np.frombuffer(background_bytes, np.uint8), cv2.IMREAD_ANYCOLOR)background = cv2.Canny(background, 100, 200)target = cv2.Canny(target, 100, 200)background = cv2.cvtColor(background, cv2.COLOR_GRAY2RGB)target = cv2.cvtColor(target, cv2.COLOR_GRAY2RGB)# 核心方法1,使用相关系数归一化方法进行目标图像和背景图像的匹配。# res是一个二维数组,大小与背景图像大小一致,每个位置表示目标图像在该位置与背景图像的匹配程度,范围是(-1, 1)res = cv2.matchTemplate(background, target, cv2.TM_CCOEFF_NORMED)# 核心方法2,通过minMaxLoc获取最小、最大匹配值以及位置min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)h, w = target.shape[:2]# 图像坐标系,通常以左上角为原点,向右为 x 轴正方向,向下为 y 轴正方向。bottom_right = (max_loc[0] + w, max_loc[1] + h)return {"target_y": target_y,"target": [int(max_loc[0]), int(max_loc[1]), int(bottom_right[0]), int(bottom_right[1])]}
5. 计算滑块滑动的轨迹
由slide_match方法可知,target是一个对象。target的key对应的value是一个list,分别对应最大匹配位置的坐标,以及从该坐标开始的h * w的区域的右下角的坐标。即背景图像缺失的图像的x轴的坐标点为target[0]。
有了target[0],我们就可以利用高中物理学到的匀加速运动的位移公式和速度公式,计算出滑动从起点到target[0]滑动的轨迹点。
让我们先来回顾下高中物理中的这些公式
-
速度公式
v = v 0 + a t v = v_0 + at v=v0+at
其中是v末速度,是v0是初速度,a是加速度,t是时间。 -
位移公式
s = v 0 t + 1 2 a t 2 s = v_0t + \frac{1}{2}at^2 s=v0t+21at2
其中s是位移。
以下是公式的代码实现。
v, t, acc_dis = 0, 0.5, 0plus = []while acc_dis < distance:if acc_dis < mid:a = round(random.uniform(1.0, 2.0), 1)else:a = -round(random.uniform(1.0, 2.0), 1)s = v * t + 0.5 * a * (t ** 2)v = v + a * tacc_dis += splus.append(round(s))
6. 让RPA模拟人的动作,移动滑块到指定位置
最后一步,让 RPA 模拟人类的动作,将滑块移动到指定位置。
move_btn = iframe.ele('@class:yidun_control')iframe.actions.hold(move_btn)for track in plus:iframe.actions.move(offset_x=track,# y轴的偏移,可以指定随机值offset_y=round(random.uniform(1, 10), 0),duration=0.1)time.sleep(0.1)iframe.actions.release(move_btn)
三、总结
在 RPA 的探索中,自动登录是一个关键环节,而滑块验证则是一个常见的挑战。本文通过使用 ddddocr 工具包,有效地解决了滑块验证问题,实现自动登录 RPA 的进阶。当然,在实际应用场景中,我们还需要根据具体的情况进行调整和优化,以确保 RPA 程序的稳定性和可靠性。
相关文章:
自动登录 RPA 的进阶:滑块验证的巧妙实现
在RPA的众多应用场景的探索中,自动登录是一个至关重要的环节,它为后续的自动化操作奠定了基础。然而,当我们面对滑块验证这一常见的挑战时,常常会感到困惑和无从下手。本文就来分享自动登录RPA的进阶----滑块验证如何实现。 在…...

Flask-WTF的使用
组织一个 Flask 项目通常需要遵循一定的结构,以便代码清晰、可维护。下面是一个典型的 Flask 项目结构: my_flask_app/ │ ├── app/ │ ├── __init__.py │ ├── models.py │ ├── views.py │ ├── forms.py │ ├── templat…...

Docker 进入容器并运行命令的方法
目录 理解 Docker 容器的基本概念 使用 docker exec 进入运行中的容器 基本用法 常用选项解析 选项详解 实际案例演示 1. 进入容器的交互式 Shell 2. 在容器中运行单个命令 3. 以指定用户运行命令 4. 设置环境变量并运行命令 5. 指定工作目录 使用 docker attach 附…...
2024“华为杯”中国研究生数学建模竞赛(E题)深度剖析_数学建模完整过程+详细思路+代码全解析
问题1详细解答过程 (1) 交通流参数统计 数据预处理 数据读取: 从四个视频观测点提取交通流数据,包括每个时间段内的车流量、车速和车道占用率等。 交通流参数计算 3. 计算流量 (Q): Q ( t ) N ( t ) Δ t Q(t) \frac{N(t)}{\Delta t} Q…...

伊犁云计算22-1 apache 安装rhel8
1 局域网网络必须通 2 yum 必须搭建成功 3 apache 必须安装 开干 要用su 用户来访问 一看httpd 组件安装完毕 到这里就是测试成功了 如何修改主页的目录 网站目录默认保存在/var/WWW/HTML 我希望改变/home/www 122 127 167 行要改...
概率论原理精解【13】
文章目录 在度量空间中,连续映射概述一、度量空间与距离函数二、连续映射的定义三、连续映射的等价定义四、连续映射的性质五、应用与例子 球形邻域刻画一、球形邻域的定义二、连续映射的球形邻域刻画三、等价性证明四、应用与例子 将度量空间上的连续映射推广到拓扑…...

年度巨献 | OpenCSG开源最大中文合成数据集Chinese Cosmopedia
01 背景 近年来,生成式语言模型(GLM)的飞速发展正在重塑人工智能领域,尤其是在自然语言处理、内容创作和智能客服等领域展现出巨大潜力。然而,大多数领先的语言模型主要依赖于英文数据集进行训练,中文数据…...

Mac 上,终端如何开启 proxy
文章目录 为什么要这么做前提步骤查看 port查看代理的port配置 bash测试 为什么要这么做 mac 上的终端比较孤僻吧,虽然开了,但是终端并不走🪜…产生的现象就是,浏览器可以访问🌍,但是终端不可以访问&#…...

Linux中的进程入门
冯诺依曼体系结构 操作系统(Operator System) 进程控制块(PCB) struct task_struct{//该进程的所有属性//该进程对应的代码和属性地址struct task_struct* next; }; struct task_struct 内核结构体——>创建内核结构体对象(task_struct)…...

Redis面试真题总结(三)
文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 什么是缓存雪崩?该如何解决? 缓存雪崩是指…...
ARM/Linux嵌入式面经(三三):大疆
嵌入式工程师考察主要蕴含:C/C++,处理器的架构,操作系统(linux或嵌入式实时操作系统),常见硬件接口协议/总线,文件存储系统等几方面 文章目录 1)C/C++static作用,变量加入static以后在内存中存储位置的变化。static的作用变量加入static后在内存中存储位置的变化面试官…...

《DevOps实践指南》笔记-Part 2
一篇文章显得略长,本文对应第3-4章。前言、第1-2章请参考Part 1;第5-6章、附录、认证考试、参考资源等内容,请参考Part 3。 流动的技术实践 持续交付:降低在生产环境中部署和发布变更的风险。包括:打好自动化部署流水…...

树莓派智能语音助手实现音乐播放
树莓派语音助手从诞生的第一天开始,我就想着让它能像小爱音箱一样,可以语音控制播放音乐。经过这些日子的倒腾,今天终于实现了。 接下里,和大家分享下我的实现方法:首先音乐播放模块用的是我在上一篇博文写的《用sound…...

【sgCreateCallAPIFunctionParam】自定义小工具:敏捷开发→调用接口方法参数生成工具
<template><div :class"$options.name" class"sgDevTool"><sgHead /><div class"sg-container"><div class"sg-start"><div style"margin-bottom: 10px">参数列表[逗号模式]<el-too…...

完整版:NacosDocker 安装
第一步:先直接通过命令安装 Nacos docker run --name nacos2.2.3 -d -p 8848:8848 -e MODEstandalone f151dab7a111 第二步:创建 Docker 挂载目录 # 创建 log 目录 mkdir -p /root/nacos 第三步:将 Docker 容器的文件复制到挂载目录中 …...
mysql RR是否会导致幻读?
除了rr级别的当前读,都会幻读 mysql不同隔离级别: 而对于RC级别的语句级快照和RR级别的事务级快照的之间的区别,其实是由read_view生成的时机来实现的。 RC级别在执行语句时,会先关闭原来的read_view,重新生成新的r…...

一篇进阶Python深入理解函数之高阶函数与函数式编程
当我们深入探讨了函数的作用域与闭包,了解到函数不仅是代码的执行单元,还能通过闭包完成数据的封装与保护.接下来,我们将进一步挖掘函数的强大特性,尤其是高阶函数与函数式编程,帮助你更全面地理解 Python 中函数的特性与应用. 高阶函数 高阶函数是指接受一个或多个函数作为参…...
python中Web开发框架的使用
Python 的 Web 开发框架种类繁多,常见的有 Django 和 Flask 这两个框架。它们各有优点,适合不同类型的 Web 应用开发需求。下面,我将详细介绍这两大主流框架的使用方法,让你快速上手 Python 的 Web 开发。 1. Django Django 是一…...

【AI视频】Runway:Gen-2 运镜详解
博客主页: [小ᶻZ࿆] 本文专栏: AI视频 | Runway 文章目录 💯前言💯Camera Control(运镜)💯Camera Control功能测试Horizonta(左右平移)Vertical(上下平移࿰…...

Python “函数” ——Python面试100道实战题目练习,巩固知识、检查技术、成功就业
本文主要是作为Python中函数的一些题目,方便学习完Python的函数之后进行一些知识检验,感兴趣的小伙伴可以试一试,含选择题、判断题、实战题、填空题,答案在第五章。 在做题之前可以先学习或者温习一下Python的函数,推荐…...
C++参数传递 a与a的区别
在 C 中,&a(引用)和 a(值传递) 的关键区别在于 参数如何传递给函数,以及由此引发的 性能、语义和安全问题。 最核心的在于你想不想传入的参数被改变,如果想,就用参数传递&#…...

部署DNS从服务器
部署DNS从服务器的目的 DNS域名解析服务中,从服务器可以从主服务器上获得指定的区域数据文件,从而起到备份解析记录与负载均衡的作用,因此通过部署从服务器可以减轻主服务器的负载压力,还可以提升用户的查询效率。 注意…...
gorm 配置数据库
介绍 GORM 是 Go 语言中最流行的 ORM(对象关系映射)库之一,基于数据库操作的封装,提供类似 Django ORM / SQLAlchemy 的开发体验。 特性描述支持多种数据库MySQL、PostgreSQL、SQLite、SQL Server、ClickHouse 等自动迁移自动根…...
Android 线性布局中常见的冲突属性总结
1. gravity vs layout_gravity 冲突原因:两者作用对象不同,混用会导致行为异常。 区别: android:gravity:父容器的属性,控制子元素在容器内的对齐方式。android:layout_gravity:子元素的属性,控…...

安科瑞防逆流方案落地内蒙古中高绿能光伏项目,筑牢北疆绿电安全防线
一、项目概况 内蒙古阿拉善中高绿能能源分布式光伏项目,位于内蒙古乌斯太镇,装机容量为7MW,采用自发自用、余电不上网模式。 用户配电站为35kV用户站,采用两路电源单母线分段系统。本项目共设置12台35/0.4kV变压器,在…...
【RAG召回】bge实现向量相似度索引
sentence-transformers 是一个非常强大的 Python 框架,它可以将句子或段落转换成高质量、高信息密度的数字向量(称为“嵌入”或 Embeddings)。它厉害的地方在于,语义上相似的句子,其向量在空间中的距离也更近。 这使得…...
ArkUI-X与Android桥接通信之消息通信
平台桥接用于客户端(ArkUI)和平台(Android或iOS)之间传递消息,即用于ArkUI与平台双向数据传递、ArkUI侧调用平台的方法、平台调用ArkUI侧的方法。本文主要介绍Android平台与ArkUI交互,ArkUI侧具体用法请参考…...

第三讲 Linux进程概念
1. 冯诺依曼体系结构 我们买了笔记本电脑, 里面是有很多硬件组成的, 比如硬盘, 显示器, 内存, 主板... 这些硬件不是随便放在一起就行的, 而是按照一定的结构进行组装起来的, 而具体的组装结构, 一般就是冯诺依曼体系结构 1.1. 计算机的一般工作逻辑 我们都知道, 计算机的逻…...

Excel 表格内批量添加前缀与后缀的实用方法
我们经常需要为 Excel 表格中的内容统一添加前缀或后缀,例如给编号加“NO.”、给姓名加“会员_”等。手动操作效率低,本文将介绍几种实用的方法,帮助你快速完成批量添加前缀和后缀的操作。 使用“&”运算符添加前缀或后缀(推…...

Python60日基础学习打卡Day46
一、 什么是注意力 注意力机制的由来本质是从onehot-elmo-selfattention-encoder-bert这就是一条不断提取特征的路。各有各的特点,也可以说由弱到强。 其中注意力机制是一种让模型学会「选择性关注重要信息」的特征提取器,就像人类视觉会自动忽略背景&…...