下圖爲京東驗證碼:
和其他驗證碼一樣,圖片分爲兩部分,一部分爲缺口,一部分爲背景,將缺口移動到背景上對應部分即可。
我們首先來獲取圖片:
請求並不複雜,appid可請求首頁取到或直接寫死,校驗得e並不影響登錄及圖片校驗,可隨機生成或直接寫死。
我們再來看看返回值:
很明顯,bg和patch分別對應滑塊和背景圖片:
可以看到滑塊爲png格式,但是圖片大小僅僅只有滑塊那麼大,也就是說返回值裏面肯定有來確定滑塊Y軸方向的參數。
也就是y:37這個參數估計是表示滑塊Y軸的位置。
我們可以用ps打開背景圖片定位一下y=37的位置,發現正好是滑塊的頂部。
所以這裏我們只需對圖片二值化後,定位小圖在大圖中的三個角座標值都是黑色即可找出陰影x的位置了:
接下來我們看看滑動後的請求:
參數也不復雜,c和s可以請求首頁取到,關鍵就剩下一個d,明顯是加密過的,而且絕對是和軌跡相關。
那我們就追溯一下這個d:
這樣就找到了軌跡加密方法了,我們可以看到傳入是一個array,返回則是加密後的字符串。
現在就只需構造軌跡array即可。
我們先看看array是長什麼樣子的:
一看結構,肯定就是x,y座標+當前時間戳組成。
多試幾次就能發現,第一行是表示驗證碼在當前窗口的位置。
所以我們只需要模擬第一行之後的即可。
生成軌跡的方法網上也有很多了,這裏隨便寫一個:
加密方法解決還是參考之前提到過的,直接調用js的方法,然後將我們構造的軌跡數組傳入,即可得到參數d了。
這樣就可得到驗證成功返回值了:
jsonp_012041562394977534({"message":"success","nextVerify":"NULL_VERIFY","success":"1","validate":"d0ca79997123423886a84852f5837f44"})
本文參考:https://blog.csdn.net/qq_21189053/article/details/84775194
非常感謝該作者