自动登录 RPA 的进阶:滑块验证的巧妙实现

ops/2024/9/23 7:21:52/

​在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 程序的稳定性和可靠性。


http://www.ppmy.cn/ops/113558.html

相关文章

网站SEO,该如何规范目标网站URL配置!

随着互联网技术的飞速发展&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;在网站建设和运营中的重要性日益凸显。优化目标网站的URL配置&#xff0c;作为SEO策略中的关键环节&#xff0c;对于提升网站在搜索引擎中的排名和曝光度具有至关重要的作用。大连蝙蝠侠科技将从U…

[ IDE ] SEGGER Embedded Studio for RISC-V

一、FILE 二、Edit 三、View 四、Search 五、Navigate 六、Project 七、Build 7.1 编译 先选择一个目标类型&#xff0c;再选择编译。 八、Debug 九、Target 十、Tools 10.1 自定义快捷键 点击菜单项&#xff0c;通过Tools –> Options –> Keyboard&#xff0c;实现自…

【自动化测试】UI自动化的分类、如何选择合适的自动化测试工具以及其中appium的设计理念、引擎和引擎如何工作

引言 UI自动化测试主要针对软件的用户界面进行测试&#xff0c;以确保用户界面元素的交互和功能符合预期 文章目录 引言一、UI自动化的分类1.1 基于代码的自动化测试1.2 基于录制/回放的自动化测试1.3 基于框架的自动化测试1.4 按测试对象分类1.5 按测试层次分类1.6 按测试执行…

ARM驱动学习之21_字符驱动

ARM驱动学习之21_字符驱动 操作步骤&#xff1a; file_operations中的函数比较多&#xff0c; 选取用的比较多的函数简单介绍&#xff0c; 后 面的驱动教程中调用了对应的函数• int (*open) (struct inode *, struct file *) – 打开函数 • int (*release) (struct inode *…

YOLOv8改进 - 注意力篇 - 引入ECA注意力机制

一、本文介绍 作为入门性第一篇&#xff0c;这里介绍了ECA注意力在YOLOv8中的使用。包含ECA原理分析&#xff0c;ECA的代码、ECA的使用方法、以及添加以后的yaml文件及运行记录。 二、ECA原理分析 ECA官方论文地址&#xff1a;ECA文章 ECA的pytorch版代码&#xff1a;ECA的…

el-table 的单元格 + 图表 + 排序

<el-table border :data"tableDataThree" height"370px" style"width: 100%"><el-table-column :key"activeName 8" width"50" type"index" label"序号" align"center"></el…

8586 括号匹配检验

### 思路 1. **初始化栈**&#xff1a;创建一个空栈用于存储左括号。 2. **遍历字符串**&#xff1a;逐个字符检查&#xff1a; - 如果是左括号&#xff08;( 或 [&#xff09;&#xff0c;则入栈。 - 如果是右括号&#xff08;) 或 ]&#xff09;&#xff0c;则检查栈是…

自动化测试常用函数

目录 一、元素的定位 1、cssSelector 2、xpath &#xff08;1&#xff09;xpath 语法 1、获取HTML页面所有的节点 2、获取HTML页面指定的节点 3、获取一个节点中的直接子节点 4、获取一个节点的父节点 5、实现节点属性的匹配 6、使用指定索引的方式获取对应的节点内容…