相关文章推荐
卖萌的水桶  ·  丈夫徐明死后,田海蓉放弃百亿遗产救实德,成威 ...·  1 月前    · 
眉毛粗的豆浆  ·  1990—2021年中国育龄女性牙周病疾病负 ...·  4 月前    · 
傲视众生的小狗  ·  江永12345政务服务热线:聆听民情 ...·  1 年前    · 
有腹肌的卡布奇诺  ·  基于Clickhouse秒级查询6亿用户画像 ...·  1 年前    · 
另类的牛肉面  ·  使用递归查找一个数字是否是2的幂·  1 年前    · 
Code  ›  【原创】Python 极验滑块验证开发者社区
python 软件 base64 极验验证
https://cloud.tencent.com/developer/article/1997124?from=15425&areaSource=102001.10&traceId=ZBYZnQIuU_PISUvR2l-fD
聪明的冰棍
2 年前
作者头像
拉灯的小手
0 篇文章

【原创】Python 极验滑块验证

原创
前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 用户6838338的专栏 > 【原创】Python 极验滑块验证

【原创】Python 极验滑块验证

原创
作者头像
拉灯的小手
发布 于 2022-05-09 15:09:40
801 0
发布 于 2022-05-09 15:09:40
举报

​

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

​


记一次 极验滑块验证分析并通过

操作环境

  • 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()
 
推荐文章
卖萌的水桶  ·  丈夫徐明死后,田海蓉放弃百亿遗产救实德,成威廉王子座上宾_新浪财经_新浪网
1 月前
眉毛粗的豆浆  ·  1990—2021年中国育龄女性牙周病疾病负担变化趋势
4 月前
傲视众生的小狗  ·  江永12345政务服务热线:聆听民情 为民解忧_县区行动_一件事一次办
1 年前
有腹肌的卡布奇诺  ·  基于Clickhouse秒级查询6亿用户画像!到底有多6?_标签
1 年前
另类的牛肉面  ·  使用递归查找一个数字是否是2的幂
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号