目錄
- 前言
- 開(kāi)發(fā)工具
- 環(huán)境搭建
- 實(shí)戰(zhàn)記錄
- 一. 驗(yàn)證碼簡(jiǎn)介
- 二.破解滑塊驗(yàn)證碼
- 2.1 計(jì)算滑塊到缺口的距離
- 2.2 將滑塊拖到缺口位置
前言
記錄一次利用Python+Selenium破解滑塊驗(yàn)證碼的實(shí)戰(zhàn)過(guò)程。
讓我們愉快地開(kāi)始吧~
開(kāi)發(fā)工具
Python版本: 3.6.4
相關(guān)模塊:
pillow模塊;
selenium模塊;
numpy模塊;
以及一些Python自帶的模塊。
其他:
chromedriver
環(huán)境搭建
安裝Python并添加到環(huán)境變量,pip安裝需要的相關(guān)模塊即可。
實(shí)戰(zhàn)記錄
本文將記錄一次春秋航空的會(huì)員注冊(cè)頁(yè)面所使用的滑塊驗(yàn)證碼破譯過(guò)程,地址為:
https://account.ch.com/NonRegistrations-Regist
一. 驗(yàn)證碼簡(jiǎn)介
驗(yàn)證碼,即CAPTCHA,全自動(dòng)區(qū)分計(jì)算機(jī)和人類的公開(kāi)圖靈測(cè)試
,換而言之,驗(yàn)證碼是一種用于區(qū)分人類與計(jì)算機(jī)的測(cè)試,只有通過(guò)了CAPTCHA,當(dāng)前用戶才被認(rèn)為是人類。
二.破解滑塊驗(yàn)證碼
滑塊驗(yàn)證碼,即用戶使用鼠標(biāo)將滑塊從某個(gè)位置拖動(dòng)到另一個(gè)位置,服務(wù)器通過(guò)用戶拖動(dòng)滑塊的軌跡來(lái)判斷當(dāng)前用戶是否為人類。本文將嘗試破解的是一種拼圖式的滑塊驗(yàn)證碼:
首先,我手動(dòng)完成了一次滑塊驗(yàn)證碼的驗(yàn)證,想看看需要向服務(wù)器端發(fā)送什么請(qǐng)求才算是通過(guò)了驗(yàn)證,隨便點(diǎn)開(kāi)了一個(gè),發(fā)現(xiàn)請(qǐng)求需要的參數(shù)是這樣的:
搞清楚每個(gè)參數(shù)當(dāng)然是可以的,簡(jiǎn)單想了一下,感覺(jué)應(yīng)該是這樣的:
首先,利用圖像處理技術(shù)計(jì)算滑塊到缺口的距離。然后,利用機(jī)器以與人類行為相似的方式將滑塊拖到缺口位置,完成驗(yàn)證。
2.1 計(jì)算滑塊到缺口的距離
首先,我們利用Selenium進(jìn)入滑塊驗(yàn)證碼界面:
也就是這個(gè)界面:
那么滑塊到缺口的距離該如何計(jì)算呢?
之前看到很多人是這么算的:
出現(xiàn)滑塊驗(yàn)證碼界面時(shí)對(duì)屏幕進(jìn)行截圖(此時(shí)背景圖是完整的),然后模擬點(diǎn)擊滑動(dòng)圓球,使滑塊和缺口出現(xiàn)(此時(shí)背景圖是有缺口的),此時(shí)再次截圖,通過(guò)對(duì)比兩次截圖即可輕松地找到缺口位置。
但是,此方案的前提是在點(diǎn)擊滑動(dòng)圓球之后才出現(xiàn)滑塊和缺口,點(diǎn)擊之前是完整的背景圖。這個(gè)方案在不久前還是可行的,但是魔高一尺道高一丈,數(shù)天前滑塊驗(yàn)證碼版本升級(jí)了?。?!滑塊驗(yàn)證碼直接顯示滑塊和缺口了?。?!也就是不給你看原圖了。
既然準(zhǔn)備用機(jī)器學(xué)習(xí),算法先不考慮,總得先有訓(xùn)練數(shù)據(jù)吧,于是我手動(dòng)刷新了幾次,想研究一下驗(yàn)證碼圖片該如何獲取,實(shí)在不行就手動(dòng)保存?zhèn)€幾百?gòu)???梢凰⑿拢l(fā)現(xiàn)了一件了不起的事情,這網(wǎng)站滑塊驗(yàn)證碼的背景圖只有四張!
根本不需要爬驗(yàn)證碼,手工標(biāo)注,然后訓(xùn)練了?;蛟S有人會(huì)問(wèn),為什么呢?
因?yàn)榫退膹埍尘皥D啊?。?!你完全可以這樣:
對(duì)當(dāng)前的滑塊驗(yàn)證碼界面進(jìn)行截圖,與對(duì)應(yīng)的完整背景圖進(jìn)行對(duì)比,找到缺口位置,即可計(jì)算出滑塊到缺口的距離了(滑塊初始位置的橫坐標(biāo)是固定的)。
上述方案有如下兩個(gè)問(wèn)題:
(1)如何獲取完整的背景圖?
答案:當(dāng)你完成滑塊驗(yàn)證碼的驗(yàn)證時(shí),還是會(huì)出現(xiàn)對(duì)應(yīng)的完整背景圖的,通過(guò)截屏軟件截下圖就好了。
結(jié)果如下:
(2)怎么找到當(dāng)前滑塊驗(yàn)證碼對(duì)應(yīng)的完整背景圖?
答案:因?yàn)橹挥兴膹垐D,沒(méi)必要用一些高大上的圖像匹配算法,看了下四張圖左上角頂點(diǎn)處的像素值,其中R值分別為:255,217,227,100,顯然,通過(guò)對(duì)比背景圖左上角頂點(diǎn)處的像素值即可找到當(dāng)前滑塊驗(yàn)證碼對(duì)應(yīng)的完整背景圖了,代碼實(shí)現(xiàn)如下:
注意,因?yàn)榻貓D是這樣子的:
所以驗(yàn)證碼背景圖左上角頂點(diǎn)處的坐標(biāo)會(huì)隨著電腦和截屏方式的改變而改變(具體而言,Selenium和我電腦上的截屏軟件截出來(lái)的圖,驗(yàn)證碼背景圖的位置坐標(biāo)是不一樣的,需要通過(guò)畫(huà)圖軟件確定具體位置)。
所以如果你無(wú)法用我的代碼完成滑塊驗(yàn)證碼破解的話,請(qǐng)自行修改(787, 282)和(787, 293)為適合你自己電腦實(shí)際情況的坐標(biāo)值。
接下來(lái),我們就可以計(jì)算滑塊到缺口的距離了!
先截取當(dāng)前滑塊驗(yàn)證碼界面,代碼實(shí)現(xiàn)如下:
這里我們把滑塊先移動(dòng)到最右端再截圖,否則滑塊將影響當(dāng)前驗(yàn)證碼界面與對(duì)應(yīng)的完整背景圖之間的像素對(duì)比(即第一次找到的像素差異較大點(diǎn)在滑塊上而不是在期望的缺口上)。
然后通過(guò)與對(duì)應(yīng)的完整背景圖進(jìn)行像素值對(duì)比,找到缺口位置,即可計(jì)算出滑塊到缺口的距離了(因?yàn)榛瑝K初始位置的橫坐標(biāo)是固定的):
2.2 將滑塊拖到缺口位置
接下來(lái),我們需要利用機(jī)器以與人類行為相似的方式將滑塊拖到缺口位置,完成驗(yàn)證。
一般而言,人手工拖動(dòng)滑塊的軌跡是這樣的:
即:先快速向右拖動(dòng),快到缺口時(shí),再減速慢調(diào)。那么這樣的軌跡該如何生成呢?
我想了兩種方案:
方案一是根據(jù)物理學(xué)中的加速度減速度來(lái)模擬拖動(dòng)滑塊的軌跡,代碼實(shí)現(xiàn)如下:
方案二是直接構(gòu)造一些函數(shù)來(lái)模擬拖動(dòng)滑塊的軌跡,函數(shù)代碼實(shí)現(xiàn)如下:
最后,使用Selenium按照設(shè)定的軌跡將滑塊移動(dòng)到缺口處即可:
文章到這里就結(jié)束了,感謝你的觀看,Python24個(gè)小游戲系列,下篇文章分享Python+Selenium破譯B站滑塊驗(yàn)證碼
到此這篇關(guān)于利用Python+Selenium破解春秋航空網(wǎng)滑塊驗(yàn)證碼的實(shí)戰(zhàn)過(guò)程的文章就介紹到這了,更多相關(guān)Python Selenium滑塊驗(yàn)證碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- 詳解Python 使用 selenium 進(jìn)行自動(dòng)化測(cè)試或者協(xié)助日常工作
- Python利用Selenium實(shí)現(xiàn)網(wǎng)站自動(dòng)簽到功能
- Selenium+Python自動(dòng)化腳本環(huán)境搭建的全過(guò)程
- python Selenium等待元素出現(xiàn)的具體方法
- Python使用Selenium自動(dòng)進(jìn)行百度搜索的實(shí)現(xiàn)
- Python中Selenium對(duì)Cookie的操作方法
- python+opencv+selenium自動(dòng)化登錄郵箱并解決滑動(dòng)驗(yàn)證的問(wèn)題
- 用Python selenium實(shí)現(xiàn)淘寶搶單機(jī)器人
- 教你用Python+selenium搭建自動(dòng)化測(cè)試環(huán)境
- Python selenium的這三種等待方式一定要會(huì)!
- Python爬蟲(chóng)實(shí)戰(zhàn)之用selenium爬取某旅游網(wǎng)站
- 教你如何使用Python selenium
- python Web應(yīng)用程序測(cè)試selenium庫(kù)使用用法詳解