极验验证码行为模拟(成功率90%以上)

时间:2024-04-05 13:11:45

这期我来玩一点黑科技的东西

最近有同事在搞爬虫时碰到了极验的第二代拖动式验证码,让我帮忙给研究一下。

于是乎我从极验官网下了demo在看。又通过网上其他同学的思路,大概研究出来了。

本人声明:我只是出于技术的爱好去研究了一下,请勿用来做一些非法勾当。

工具

项目是用的python去做的
用到了python的一些库:
PIL(做一些验证码图片的处理、如图片还原、对比缺口)
selenium(模拟浏览器)
phantomjs(浏览器内核,测试时我用的chrome驱动,正式使用时我会替换成phantomjs)

思路

这里参考网上其他同学的思想,(假设你已经了解了极验拖动验证码的一些规则):
1. 找到验证码的图片,将乱序的验证码还原
2. 对比bg和fullbg两张图片,找到缺口位置
3. 用selenium模拟人的行为拖动滑块
4. 验证结果
以上思路中1和2网上都能找到很多例子,难的就是如何写一个拖动轨迹的算法,让浏览器模拟人的行为并且让极验服务器那边大概率地判定为是人操作的。
这里其他同学有不同的做法:
1.用人去拖动滑块,录制轨迹,然后用通过的轨迹去回放
2.有一些****比较厉害的人反编译geetest.js,毕竟前端加密还是比较弱的,**js里的算法然后伪造数据
因为我比较笨,实在是不知道怎么反混淆js。就想着纯算法模拟。
以下我就着重介绍一下第三步

分析

打开带有极验验证码页,F12大法好。可以获得以下信息:
验证码图片宽度300px
滑块宽度55px
轨迹长度220px
理论上阴影可以出现的范围是 300-55*2=190px 两边再加15px 也就是220px(这里是我猜测的)
最小的开始距离应该是55px-15px=40px(从来没有出现过,测试时最小的一次是46px)
最大的距离应该是190px+15px=205px(也没有遇到过,测试时最大的一次是196px)

我的做法是在获取到缺口距离x后,随机出若干个从0到x之间的随机数,
然后把这些随机数当成滑动轨迹里的点,
然后依次模拟拖动鼠标到这些点上,
中间停顿若干时间,
尽量模拟人的行为去考虑拖动的算法。

说出来你们可能不信,我像踩了*运一样,
第一次根据上面的规则写出来的算法,测试100次
通过91次,因为缺口距离计算错误 gt_fail 1次,验证码被吃gt_forbidden 8次
然后我就在沾沾自喜,卧槽,我太特么天才了
当我准备把测试数据放到10000次的时候,
发现当通过了300多次以后,后面一直都是gt_forbidden,
卧槽?极验真的有大数据去分析,自动修正,自动防御功能?真牛逼
后来我怀疑是IP的问题,切换完IP后还是经常gt_forbidden
这时我不得不重新思考了

我开始记录那些随机数,当成我的轨迹数据,
在我通过一系列修改,碰到缺口相差不多的时候,用曾经通过的那些轨迹数据,去回放。
然后发现了一个惊喜的效果,有的随机数轨迹能跑通过30多次还生效,我靠,这就够用了
通过这样的行为,能够把通过率从50%拉回到80%多

于是一个牛逼哄哄的想法从脑海里蹦出
极验不是有机器学习,大数据去做支撑,深度神经网络系统,能主动绘制模型分析用户行为么?
那我也建一个轨迹的大数据库,去分析这些轨迹,去试错,去调优,去修改权重,测试轨迹的可靠性
用这些数据去练练极验的机器学习,也提升我的轨迹数据的可靠性。
想想就有点小激动
虽然不是机器学习,但是这种想法是很靠谱的

测试结果

先上一张我通过的轨迹缺口距离的一些大概分布图:
这里是缺口距离46到110里的数据
极验验证码行为模拟(成功率90%以上)
这里是缺口距离111到196的数据
极验验证码行为模拟(成功率90%以上)

这里的数据是我通过的数据库记录的关于缺口距离的分布图
虽然不知道这些数据有什么用,但是看着很过瘾
极验验证码行为模拟(成功率90%以上)
这里是采集的一些数据在mysql里的截图

代码

因为是给别人做的一些研究,为了一些责任,源代码就不上了。
只要思路对,写出来的肯定能成功率90%以上
再次声明:本人只是单纯的对于技术的喜好去研究,切勿从事非法行为。