1. 前置(一个注意点)
Note:
1. 有一种情况,若 windows 系统是在虚拟机中启动的,则要考虑虚拟机与物理机的鼠标是否同步的问题。(此处以 Mac 系统启动的虚机为例) 如下:
2. 如果没有将虚拟机与物理机的鼠标进行同步,则可能导致验证码识别过程,看不到鼠标点击拖动的情形,以至于后续无法准确估算鼠标点击拖动的位置信息。
2. 流程全览
3. 具体步骤说明
3.1(以本场景为例)打开网站进行验证码识别过程
测试地址:‘
http://www.jq22.com/yanshi19009’(推荐使用“谷歌浏览器”打开)
3.2 基于页面美观考虑,我们使用“序列”组件
3.3 激活窗口并截图
Note:
1. 每次验证前激活窗口,确保鼠标的点击拖动有效;
2. 使用“截图”控件截取整个验证图片。(为后续使用验证码识别器获取相对位置信息作准备)截图的返回值为一个路径:C:iS-RPAtempZK5RVC6j.png
3.4 识别验证码位置
Note:
1. 将截图的返回值(保存路径)直接传给验证码的接收值
2. 验证码类型说明:
8000: 滑动验证码
8001:坐标验证码(成语验证等)
1004:4 位英文数字
2004:4 位纯汉字
3. 组件原理也是通过后台人工识别,识别得出验证码的坐标信息,因此不能保证识别一次完全准确
3.5 位置处理
获取鼠标的相对位置信息(坐标仅相对于整个验证截图),即鼠标需要实际拖动的距离 = b
输出结果:
3.6 弹出拖动距离的消息提示框
每次拖动前,弹出位置处理得出的拖动距离。目的:可以更明确每次获取的位置信息;同时有助于后续多次调节坐标位置
Note:
由下载论坛网站的破解滑动验证码工程文件(../huadong/project.pro)发现如下规律:
同样的网站截取相同滑动验证图片,得到的参数信息并不同。使用原工程中截图,在本机下执行原工程文件,鼠标不在原来初始位置点击,而改变网页整体位置后,可以实现鼠标点中初始位置。界面大致如下:
结论:我们设定计算出的鼠标点击拖动初始位置信息与电脑显示屏大小相关
3.7 代码实现点击鼠标拖动
代码如下:
from ctypes import * from ctypes.wintypes import * def imouse_drag(x1, y1, x2, y2,button=’left’,speed=10): # (x1,y1),(x2,y2)分别表示:鼠标移动的初末坐标点 try: dll = windll.LoadLibrary(“../Com.Isearch.Func.AutoIt/AutoItX3.dll”) # 对象为:本地的一个动态链接库文件 return dll.AU3_MouseClickDrag(button,x1,y1,x2,y2,speed) # 使用鼠标点击拖动方法 except Exception as e: raise e
3.8 计算坐标参数值 – 获取起始位置
Note:
实现点击鼠标拖动的方法,我们需要得到 x1,y1,x2,y2 四个参数值。
由“截图”控件右边属性栏的位置参数信息,可根据以下计算公式得出:
x1 = (左边位置 + 预估值)/ 2
(预估值:蓝色滑块的水平中心位置)
y1 = y2 = (上边位置 + 高度 – 预估值)/ 2
(预估值:蓝色滑块的垂直中心位置)
x2 = x1’ + b
(此处 x1’可根据多次滑动验证与缺口图准确距离的偏差取平均值)
3.9 异常处理 – 考虑验证失败情况
思路:
此处用 while 循环,条件设为 True,即:在死循环的条件下进行验证码的识别过程,直到识别成功;
同时考虑异常处理的情况:若在验证过程出现异常,即使用热键 Ctrl+R 刷新页面,进行下一次循环