欢迎光临散文网 会员登陆 & 注册

【原创】Python 网易易盾滑块验证

2022-05-11 02:25 作者:拉灯的小手  | 我要投稿

本文仅供学习交流使用,如侵立删!

记一次 网易易盾滑块验证分析并通过

操作环境

  • win10 、 mac

  • Python3.9

  • selenium、PIL、numpy、scipy、matplotlib

分析

网易易盾滑块验证,就长下面这个样子

具体验证原理有兴趣的可自行查询官方文档:网易易盾开发文档

话不多少,借助之前写阿里云盾滑块和极验滑块的经验,直接上代码,详细可参考:阿里云盾滑块验证(https://cenjy.blog.csdn.net/article/details/124664094)(https://cenjy.blog.csdn.net/article/details/124357598)

解决方案

使用selenium请求url,并触发滑块验证

def open(self):
   # 初始化浏览器
   wait = WebDriverWait(self.driver, 5)
    # 点击对应标签
    self.driver.get(cfg.TEST_URL)
    button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, cfg.HD_SELECOTR)))
    button.click()
    self.tc_item = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, cfg.TC_SELECOTR)))
    self.tc_item.click()

    # 得到背景和滑块的item, 以及滑动按钮
    time.sleep(2)
    self.background_item = wait.until(
        EC.presence_of_element_located((By.CSS_SELECTOR, cfg.BG_SELECOTR))
    )
    self.slider_item = wait.until(
        EC.presence_of_element_located((By.CSS_SELECTOR, cfg.HK_SELECOTR))
    )
    self.slider_btn = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, cfg.HD_BTN)))

    self.offset = cfg.offset
    self.background_path = cfg.background_path
    self.slider_path = cfg.slider_path

获取验证图片并计算滑块距离

def get_images(self):
  """
  获取验证码图片
  :return: 图片的location信息
  """
   url = selenium_item.get_attribute("src")
   if url is not None:
       response = requests.get(url)
       with open(path, "wb") as f:
           f.write(response.content)
       img = Image.open(path).resize(size)
       img.save(path)
   else:
       class_name = selenium_item.get_attribute("class")
       js_cmd = (
           'return document.getElementsByClassName("%s")[0].toDataURL("image/png");'
           % class_name
       )
       im_info = self.driver.execute_script(js_cmd)
       im_base64 = im_info.split(",")[1]
       im_bytes = base64.b64decode(im_base64)
       with open(path, "wb") as f:
           f.write(im_bytes)
       img = Image.open(path).resize(size)
       img.save(path)

def compute_gap(self, array):
  """
  计算缺口偏移
  """
  grad = np.array(array > 0)
   h, w = grad.shape
   # img_show(grad)
   rows_sum = np.sum(grad, axis=1)
   cols_sum = np.sum(grad, axis=0)
   left, top, bottom = 0, 0, h
   # get the top index
   p = np.max(rows_sum) * 0.5
   for i in range(h):
       if rows_sum[i] > p:
           top = i
           break
   for i in range(h - 1, -1, -1):
       if rows_sum[i] > p:
           bottom = i
           break
   p = np.max(cols_sum) * 0.5
   for i in range(w):
       if cols_sum[i] > p:
           left = i
           break
   return top, bottom + 1, left

生成滑动轨迹

def get_tracks(distance):
   v = random.randint(0, 2)
   t = 1
   tracks = []
   cur = 0
   mid = distance * 0.8
   while cur < distance:
       if cur < mid:
           a = random.randint(2, 4)
       else:
           a = -random.randint(3, 5)
       s = v * t + 0.5 * a * t ** 2
       cur += s
       v = v + a * t
       tracks.append(round(s))
   tracks.append(distance - sum(tracks))
   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/85343666

本文仅供学习交流使用,如侵立删!


【原创】Python 网易易盾滑块验证的评论 (共 条)

分享到微博请遵守国家法律