【原創】Python 極驗滑塊驗證
阿新 • • 發佈:2022-05-09
本文僅供學習交流使用,如侵立刪! |
記一次 極驗滑塊驗證分析並通過
操作環境
- win10 、 mac
- Python3.9
- selenium、seleniumwire
分析
最近在做的一個專案登入時會觸發一個滑塊驗證,就長下面這個樣子
可以很明顯的看出來是極驗3代驗證,藉助之前寫阿里雲盾的經驗使用selenium+pyautoui先測試一下,詳細可參考:阿里雲盾滑塊驗證
直接提示被怪物吃掉了!!!
還是先來研究一下官方文件看一下驗證的業務邏輯:極驗驗證接入文件
本以為是檢測到了selenium,手動測試了一下發現是可以滑過的,那就是說明應該是滑動的軌跡觸發了風控。
分析了一波效驗規則及原理,搞明白原理就好辦了
解決方案
使用selenium請求url,並觸發滑塊驗證
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,直接呼叫識別缺口 fullgb = self.driver.execute_script('return document.getElementsByClassName("geetest_canvas_bg geetest_absolute")[0].toDataURL("image/png")') # 完整圖片,使用js定位並讀取圖片的data資訊 data:image/png;base64,直接呼叫識別缺口 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資料 """ # 提取圖片base64資料 _, img = location_list.split(",") # 資料轉換為Bytes位元組 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: 生成函式
:return: 軌跡陣列
"""
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
本文僅供學習交流使用,如侵立刪! |