【分享】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

效果


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


相关文章
|
4月前
|
网络协议 网络安全 数据库
python验证公网ip与内网ip
python验证公网ip与内网ip
59 0
|
3月前
|
Python
python3之flask快速入门教程Demo
python3之flask快速入门教程Demo
53 6
|
25天前
|
算法 Ubuntu 机器人
DRAKE - 基于模型的机器人设计与验证 由丰田研究所支持的 C++ / Python 工具箱。
DRAKE - 基于模型的机器人设计与验证 由丰田研究所支持的 C++ / Python 工具箱。
36 1
|
1月前
|
Python
【Leetcode刷题Python】946. 验证栈序列
LeetCode题目“946. 验证栈序列”的Python解决方案,通过模拟栈的压入和弹出操作来验证给定的两个序列是否能通过合法的栈操作得到。
20 6
|
4月前
|
存储 Java C#
使用Python实现简易的用户登录验证功能
这篇文章将向你展示如何使用Python语言进行程序设计,实现一个简易的用户登录验证功能。 该功能允许用户输入由字母和数字任意组合而成的用户名和密码,并通过while循环不断地提示用户输入,直到凭证正确为止。所有凭证信息将被存储在一个字典中,以便进行匹配验证。
|
3月前
|
存储 算法 数据可视化
python多种算法对比图解实现 验证二叉树搜索树【力扣98】
python多种算法对比图解实现 验证二叉树搜索树【力扣98】
|
3月前
|
存储 算法 Java
【经典算法】LeetCode 125. 验证回文串(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 125. 验证回文串(Java/C/Python3实现含注释说明,Easy)
16 0
|
3月前
|
数据安全/隐私保护 Python
【Python 训练营】N_1 验证密码
【Python 训练营】N_1 验证密码
19 0
|
4月前
|
Python
Python 循环使用demo
【4月更文挑战第3天】在Python中,主要的循环结构有for和while。示例包括:使用for循环打印列表[1, 2, 3, 4, 5],以及使用while循环计算1到10的和。`for i in [1, 2, 3, 4, 5]: print(i)`,以及`while count <= 10: sum += count; count += 1; print(sum)`。
27 2
|
4月前
|
Python
Python 多线程运用 demo
这是一个Python多线程示例,创建了两个线程`t1`和`t2`分别执行`print_numbers`(打印0-9)和`print_letters`(打印&#39;a&#39;-&#39;j&#39;)函数。通过`start()`启动线程,`join()`确保线程执行完毕后输出&quot;程序结束&quot;。
20 2
下一篇
DDNS