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

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

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

操作环境

  • win10 、 mac
  • Python3.9
  • selenium、PIL、numpy、scipy、matplotlib

分析

网易易盾滑块验证,就长下面这个样子
请添加图片描述
具体验证原理有兴趣的可自行查询官方文档:网易易盾开发文档

话不多少,借助之前写阿里云盾滑块和极验滑块的经验,直接上代码,详细可参考:[阿里云盾滑块验证]极验滑块验证(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


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