上一節了解了簡單驗證碼的識別,但是現在這種驗證碼非常少見,現在出現了一大批新型的驗證碼,如極驗滑動驗證碼,它需要拖動合併滑塊才能完成識別。
目標
本節目標是識別極驗滑動驗證碼,如分析思路、識別缺口、生成拖動路徑、模擬合併等。
準備
需要安裝 Python 的 selenium 庫,需要安裝 Chrome 瀏覽器並配置好驅動 ChromeDriver。請參考第一節第二節的內容。
識別
我們使用瀏覽器模擬的方式來識別驗證碼,然後我們拖動滑塊,使滑塊和圖片缺口對齊,則通過驗證。
思路
歸納一下,識別大概分為三步:
模擬點擊驗證按鈕識別圖片缺口位置拖動滑塊 第一步操作很簡單,我們可以直接使用 selenium 模擬點擊。 第二步識別缺口的位置很關鍵,需要使用到圖像處理相關的方法。我們觀察圖片,缺口的四周有明顯的斷裂痕跡,邊緣和邊緣周圍有明顯的區別。可以實現一個邊緣檢測算法來尋找缺口的位置,對於極驗滑動驗證碼來說,可以利用和原圖對比的方式來識別缺口的位置,點擊驗證按鈕,未拖動滑塊時圖片是完成的,當拖動圖片時才會顯示缺口,我們可以獲取這兩張圖片,設定一個閾值,遍歷圖片,找出兩張圖片相同位置像素 RGB 差距超過此閾值的像素點,那麼這個像素點就是缺口的位置。第三步操作看似簡單,但實際坑很多。極驗滑動驗證碼增加了機器軌跡識別、勻速移動、隨機速度移動等方式,這些方式都不能通過驗證,只有完全模擬人的移動軌跡才可以通過識別。人的移動軌跡一般時先加速後減速,我們要模擬這個過程。
初始化
這裡首先做一些初始化的配置。
模擬點擊
實現第一步操作,即模擬點擊,我們定義一個方法來獲取這個按鈕。
隨後我們調用 click()方法點擊這個按鈕即可。
識別缺口
獲取不帶缺口圖片
我們先獲取不帶缺口的位置,利用 selenium 獲取圖片元素,得到其所在位置、寬高等,然後獲取網頁的截圖,裁剪圖片。
獲取網頁截圖
獲取驗證碼圖片的位置
獲取帶缺口的圖片
首先獲取滑塊
利用 get_slider()方法獲取到滑塊對象,然後點擊 clikc()方法,缺口圖片即可呈現。
調用 get_geetest_image()方法獲取帶缺口圖片
獲取缺口
我們遍歷兩張圖片的每個坐標點,獲取到兩張圖片對應像素點的 RGB 數值。如果二者的 RGB 數值差在一定範圍內,那就代表兩個像素相同,繼續對比下一個像素,如果差距超過一定範圍,則當前位置即為缺口位置。is_pixel_equal()方法用於判斷兩張圖片同一位置的像素是否相同,get_gap()方法用於獲取缺口位置。
模擬拖動
模擬拖動過程不複雜,但坑很多,勻速移動極驗滑動會識別出他是程序的操作,因為人是無法做到勻速移動的,極驗滑動使用機器學習模型來識別是否為機器操作。 我們嘗試模擬加速減速過程來進行驗證,前段滑塊做勻加速運動,後段做勻減速運動。我們嘗試定義 get_track()方法,傳入移動總距離,返回移動軌跡
最後,我們按照移動軌跡來拖動滑塊。