滑動驗證碼怎麼解決,請滑動驗證碼完成安全驗證
2023-04-02 05:52:35
很多朋友反饋,在web自動化的過程中,經常被登錄的驗證碼卡住,不知道驗證碼怎麼過。今天,我想和你談談驗證碼。一般情況下可以找開發商幫忙解決,關閉驗證碼,或者給個通用驗證碼!那麼如果開發沒有幫助,我們有什麼辦法處理這些驗證碼呢?當然,答案是肯定的。常見的驗證碼一般分為兩類,一類是圖形驗證碼,一類是滑動驗證碼!
關於圖形識別的驗證碼,之前已經開發了相關的識別解決方案,今天就不多介紹了。有興趣的朋友可以私聊獲取配套視頻資料。今天主要講一下如何識別和破解滑動驗證碼。
滑動驗證和破解的思路一般是以下兩個步驟:
1.獲取滑塊的滑動距離。
2.模擬拖動滑塊,通過驗證。
聽起來很簡單,但是要得到滑塊的滑動距離,大部分朋友都沒有概念,不知道怎麼得到。其實並不難得到。關於這個滑動驗證碼,滑塊和缺口的背景是分開的圖像。我們可以下載這兩幅圖像,藉助圖像識別技術,識別出背景圖像中缺口的位置,然後減去滑塊的當前位置,得到要滑動的距離。這時候很多朋友會覺得我認不出圖像技術。沒有也沒關係。稍後我們會給你一個打包的滑塊識別模塊。只要傳入滑塊和凹口背景圖片的元素節點,就可以計算出滑塊的凹口位置。
沒有太多可以解釋的情況。我們先來看一個案例(QQ空間登錄)。這裡我用過一個滑動距離識別模塊,slideVerfication,自己打包的。有需要的朋友可以私聊獲取。qq空間登錄案例的實現步驟如下:
1.創建一個驅動程序對象並訪問qq登錄頁面。
2.輸入帳戶密碼。
3.單擊登錄。
4.模擬滑動驗證
實現代碼 =====================作者:檸檬類-木森時間:2020/4/0 20:12 e-郵箱:3247119728 @ qq.com公司3360湖南零度檸檬信息技術有限公司Ltd.====================== 從Selenium導入WebDriver從Citation導入slideverificationcode # 1、創建驅動程序對象,訪問qq登錄頁面browser=web driver . chromebrowser . get( https://qzone . QQ.com/)# 2、輸入帳號密碼# 2.0點擊切換到iframe browser . switch _ to . frame( log in _ frame )# 2.1點擊帳號密碼登錄browser.find _ element _ by _ id 點擊# 2.2定位帳號輸入框,輸入帳號browser.find _ element _ by _ id (U )。Send _ keys (123292678) # 2.3輸入位置密碼browser.find _ element _ by _ id (P )。Send _ keys (Python01) # 3,點擊瀏覽器。find _ element _ by _ id(登錄_按鈕)。單擊時間。睡眠(三)# 4, 模擬滑動驗證# 4.1切換到TCAPTCHA=browser . find _ element _ by _ id( TCAPTCHA _ iframe )browser . Switch _ to . frame(TCAPTCHA)# 4.2獲取滑動相關元素#選擇節點slide _ element=browser . find _ element _ by _ id( TCAPTCHA _ drag _ thumb )#節點slide block _ ele=browser . find _ element _ by _ id( slide block )# 獲取缺口背景圖片節點slide BG=browser . find _ element _ by _ id( slide BG )# 4.3計算滑動距離sc=slide verification code(save _ image=true)Distance=sc . get _ element _ slide _ Distance(slide block _ ele,slide bg) #滑動距離的誤差修正,滑動距離*圖片在網頁上顯示的縮放比例-滑塊的初始位置相對距離=distance * (280/680)-22print(修正的滑動距離),distance)# 4.4,滑動sc。 slide _ verification (browser,slide _ element,Distance=100)運行效果:這樣就解決了滑動驗證碼的識別問題。然後,我們來說說封裝的slideVerfication模塊的識別原理。其實這個模塊的圖像識別也是藉助第三方圖像處理模塊進行的。python中有很多現成的處理圖片的庫,這裡我用opencv-python進行識別。上面在slideVerfication模塊中使用的兩種方法的一些參考代碼如下:
def get _ element _ slide _ distanc
e(self, slider_ele, background_ele, correct=0): """ 根據傳入滑塊,和背景的節點,計算滑塊的距離 該方法只能計算 滑塊和背景圖都是一張完整圖片的場景, 如果背景圖是通過多張小圖拼接起來的背景圖, 該方法不適用,請使用get_image_slide_distance這個方法 :param slider_ele: 滑塊圖片的節點 :type slider_ele: WebElement :param background_ele: 背景圖的節點 :type background_ele:WebElement :param correct:滑塊缺口截圖的修正值,默認為0,調試截圖是否正確的情況下才會用 :type: int :return: 背景圖缺口位置的X軸坐標位置(缺口圖片左邊界位置) """ # 獲取驗證碼的圖片 slider_url = slider_ele.get_attribute("src") background_url = background_ele.get_attribute("src") # 下載驗證碼背景圖,滑動圖片 slider = "slider.jpg" background = "background.jpg" self.onload_save_img(slider_url, slider) self.onload_save_img(background_url, background) # 讀取進行色度圖片,轉換為numpy中的數組類型數據, slider_pic = cv2.imread(slider, 0) background_pic = cv2.imread(background, 0) # 獲取缺口圖數組的形狀 -->缺口圖的寬和高 width, height = slider_pic.shape[::-1] # 將處理之後的圖片另存 slider01 = "slider01.jpg" background_01 = "background01.jpg" cv2.imwrite(background_01, background_pic) cv2.imwrite(slider01, slider_pic) # 讀取另存的滑塊圖 slider_pic = cv2.imread(slider01) # 進行色彩轉換 slider_pic = cv2.cvtColor(slider_pic, cv2.COLOR_BGR2GRAY) # 獲取色差的絕對值 slider_pic = abs(255 - slider_pic) # 保存圖片 cv2.imwrite(slider01, slider_pic) # 讀取滑塊 slider_pic = cv2.imread(slider01) # 讀取背景圖 background_pic = cv2.imread(background_01) # 比較兩張圖的重疊區域 result = cv2.matchTemplate(slider_pic, background_pic, cv2.TM_CCOEFF_NORMED) # 獲取圖片的缺口位置 top, left = np.unravel_index(result.argmax, result.shape) # 背景圖中的圖片缺口坐標位置 print("當前滑塊的缺口位置:", (left, top, left + width, top + height)) return leftdef slide_verification(self, driver, slide_element, distance): """ 滑動滑塊進行驗證 :param driver: driver對象 :type driver:webdriver.Chrome :param slide_element: 滑塊的元組 :type slider_ele: WebElement :param distance: 滑動的距離 :type: int :return: """ # 獲取滑動前頁面的url地址 start_url = driver.current_url print("需要滑動的距離為:", distance) # 根據滑動距離生成滑動軌跡 locus = self.get_slide_locus(distance) print("生成的滑動軌跡為:{},軌跡的距離之和為{}".format(locus, distance)) # 按下滑鼠左鍵 ActionChains(driver).click_and_hold(slide_element).perform time.sleep(0.5) # 遍歷軌跡進行滑動 for loc in locus: time.sleep(0.01) ActionChains(driver).move_by_offset(loc, random.randint(-5, 5)).perform ActionChains(driver).context_click(slide_element) # 釋放滑鼠 ActionChains(driver).release(on_element=slide_element).perform
關於滑動驗證碼識別就給大家分享到這裡了,上述解決方案也有對應的講解視頻