
破解核心思路:
1、如何確定滑塊滑動的距離?
滑塊滑動的距離,需要檢測驗證碼圖片的缺口位置
滑動距離 = 終點坐標 - 起點坐標
然后問題轉化為我們需要屏幕截圖,根據selenium中的position方法並進行一些坐標計算,獲取我們需要的位置

2、坐標我們如何獲取?
起點坐標:
每次運行程序,位置固定不變,滑塊左邊界離驗證碼圖片左邊界有6px的距離
終點坐標:
每次運行程序,位置會變,我們需要計算每次缺口的位置
怎么計算終點也就是缺口的位置?
先舉個例子,比如我下面兩個圖片都是120*60的圖片,一個是純色的圖片,一個是有一個藍色線條的圖片(藍色線條位置我事先設定的是60px位置),我現在讓你通過程序確定藍色線條的位置,你怎么確定?



答案:
遍歷所有像素點色值,找出色值不一樣的點的位置來確定藍色線條的位置
這句話該怎么理解?大家點開我下面的圖片,是不是發現圖片都是由一個一個像素點組成的,120*60的圖片,對應的像素就是橫軸有120個像素點,縱軸有60個像素點,我們需要遍歷兩個圖片的坐標並對比色值,從(0,0)(0,1)......一直到(120,60),開始對比兩個圖片的色值,遇到色值不一樣的,我們return返回該位置即可


下面是簡單代碼演示,獲取缺口位置為60,跟我預先設定的位置一樣,后面會詳細介紹該方法如何操作


而我們目標網站的驗證碼圖片也是類似,這是我截圖的,一個是沒有缺口的驗證碼,一個是有缺口的驗證碼,我們同樣需要遍歷,但是注意一點的是,我們這次遍歷不是從圖片(0,0)開始遍歷,而是需要從滑塊的右側邊緣開始遍歷



接下來開始上代碼,用selenium模擬登陸,輸入用戶名和密碼,這些我就不再截圖代碼了,想必大家應該都會的,本文會分享完整源碼給大家,當然代碼也存在一些缺陷,希望大家在測試過程中能改進指正,具體的很多問題,仍然需要大家自己去運行,去體會,才行發現問題
1、獲取驗證碼位置坐標,尺寸大小

驗證碼需要截圖,大概手寫了一些計算過程,最后需要的驗證碼位置是上下左右的一個區域,我們從屏幕上根據這個區域進行截圖

代碼在運行中,發現計算的區域和實際截圖有出入,我根據數據,多次測試運行,發現截圖區域設定為(558,215,816,374)相對合適,可以截到驗證碼,這里是程序的問題之一,大家有興趣可以測試,看該地方如何優化

這一步是返回缺口位置left

這個方法是比較色值差異


計算滑動距離=119 - 邊緣空隙6 = 113


做到這一步,我們得出了需要滑動113px,然后我們的滑動,需要滿足物理學規律,即先加速,后減速的過程,因為人的實際操作也是這樣的,剛開始先加速,到后面開始減速
我設定的減速位置為mid,也就是滑動到五分之四的位置時候,速度開始降下來
中間定義了一個加速度a,當沒有到4/5距離時候,加速度為1,當滑動最后1/5距離時,加速度變為-2,該代碼參考崔大神的方法,根據數學公式,計算得出滑動軌跡,就相對模擬了一種相對真實的人的滑動過程
def get_track(self, distance):
"""
根據偏移量獲取移動軌跡
:param distance: 偏移量
:return: 移動軌跡
"""
track = []
# 當前位移
current = 0
mid = distance * 4 / 5
# 計算間隔
t = 0.2
# 初速度
v = 0
while current < distance:
if current < mid:
# 加速度為正1
a = 1
else:
# 加速度為負2
a = -2
# 初速度v0
v0 = v
# 當前速度v = v0 + at
v = v0 + a * t
# 移動距離x = v0t + 1/2 * a * t^2
move = v0 * t + 1 / 2 * a * t * t
# 當前位移
current += move
# 加入軌跡
track.append(round(move))
return track
這是計算得出的滑動軌跡


另外注意,如果拖動過程發現拖得不夠,就設置為-10或者-11,讓軌跡多走點,如果發現拖得過了,就設置為-12,-13,讓軌跡少走點,多嘗試

總結:
本文主要分享破解思路,遇到bug解決方式,最后能調參數破解成功,讀懂本文的意思是目的,需要大家動手去體會其中的一些關鍵思路
