爬取安居客和58的房源信息,但是在大量爬取后发现会弹手势验证码,如下图
看着其实蛮复杂的,打码平台可能会省事些,但是咱们小本生意,于是还是得走破解的路(虽然少不了建立识别轨迹模型的算法。)
第一步
找校验的URL,通过校验请求,得知校验的url: https://verifycode.58.com/captcha/checkV3
所post参数有
返回的参数有:
第二步
通过url找加密函数入口
pathGetCaptcha: "/captcha/getV3", # 这个是得到验证码的
pathVerfiyCaptcha: "/captcha/checkV3", # 这个是验证验证码的,从这个可以定位到校验函数,发现是ajax请求
明眼看到上面有个AES这个对称加密函数,大概率就是要通过它来加密data里的值,找一下确实是它进行参数加密,用的是CryptoJS加密
第三步
找齐参数,这一步涉及Debug,不要放过每个可能的点,多查看堆栈数据,多watch一些关键变量
先找找最简单的两个参数,sessionId和responseId
sessionId在网页里就有,可以直接对内容进行正则匹配出来
responseId则是通过js返回的,是请求验证码图片以及它的标识responseId
最复杂的应该就是这个d所代表的轨迹数据了
打个断点再绘画一次轨迹,得到如下参数
可以看到加密所需的四个参数 e, c , o.pj, t.xxzlfingertoken。
这个e浪费了我一些时间,起初我以为e是函数i()里的值,后面发现是传参进来的
其中526行这里不能打断点,因为一滑动轨迹就会断到,然后这个i应该是和我们滑动的轨迹有关。于是回来又看堆栈里的r数组
我个憨憨发现了其中的奥妙,这个e就是轨迹数组里的最后一个坐标 - 第一个坐标的值,而且这个轨迹图永远都是向右滑,这样保证最后一个坐标点的X值永远大于第一个坐标的X值,也就是这个e参数永远是正值,这个可以做个校验滑动方向。
继续找接下来的参数,其中c为轨迹图,因为稍微懂点英文都能猜到,c应该是由r转换得到的字符串,而r列表里面的p应该就是各个point以及t停留时间。
o.pj好像一直都是[0,0]
最后一个参数 t.xxzlfingertoken 在js文件里只有这个e.token是最像我们要找的
这个function(e)里的e参数就触及我的知识盲区了,这个也不知道这个函数入口在哪,e里面就两个值status和token,确实找不到了,于是就拿token的值来直接搜索。
找到就是一个请求的返回值,而且对应了status和token,正好可以直接来用
然后就要找这个callback所传的参数,这个是加密的请求
_0x477bx1c这个值也能找到,接下来看看堆栈里的数据是啥
将上述的值在_0xe871里找到对应关系
var _0x477bx1c = ("dpjsonp_" + Math["random"]())["replace"](".", "");
这里也就是这个callback需要传的参数,只不过是通过math.random()随机数然后移除 .
通过这个可以拿到token的值。
至此所有参数已经就位,剩下就是写代码了。
代码我也没写完,建立手势模型识别率还是太低了,目前还没有开源这份代码的打算。
本文仅做技术交流,不涉及源代码,请勿用于非法用途。