🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快
现在出现了一种通过用户鼠标移动滑块来填补有缺口图片的验证码,我们叫做滑动验证码。
它的原理很简单,首先生成一张图片,然后随机挖去一块,在页面展示被挖去部分的图片,再通过js获取用户滑动距离,以及坐标等信息到后台进行校验。只要用户移动的距离符合,以及移动的轨迹行为检测通过即可视为验证通过。
解决思路
目前这种验证码的通用解决思路如下:
获取验证码图片,包含原图以及有缺口的图
算出缺口的位置,以及滑块要滑动的距离
通过算法模拟人工移动轨迹
通过selenium模拟操作
逻辑实现
我们以保温网为例:http://www.cnbaowen.net/api/geetest/。
获取验证码图片
注意我们需要获取两张图片,第一张是完整背景图,第二张是有缺口的背景图。
经过分析发现当鼠标位于按钮是上时显示完整背景图,当鼠标点击滑动按钮不松,显示有缺口的背景图。
根据之前学习的爬虫知识,图片一定是浏览器下载回来的,通过查看历史请求确实发现了图片
但是图片有点奇怪,仔细查看发现图片是被分块并有意随机拼接的。
根据以页面的css可以利用背景将图片拼接出来。我们当然可以依葫芦画瓢的利用PIL进行图片拼接,但是太麻烦了。
selenium有个方法可以对元素进行截图,先找到图片所在的html元素,然后利用selenium分别进行截图即可获取图片。代码如下:
完整图片:
有缺口图片:
计算移动距离
找出缺口位置,计算移动距离。算法有很多,大家可以自由发挥。这里我们讲一种最简单的方法。我们要算出的距离是滑块要滑动的距离。
通过比较没有缺口的图片,和这张有缺口的图片,找出滑块的位置和缺口的位置即可。
经过观察,发现滑块出现的位置固定在x轴的0-100像素范围内,所以循环比较两张图片的x轴0-100像素范围内的每一行像素点,直到找到第一行出现两个图片像素点颜色完全不同的点,即找到了滑块的最左边最上的第一个像素点。
但是在实际操作中发现,虽然肉眼看起来两张图片公共部分一模一样,但是程序处理后的像素的具体rgb值也是不相同的,所以需要设置一个阈值来判断,具体需要进行测试。
按照相同的思路,比较两张图片x轴100-end像素的部分,找到缺口的最左最上那个点。
用找到的缺口像素点的x坐标减去找到的滑块的点的x坐标得到近似移动距离。这种算法,经过测试准确率还不错,大家如果在实际工作过程中发现有问题,需要根据具体情况去设计不同算法。
代码如下:
计算滑动轨迹
滑动验证码早期刚面世的时候没有做行为校验,很快被激活成功教程。随着人工智能的发展,目前所有商用滑动验证码后台都有做行为校验,根据前端传递的移动轨迹,后台会进行特征校验,如果判定非人工则返回校验失败。模拟人的滑动行为,最常见的以中方法是通过加速度公式。
目前这个方法已经被识别,但相对较简单,我们首先学习其思路。大家根据自己的能力可以自行扩展。
基本思路是,分析手动的移动轨迹后发现,是先加速后减速,所以通过加速度公式进行如下的设计:
滑动滑块
利用selenium,根据算出的轨迹,进行模拟滑动,代码如下:
完整代码
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/11575.html