【分享】Python 多缺口滑块验证demo

简介: 【分享】Python 多缺口滑块验证demo
本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!

多缺口滑块验证demo

环境

  • win10
  • Python3.9

分享一下项目中碰到的一个多缺口滑块验证,先触发一下滑块抓包分析一下是用的哪一家滑块经过分析发现不是用的顶象或数美,验证图片的接口地址是他自己的的一个接口,应该是自己写的验证,往有经验的大佬指点下。抓到滑块图片地址,是经过加密的,通过canvas绘画至页面,始终没有找到真实的url,用最笨的方法直接在页面截图

   defget_v3(self):

       # 新开一个窗口,通过执行js来新开一个窗口(有奇效,可以不被检测到)

       js='window.open("https://www.vivo.com.cn/service/mobilePhoneAuthenticityCheck/query");'

       self.driver.execute_script(js)

       # 切换窗口

       self.driver.switch_to.window(self.driver.window_handles[1])

       IMEI="862056063123458"

       # 定位输入框

       phone_IMEI=self.wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="phone_IMEI"]')))

       phone_IMEI.send_keys(IMEI)

       # 勾选复选框

       self.wait.until(EC.presence_of_element_located((By.XPATH, '/html/body/main/div[2]/div/p/span'))).click()

       # 点击立即查询

       self.wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="query_IMEI"]'))).click()

       # 定位滑块图片

       # 必须先遍历一遍页面所有元素,否则找不到新弹出的滑块元素

       self.web_driver_wait_ruishu(10, "class", 'dx_captcha dx_captcha_loading-style-popup dx_captcha_basic dx_captcha-type-basic dx_captcha_basic-style-popup')

       print("定位到滑块弹窗")

       dx_captcha=self.wait.until(EC.presence_of_all_elements_located((By.XPATH, '/html/body/div/div/div[2]/div[2]/div[1]/div[2]/div[2]')))

       print(len(dx_captcha))

       iflen(dx_captcha) >1:

           dx_captcha=dx_captcha[-1]

       else:

           dx_captcha=dx_captcha[0]

       # 截图

       dx_captcha.screenshot(self.bgImg_path)

剩下的就是识别缺口距离了,并生成移动轨迹

@staticmethod

   defclear_white(img):

       """清除图片的空白区域,这里主要清除滑块的空白"""

       img=cv2.imread(img)

       rows, cols, channel=img.shape

       min_x=255

       min_y=255

       max_x=0

       max_y=0

       forxinrange(1, rows):

           foryinrange(1, cols):

               t=set(img[x, y])

               iflen(t) >=2:

                   ifx<=min_x:

                       min_x=x

                   elifx>=max_x:

                       max_x=x

                   ify<=min_y:

                       min_y=y

                   elify>=max_y:

                       max_y=y

       img1=img[min_x:max_x, min_y: max_y]

       returnimg1

   @staticmethod

   deftemplate_match(tpl, target):

       th, tw=tpl.shape[:2]

       result=cv2.matchTemplate(target, tpl, cv2.TM_CCOEFF_NORMED)

       min_val, max_val, min_loc, max_loc=cv2.minMaxLoc(result)

       tl=max_loc

       br= (tl[0] +tw, tl[1] +th)

       cv2.rectangle(target, tl, br, (0, 0, 255), 2)

       returntl[0], tl[1]

   defcalculate_distance(self, pic1_path, pic2_path):

       """

       计算滑块到缺口的距离

       """

       img1=self.clear_white(pic1_path)

       img1=cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY)

       slide=cv2.Canny(img1, 100, 200)

       img2=cv2.imread(pic2_path, 0)

       back=cv2.Canny(img2, 100, 200)

       slide_pic=cv2.cvtColor(slide, cv2.COLOR_GRAY2RGB)

       back_pic=cv2.cvtColor(back, cv2.COLOR_GRAY2RGB)

       # 滑块在图片上的位置

       x, y=self.template_match(slide_pic, back_pic)

       # 滑块到缺口的距离

       dis_x=int((x+5) * (340/552))

       dis_y=int(y* (340/552))

       returndis_x, dis_y

   defget_tracks(self, distance, _y):

       """

       获取轨迹参数

       """

       tracks=list()

       y, v, t, current=0, 0, 1, 0

       mid=distance*3/4

       exceed=random.randint(40, 90)

       z=random.randint(30, 150)

       whilecurrent< (distance+exceed):

           ifcurrent<mid/2:

               a=2

           elifcurrent<mid:

               a=3

           else:

               a=-3

           a/=2

           v0=v

           s=v0*t+0.5*a* (t*t)

           current+=int(s)

           v=v0+a*t

           y+=random.randint(-3, 3)

           z=z+random.randint(5, 10)

           tracks.append([min(current, (distance+exceed)), y, z])

       whileexceed>0:

           exceed-=random.randint(0, 5)

           y+=random.randint(-3, 3)

           z=z+random.randint(5, 9)

           tracks.append([min(current, (distance+exceed)), y, z])

       tr= []

       fori, xinenumerate(tracks):

           tr.append({

               'x': x[0],

               'y': _y,

               'relative_time': x[2]

           })

       returntr

效果


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


相关文章
|
7月前
|
Python
python3之flask快速入门教程Demo
python3之flask快速入门教程Demo
90 6
|
3月前
|
JSON 数据格式 Python
Python编程:利用JSON模块编程验证用户
Python编程:利用JSON模块编程验证用户
31 1
|
3月前
|
安全 网络安全 数据安全/隐私保护
HTTPS 请求中的证书验证详解(Python版)
HTTPS 请求中的证书验证详解(Python版)
216 0
|
5月前
|
Python
【Leetcode刷题Python】946. 验证栈序列
LeetCode题目“946. 验证栈序列”的Python解决方案,通过模拟栈的压入和弹出操作来验证给定的两个序列是否能通过合法的栈操作得到。
37 6
|
8月前
|
存储 Java C#
使用Python实现简易的用户登录验证功能
这篇文章将向你展示如何使用Python语言进行程序设计,实现一个简易的用户登录验证功能。 该功能允许用户输入由字母和数字任意组合而成的用户名和密码,并通过while循环不断地提示用户输入,直到凭证正确为止。所有凭证信息将被存储在一个字典中,以便进行匹配验证。
|
7月前
|
存储 算法 数据可视化
python多种算法对比图解实现 验证二叉树搜索树【力扣98】
python多种算法对比图解实现 验证二叉树搜索树【力扣98】
|
7月前
|
存储 算法 Java
【经典算法】LeetCode 125. 验证回文串(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 125. 验证回文串(Java/C/Python3实现含注释说明,Easy)
41 0
|
7月前
|
数据安全/隐私保护 Python
【Python 训练营】N_1 验证密码
【Python 训练营】N_1 验证密码
26 0
|
8月前
|
机器学习/深度学习 数据采集 前端开发
【Python机器学习专栏】模型泛化能力与交叉验证
【4月更文挑战第30天】本文探讨了机器学习中模型泛化能力的重要性,它是衡量模型对未知数据预测能力的关键。过拟合和欠拟合影响泛化能力,而交叉验证是评估和提升泛化能力的有效工具。通过K折交叉验证等方法,可以发现并优化模型,如调整参数、选择合适模型、数据预处理、特征选择和集成学习。Python中可利用scikit-learn的cross_val_score函数进行交叉验证。
519 0
|
8月前
|
机器学习/深度学习 Python
【Python 机器学习专栏】模型选择中的交叉验证与网格搜索
【4月更文挑战第30天】交叉验证和网格搜索是机器学习中优化模型的关键技术。交叉验证通过划分数据集进行多次评估,如K折和留一法,确保模型性能的稳定性。网格搜索遍历预定义参数组合,寻找最佳参数设置。两者结合能全面评估模型并避免过拟合。Python中可使用`sklearn`库实现这一过程,但需注意计算成本、过拟合风险及数据适应性。理解并熟练应用这些方法能提升模型性能和泛化能力。
272 0