首页 > 编程语言 >【分享】Python 多缺口滑块验证demo

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

时间:2022-12-08 22:02:20浏览次数:38  
标签:滑块 Python demo self cv2 captcha dx max

<table><tr><td bgcolor=orange>本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!</td></tr></table>


多缺口滑块验证demo

环境

  • win10
  • Python3.9

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

    def get_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))
        if len(dx_captcha) > 1:
            dx_captcha = dx_captcha[-1]
        else:
            dx_captcha = dx_captcha[0]
        # 截图
        dx_captcha.screenshot(self.bgImg_path)

在这里插入图片描述 剩下的就是识别缺口距离了,并生成移动轨迹

@staticmethod
    def clear_white(img):
        """清除图片的空白区域,这里主要清除滑块的空白"""
        img = cv2.imread(img)
        rows, cols, channel = img.shape
        min_x = 255
        min_y = 255
        max_x = 0
        max_y = 0
        for x in range(1, rows):
            for y in range(1, cols):
                t = set(img[x, y])
                if len(t) >= 2:
                    if x <= min_x:
                        min_x = x
                    elif x >= max_x:
                        max_x = x

                    if y <= min_y:
                        min_y = y
                    elif y >= max_y:
                        max_y = y
        img1 = img[min_x:max_x, min_y: max_y]
        return img1

    @staticmethod
    def template_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)
        return tl[0], tl[1]

    def calculate_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))
        return dis_x, dis_y

    def get_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)

        while current < (distance + exceed):
            if current < mid / 2:
                a = 2
            elif current < 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])

        while exceed > 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 = []
        for i, x in enumerate(tracks):
            tr.append({
                'x': x[0],
                'y': _y,
                'relative_time': x[2]
            })
        return tr

效果

请添加图片描述


<table><tr><td bgcolor=orange>本文仅供学习交流使用,如侵立删!</td></tr></table>


标签:滑块,Python,demo,self,cv2,captcha,dx,max
From: https://blog.51cto.com/u_14262285/5923521

相关文章

  • PYTHON_数据挖掘
    1.数据读取关键点:read_excel()、read_csv()importpandasaspdpd.read_excel('./股票数据.xlsx')#或者:pd.read_excel('./股票数据.xlsx',sheet_name='Sheet1')i......
  • Python 图片拼接
    <table><tr><tdbgcolor=orange>本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代......
  • python中if的使用
    布尔类型的学习:bool_1=Truebool_2=Falseprint(f"bool_1变量的内容是:{bool_1},数据类型是{type(bool_1)}")print(f"bool_2变量的内容是:{bool_2},数据类型是{type(bool_2)......
  • Vue滑块验证
    登陆时加入滑块验证1、在src\components新建SilderVerify\index.vue文件<template><divclass="silder-range":class="rangeStatus?'success':''"><i@mousedo......
  • 进入python的世界_day48_Django初始
    一、纯手撸web框架1.先搭服务端​ 1.因为浏览器就可以当成C\S开发架构的C客户端,我们先写一个简单的服务端importsocketserver=socket.socket()#这里括号不改任......
  • OpenCV入门(C++/Python)- 使用OpenCV调整尺寸大小(三)
    OverridetheentrypointofanimageIntroducedinGitLabandGitLabRunner9.4.Readmoreaboutthe extendedconfigurationoptions.Beforeexplainingtheav......
  • Python 图片拼接
    本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!环境......
  • centos 7 python2.7.5升级到3.5.2
    下载python3.5.2wgethttps://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz安装解压:tar-zxvfPython-3.5.2.tgz进入解压目录:cdPython-3.5.2创建安装目录:mkdir/us......
  • python升级带来的yum异常:File
    CentOS7升级Python到3.5。2后,需要在/usr/bin/python创建了一个指向Python3的软连接,然后将/usr/bin/yum的顶部的:!/usr/bin/python改成了!/usr/bin/python2.7后,运行yum,还是......
  • 搜索文章及代码(Matlab&Python代码实现)
     ......