题记——毛主席教导我们一切帝国主义都是纸老虎
极验验证(http://www.geetest.com)是目前比较前沿新颖的一种验证方式,相比传统的字符型验证码更加人性化,用户验证的时间更短,更具交互性,同时也减少了网站的用户流失。该网站号称“超过200种人机行为特征检测,全面监控可疑机器攻击,快到每30分钟全网特征动态更新,迅速应对突发情况,多达5层异构安全模型滤网 ,360度保护网站安全”。博主最近在写爬虫时目标网站用的就是极验验证的验证,顺带着就破解了一下(就是这么霸气,哈哈)
我们先看一下极验验证是什么。极验验证的验证方式是给你一幅图,随机扣掉一块,让用户滑动滑块把图拼上,就能验证通过。
如图所示
开始时会给你一张原始图片
当鼠标点住滑块时,会出现拼图
\
用户把滑块拖到拼图缺失位置时,验证就会通过(图配错了,不过没关系,意思大家都懂 ^_^ )
第一步:模拟浏览器
这里我用的是selenium+phantomjs的组合,这两个组件估计搞测试的童鞋们应该不会陌生吧,selenium是是一个自动化测试工具,我用它来实现鼠标的操作,phantomjs可以理解为一个无界面浏览器。在写破解程序之前,先把该写的都写了,该伪装的都伪装了,让对面服务器认为这就是一个普通的用户,这一点有过爬虫经验的童鞋都了解,就不再多说了。同时selenium的鼠标操作也不说了,直接挑干的说,进入下一步。
第二步:找到拼图的位置
首先先通过selenium+phantomjs的截图的功能获得原始图片
再将鼠标点击住滑块(clickandhold),等待几秒,截图获得拼图的图片
我是通过比较像素点的方法找到缺失位置的的,当像素点差异过了一定范围,这时在比较该点附近的一些点来比较,确定是不是拼图的边界。附近的比较点有很大的说道,网上一些人说的横向比较(x轴)和竖向比较(y轴)考虑的都不太全面,要考虑拼图上的凸起和凹陷的情况
为什么不能直接通过差异来确定拼图缺失块边界呢。原因是对比的两张图是截图得来的,或多或少会有一些差异,保不齐就有一两个点被程序认为是目标位置的边界。同时也有可能对拼图的阴影位置误判。
第三步:滑动轨迹
前面几步我们知道了滑块应该滑到的位置,当我们让程序滑动时会出现下图的情况
如图所示,我们将滑块滑到了正确的位置,却提示拼图让小怪物吃了,其实是被怀疑是机器人了。应该是人机特征不通过吧。没办法,机器学习的问题就用机器学习的方式来办吧。先到官网的产品体验模块,收集了自己的滑动数据三十组(博主当时比较没底,毕竟号称200多种人机交互特征,再加上比较懒,就没收集太多),之后用数据做了个线性回归,没想到竟然过了。
(鉴于不断有人私信问回归怎么做的,博主在这说一下思路。2017.2.21)
回归算法的缺点大家都知道,是需要严格的假设的,我做这个之前先抽取几组数据做 时间-位移的折线图,发现速度轨迹其实是先快,接近目标点后开始慢的。之后博主取个巧把函数近似看成两个一元一次函数的组合,分别作回归。至于怎么分的函数,很简单,对每组数据点的 速度 做一个聚类。
后记:网上有人说要用神经网络,其实没那么邪乎,并不是什么都要往深度学习上靠,有时简单经典的算法更加实用。本文写的不是特别详细,一些关键之处都是一带而过。因为极验验证是一个非常好的产品,它把用户从无聊糟糕的字符验证码中解脱出来,创造一件精美的瓷器可能需要长年累月的时间,而摧毁它只在松手的一刹那。希望极验验证越办越好。