破解滑块(极验)验证码思路
破解核心思路:
1、如何確定滑塊滑動(dòng)的距離?
滑塊滑動(dòng)的距離,需要檢測(cè)驗(yàn)證碼圖片的缺口位置
滑動(dòng)距離 = 終點(diǎn)坐標(biāo) - 起點(diǎn)坐標(biāo)
然后問題轉(zhuǎn)化為我們需要屏幕截圖,根據(jù)selenium中的position方法并進(jìn)行一些坐標(biāo)計(jì)算,獲取我們需要的位置
2、坐標(biāo)我們?nèi)绾潍@???
起點(diǎn)坐標(biāo):
每次運(yùn)行程序,位置固定不變,滑塊左邊界離驗(yàn)證碼圖片左邊界有6px的距離
終點(diǎn)坐標(biāo):
每次運(yùn)行程序,位置會(huì)變,我們需要計(jì)算每次缺口的位置
怎么計(jì)算終點(diǎn)也就是缺口的位置?
先舉個(gè)例子,比如我下面兩個(gè)圖片都是120*60的圖片,一個(gè)是純色的圖片,一個(gè)是有一個(gè)藍(lán)色線條的圖片(藍(lán)色線條位置我事先設(shè)定的是60px位置),我現(xiàn)在讓你通過程序確定藍(lán)色線條的位置,你怎么確定?
答案:
遍歷所有像素點(diǎn)色值,找出色值不一樣的點(diǎn)的位置來確定藍(lán)色線條的位置
這句話該怎么理解?大家點(diǎn)開我下面的圖片,是不是發(fā)現(xiàn)圖片都是由一個(gè)一個(gè)像素點(diǎn)組成的,120*60的圖片,對(duì)應(yīng)的像素就是橫軸有120個(gè)像素點(diǎn),縱軸有60個(gè)像素點(diǎn),我們需要遍歷兩個(gè)圖片的坐標(biāo)并對(duì)比色值,從(0,0)(0,1)......一直到(120,60),開始對(duì)比兩個(gè)圖片的色值,遇到色值不一樣的,我們r(jià)eturn返回該位置即可
下面是簡(jiǎn)單代碼演示,獲取缺口位置為60,跟我預(yù)先設(shè)定的位置一樣,后面會(huì)詳細(xì)介紹該方法如何操作
而我們目標(biāo)網(wǎng)站的驗(yàn)證碼圖片也是類似,這是我截圖的,一個(gè)是沒有缺口的驗(yàn)證碼,一個(gè)是有缺口的驗(yàn)證碼,我們同樣需要遍歷,但是注意一點(diǎn)的是,我們這次遍歷不是從圖片(0,0)開始遍歷,而是需要從滑塊的右側(cè)邊緣開始遍歷
接下來開始上代碼,用selenium模擬登陸,輸入用戶名和密碼,這些我就不再截圖代碼了,想必大家應(yīng)該都會(huì)的,本文會(huì)分享完整源碼給大家,當(dāng)然代碼也存在一些缺陷,希望大家在測(cè)試過程中能改進(jìn)指正,具體的很多問題,仍然需要大家自己去運(yùn)行,去體會(huì),才行發(fā)現(xiàn)問題
1、獲取驗(yàn)證碼位置坐標(biāo),尺寸大小
驗(yàn)證碼需要截圖,大概手寫了一些計(jì)算過程,最后需要的驗(yàn)證碼位置是上下左右的一個(gè)區(qū)域,我們從屏幕上根據(jù)這個(gè)區(qū)域進(jìn)行截圖
代碼在運(yùn)行中,發(fā)現(xiàn)計(jì)算的區(qū)域和實(shí)際截圖有出入,我根據(jù)數(shù)據(jù),多次測(cè)試運(yùn)行,發(fā)現(xiàn)截圖區(qū)域設(shè)定為(558,215,816,374)相對(duì)合適,可以截到驗(yàn)證碼,這里是程序的問題之一,大家有興趣可以測(cè)試,看該地方如何優(yōu)化
這一步是返回缺口位置left
這個(gè)方法是比較色值差異
計(jì)算滑動(dòng)距離=119 - 邊緣空隙6 = 113
做到這一步,我們得出了需要滑動(dòng)113px,然后我們的滑動(dòng),需要滿足物理學(xué)規(guī)律,即先加速,后減速的過程,因?yàn)槿说膶?shí)際操作也是這樣的,剛開始先加速,到后面開始減速
我設(shè)定的減速位置為mid,也就是滑動(dòng)到五分之四的位置時(shí)候,速度開始降下來
中間定義了一個(gè)加速度a,當(dāng)沒有到4/5距離時(shí)候,加速度為1,當(dāng)滑動(dòng)最后1/5距離時(shí),加速度變?yōu)?2,該代碼參考崔大神的方法,根據(jù)數(shù)學(xué)公式,計(jì)算得出滑動(dòng)軌跡,就相對(duì)模擬了一種相對(duì)真實(shí)的人的滑動(dòng)過程
def get_track(self, distance):
"""
根據(jù)偏移量獲取移動(dòng)軌跡
:param distance: 偏移量
:return: 移動(dòng)軌跡
"""
track = []
# 當(dāng)前位移
current = 0
mid = distance * 4 / 5
# 計(jì)算間隔
t = 0.2
# 初速度
v = 0
while current < distance:
if current < mid:
# 加速度為正1
a = 1
else:
# 加速度為負(fù)2
a = -2
# 初速度v0
v0 = v
# 當(dāng)前速度v = v0 + at
v = v0 + a * t
# 移動(dòng)距離x = v0t + 1/2 * a * t^2
move = v0 * t + 1 / 2 * a * t * t
# 當(dāng)前位移
current += move
# 加入軌跡
track.append(round(move))
return track
這是計(jì)算得出的滑動(dòng)軌跡
另外注意,如果拖動(dòng)過程發(fā)現(xiàn)拖得不夠,就設(shè)置為-10或者-11,讓軌跡多走點(diǎn),如果發(fā)現(xiàn)拖得過了,就設(shè)置為-12,-13,讓軌跡少走點(diǎn),多嘗試
總結(jié):
本文主要分享破解思路,遇到bug解決方式,最后能調(diào)參數(shù)破解成功,讀懂本文的意思是目的,需要大家動(dòng)手去體會(huì)其中的一些關(guān)鍵思路
總結(jié)
以上是生活随笔為你收集整理的破解滑块(极验)验证码思路的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样下载富彩票?
- 下一篇: 电脑老是弹出广告电脑老是弹出广告和游戏怎