**## 记一次 极验滑块验证剖析并通过### 操作环境- win10 、 mac- Python3.9- selenium、seleniumwire### 剖析最近在做的一个我的项目登录时会触发一个滑块验证,就长上面这个样子能够很显著的看进去是极验3代验证,借助之前写阿里云盾的教训应用selenium+pyautoui先测试一下,具体可参考:阿里云盾滑块验证间接提醒被怪物吃掉了!!!还是先来钻研一下官网文档看一下验证的业务逻辑:极验验证接入文档本认为是检测到了selenium,手动测试了一下发现是能够滑过的,那就是阐明应该是滑动的轨迹触发了风控。剖析了一波效验规定及原理,搞明确原理就好办了## 解决方案#### 应用selenium申请url,并触发滑块验证`
pythondef 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()`
#### 获取验证图片并计算滑块间隔`
pythondef 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, fullgbdef 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_imdef 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`
#### 生成滑动轨迹`
pythondef 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`
#### 滑动模块`
pythondef 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****