证码-滑块

先直接上流程(和点选的步骤基本相同):

1.请求gt/register-slide-official 这个接口,拿到网站唯一的id(gt),以及一个有效的challenge

java 滑块验证码 识别 滑块验证码js逆向_爬虫


2.和点选类型一样用gt值请求gettype.php接口

java 滑块验证码 识别 滑块验证码js逆向_爬虫_02


3.用gt和challenge参数请求验证码类型(w值置为空)

java 滑块验证码 识别 滑块验证码js逆向_验证码_03


4.获取背景图片的信息

java 滑块验证码 识别 滑块验证码js逆向_java 滑块验证码 识别_04


这个链接下载到本地的背景图片是乱序的,需要将它还原

java 滑块验证码 识别 滑块验证码js逆向_python_05


5.还原图片:

很明显,该图片是使用canvas画出来的,所以打上canvas断点,将canvas要被创建时的动作断下来,查看这里的还原算法

java 滑块验证码 识别 滑块验证码js逆向_java 滑块验证码 识别_06

for (var a = r / 2, _ = 0; _ < 52; _ += 1) {
     var c = Ut[_] % 26 * 12 + 1 
       , u = 25 < Ut[_] ? a : 0  // c,u这两个变量的含义分别是第Ut[_]个乱图中的
       							//小图块的左上角的x,y的像素位置
       , l = o[$_CJET(69)](c, u, 10, a);  //将小图块从[c,u]坐标开始从乱图中(宽度为10,高度
       									//为a(这里a=80))扣下来
     s[$_CJET(66)](l, _ % 26 * 10, 25 < _ ? a : 0); //将扣下来的小图块,按从左到右,由上到下的
 }													//顺序拼接生成一个新的图片

从上面的for循环代码中不难看出,逻辑是将乱图分为上下26份小图,由乱图的26份的10×80小图片拼接成是260×160的图片,并且经过多次调试得到Ut值为固定的:

java 滑块验证码 识别 滑块验证码js逆向_爬虫_07


值得注意的是乱图中的宽度为312,312/26=12,按道理说每个小图片的长高应该为12x80才对,而实际上却是每个小图片去除了两个像素的,所以计算的时候用的10x80

java 滑块验证码 识别 滑块验证码js逆向_java 滑块验证码 识别_08

由上分析,即可用Python代码还原这一部分逻辑,具体的Python代码本小菜鸟就不展示了,直接上结果

java 滑块验证码 识别 滑块验证码js逆向_java 滑块验证码 识别_09


java 滑块验证码 识别 滑块验证码js逆向_python_10


好了,图片的还原就写到这里了,谢谢大家!