最近爬虫采集数据遇到了验证码的障碍,需要破解某网站的滑动验证码(GEETEST)。
主要参考https://segmentfault.com/q/1010000008584470,这里面实现了图片拼接(还原),识别缺口位置,还有模拟拖动。参考代码,最终破解了针对目标网站的滑动验证码。步骤如下:
1.图片还原
为什么有这一步呢?网站展现给我们的是完整的图片,点击滑块后图片会出现一个缺口。实际上点击前后是两张图,每个整图是一小块一小块拼起来的图,而我们能获取到的是两张小块乱序拼接在一起的图,如下:
点击前乱序图.jpg 点击后乱序图.jpg
所以第一步就是按小图切分后再按正确的顺序重新拼接起来,还原成我们网页上看到的图。按什么顺序呢?"检查元素"后
before.png after.png2.识别缺口位置
我们可以看到前后两张图只有两处地方不一样,一处是明显的缺口,另一处是不明显的伪缺口(以下简称干扰)。我们可以对比前后两张图,找到不一样的地方,再用一个阈值排除掉干扰即可。
一个像素点有r,g,b三个值,我采用的衡量两个像素点差别的度量是前后图的r,g,b的差值的绝对值的加和。
做实验,当阈值为70时,
阈值为100时,
直到阈值为150时,
再也没有干扰了,缺口的部分地方也识别不出来了,但是没关系,只要用识别到的最小的x作位置即可。
3.模拟拖动
这个是相对麻烦的一步。最开始用各种随机,x随机y随机移动时休息时间随机,发现完全无法通过。网站后台应该用了模型去判断是否符合人的操作,所以想破解还得再还原人的操作。而人的操作对应到电脑操作就是一个记录每一步移动距离的数组。
参考https://www.zhihu.com/question/32209043,部分提到人的拖动是先加速后减速的,利用这个思想,结合自己实验多次,发现了一些规律:
1.人总体拖动先加速后减速
2.两步之间移动的距离差不能过大过频繁
3.每一步移动距离不能太大(一般2就算比较大)
最后建立了一个先慢加速后快加速再减速的模型,以距离来确定应该用哪一个加速度,最后一段距离如果速度超过阈值,再用一个更强的减速。在整个过程中加一些低概率随机的-1。
这种方法效果非常拟人,通过率也很高。通过率没统计过。
网友评论