1. 程式人生 > 其它 >【原創】Python 極驗滑塊驗證

【原創】Python 極驗滑塊驗證

本文僅供學習交流使用,如侵立刪!

記一次 極驗滑塊驗證分析並通過

操作環境

  • 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


本文僅供學習交流使用,如侵立刪!