【原創(chuàng)】Python 極驗滑塊驗證
?本文僅供學習交流使用,如侵立刪!
記一次 極驗滑塊驗證分析并通過
操作環(huán)境
win10 、 mac
Python3.9
selenium、seleniumwire
分析
最近在做的一個項目登錄時會觸發(fā)一個滑塊驗證,就長下面這個樣子

可以很明顯的看出來是極驗3代驗證,借助之前寫阿里云盾的經(jīng)驗使用selenium+pyautoui先測試一下,詳細可參考:阿里云盾滑塊驗證

直接提示被怪物吃掉了!??! 還是先來研究一下官方文檔看一下驗證的業(yè)務邏輯:極驗驗證接入文檔

本以為是檢測到了selenium,手動測試了一下發(fā)現(xiàn)是可以滑過的,那就是說明應該是滑動的軌跡觸發(fā)了風控。

分析了一波效驗規(guī)則及原理,搞明白原理就好辦了
解決方案
使用selenium請求url,并觸發(fā)滑塊驗證
def open(self):
? """
? ?登錄模塊
? ?"""
? ?# 定位密碼登錄
? ?self.driver.find_element_by_xpath('//*[@id="app"]/div/div/div/div/div/div[1]/div[2]').click()
? ?# 輸入賬號
? ?username = '123456'
? ?self.driver.find_element_by_xpath('//*[@id="app"]/div/div/div/div/div/div[2]/div[1]/form/div[1]/div/div/input').send_keys(username)
? ?time.sleep(1)
? ?# 輸入密碼
? ?password = '123456789'
? ?self.driver.find_element_by_xpath('//*[@id="app"]/div/div/div/div/div/div[2]/div[1]/form/div[2]/div/div/input').send_keys(password)
? ?time.sleep(1)
? ?# 登錄
? ?self.driver.find_element_by_xpath('//*[@id="app"]/div/div/div/div/div/div[2]/div[3]/button').click()
獲取驗證圖片并計算滑塊距離
def get_images(self):
? """
? 獲取驗證碼圖片
? :return: 圖片的location信息
? """
? # 帶缺口圖片,使用js定位并讀取圖片的data信息 data:image/png;base64,直接調(diào)用識別缺口
? fullgb = self.driver.execute_script('return document.getElementsByClassName("geetest_canvas_bg geetest_absolute")[0].toDataURL("image/png")')
? # 完整圖片,使用js定位并讀取圖片的data信息 data:image/png;base64,直接調(diào)用識別缺口
? bg = self.driver.execute_script('return document.getElementsByClassName("geetest_canvas_fullbg geetest_fade geetest_absolute")[0].toDataURL("image/png")')
? return bg, fullgb
def get_decode_image(self, location_list):
? """
? 解碼圖片的base64數(shù)據(jù)
? """
? # 提取圖片base64數(shù)據(jù)
? _, img = location_list.split(",")
? # 數(shù)據(jù)轉(zhuǎn)換為Bytes字節(jié)
? img = base64.decodebytes(img.encode())
? # 讀取圖片
? new_im: PngImagePlugin.PngImageFile = image.open(BytesIO(img))
? # new_im.convert("RGB")
? # new_im.save(filename)
? return new_im
def compute_gap(self, img1, img2):
? """
? 計算缺口偏移 這種方式成功率很高
? """
? # 將圖片修改為RGB模式
? img1 = img1.convert("RGB")
? img2 = img2.convert("RGB")
? # 計算差值
? diff = ImageChops.difference(img1, img2)
? # 灰度圖
? diff = diff.convert("L")
? # 二值化
? diff = diff.point(self.table, '1')
? left = 43
? for w in range(left, diff.size[0]):
? ? ? lis = []
? ? ? for h in range(diff.size[1]):
? ? ? ? ? if diff.load()[w, h] == 1:
? ? ? ? ? ? ? lis.append(w)
? ? ? ? ? if len(lis) > 5:
? ? ? ? ? ? ? return w
生成滑動軌跡
def get_tracks(self, distance, seconds, ease_func):
? ?"""
? ?:param distance: 缺口位置
? ?:param seconds: ?時間
? ?:param ease_func: 生成函數(shù)
? ?:return: 軌跡數(shù)組
? ?"""
? ?tracks = [0]
? ?offsets = [0]
? ?for t in np.arange(0.0, seconds, 0.1):
? ? ? ?ease = ease_func
? ? ? ?offset = round(ease(t / seconds) * distance)
? ? ? ?tracks.append(offset - offsets[-1])
? ? ? ?offsets.append(offset)
? ?return tracks
滑動模塊
def move_to_gap(self, track):
? ? """滑動滑塊"""
? ? print('第一步,點擊滑動按鈕')
? ? slider = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_slider_button')))
? ? ActionChains(self.driver).click_and_hold(slider).perform()
? ? time.sleep(1)
? ? print('第二步,拖動元素')
? ? for track in track:
? ? ? ? ActionChains(self.driver).move_by_offset(xoffset=track, yoffset=0).perform() ?# 鼠標移動到距離當前位置(x,y)
? ? ? ? time.sleep(0.0001)

完美解決
資源下載
https://download.csdn.net/download/qq_38154948/85328666
本文僅供學習交流使用,如侵立刪!