爬取安居客和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的值。
至此所有參數已經就位,剩下就是寫代碼了。
代碼我也沒寫完,建立手勢模型識別率還是太低了,目前還沒有開源這份代碼的打算。
本文僅做技術交流,不涉及源代碼,請勿用於非法用途。