基于python实现破解滑动验证码过程解析

前言:

很多小伙伴们反馈,在web自动化的过程中,经常会被登录的验证码给卡住,不知道如何去通过验证码的验证。今天专门给大家来聊聊验证码的问题,一般的情况下遇到验证码我们可以都可以找开发去帮忙解决,关闭验证码,或者给一个万能的验证码!那么如果开发不提供帮助的话,我们自己有没有办法来处理这些验证码的问题呢?答案当然是有的,常见的验证码一般分为两类,一类是图文验证码,一类是滑动验证码!

今天我们主要来聊聊滑动验证码如何去识别破解。

滑动验证破解思路

关于滑动验证码破解的思路大体上来讲就是以下两个步骤:

1、获取滑块滑动的距离

2、模拟拖动滑块,通过验证。

听起来是比较简单,但是获取滑块滑动的距离,大多数小伙伴没有思路,不知道怎么去获取。其实要获取下来也不难,关于这种滑动的验证码,滑块和缺口背景都是分别是一张独立的图片,我们可以把这两张图片,下载下来借助于图像识别的技术,去识别缺口在背景图中的位置,然后减去滑块当前所在位置,就可以得出需要滑动的距离。这个时候很多小伙伴会想图像识别技术我不会啊,不会没有关系,后面会给到大家一个封装好的滑块识别模块,只要你传入滑块和缺口背景图的元素节点就能计算出滑块的缺口位置。

案例讲解

话不多说,我们先来看一个案例(QQ空间登录),这边用到了一个我自己封装的滑动距离识别的模块slideVerfication,有需要的小伙伴可以私聊获取。qq空间登录案例实现步骤如下:

1、创建一个driver对象,访问qq登录页面

2、输入账号密码

3、点击登录

4、模拟滑动验证

实现代码

 import time
 from selenium import webdriver
 from slideVerfication import SlideVerificationCode
 ​
 # 1、创建一个driver对象,访问qq登录页面
 browser = webdriver.Chrome()
 browser.get("https://qzone.qq.com/")
 ​
 # 2、输入账号密码
 # 2.0 点击切换到登录的iframe
 browser.switch_to.frame('login_frame')
 # 2.1 点击账号密码登录
 browser.find_element_by_id('switcher_plogin').click()
 # 2.2定位账号输入框,输入账号
 browser.find_element_by_id("u").send_keys("123292678")
 # 2.3定位密码输入输入密码
 browser.find_element_by_id("p").send_keys("PYTHON01")
 # 3、点击登录
 browser.find_element_by_id('login_button').click()
 time.sleep(3)
 ​
 # 4、模拟滑动验证
 # 4.1切换到滑动验证码的iframe中
 tcaptcha = browser.find_element_by_id("tcaptcha_iframe")
 browser.switch_to.frame(tcaptcha)
 # 4.2 获取滑动相关的元素
 # 选择拖动滑块的节点
 slide_element = browser.find_element_by_id('tcaptcha_drag_thumb')
 # 获取滑块图片的节点
 slideBlock_ele = browser.find_element_by_id('slideBlock')
 # 获取缺口背景图片节点
 slideBg = browser.find_element_by_id('slideBg')
 # 4.3计算滑动距离
 sc = SlideVerificationCode(save_image=True)
 distance = sc.get_element_slide_distance(slideBlock_ele,slideBg)
 # 滑动距离误差校正,滑动距离*图片在网页上显示的缩放比-滑块相对的初始位置
 distance = distance*(280/680) - 22
 print("校正后的滑动距离",distance)
 # 4.4、进行滑动
 sc.slide_verification(browser,slide_element,distance=100)

关于滑动验证码的识别问题就这样解决了,那么接下来给大家来讲讲封装的slideVerfication这个模块的识别原理,其实关于这个模块图像识别,也是借助了第三方的图像处理模块来进行识别的,python中有很多现成的用来处理图片的库,这边我使用的是opencv-python来进行识别的。slideVerfication模块上面用到的两个方法的部分参考代码如下:

def get_element_slide_distance(self, slider_ele, background_ele, correct=0):
     """
     根据传入滑块,和背景的节点,计算滑块的距离
 ​
     该方法只能计算 滑块和背景图都是一张完整图片的场景,
     如果背景图是通过多张小图拼接起来的背景图,
     该方法不适用,请使用get_image_slide_distance这个方法
     :param slider_ele: 滑块图片的节点
     :type slider_ele: WebElement
     :param background_ele: 背景图的节点
     :type background_ele:WebElement
     :param correct:滑块缺口截图的修正值,默认为0,调试截图是否正确的情况下才会用
     :type: int
     :return: 背景图缺口位置的X轴坐标位置(缺口图片左边界位置)
     """
     # 获取验证码的图片
     slider_url = slider_ele.get_attribute("src")
     background_url = background_ele.get_attribute("src")
     # 下载验证码背景图,滑动图片
     slider = "slider.jpg"
     background = "background.jpg"
     self.onload_save_img(slider_url, slider)
     self.onload_save_img(background_url, background)
     # 读取进行色度图片,转换为numpy中的数组类型数据,
     slider_pic = cv2.imread(slider, 0)
     background_pic = cv2.imread(background, 0)
     # 获取缺口图数组的形状 -->缺口图的宽和高
     width, height = slider_pic.shape[::-1]
     # 将处理之后的图片另存
     slider01 = "slider01.jpg"
     background_01 = "background01.jpg"
     cv2.imwrite(background_01, background_pic)
     cv2.imwrite(slider01, slider_pic)
     # 读取另存的滑块图
     slider_pic = cv2.imread(slider01)
     # 进行色彩转换
     slider_pic = cv2.cvtColor(slider_pic, cv2.COLOR_BGR2GRAY)
     # 获取色差的绝对值
     slider_pic = abs(255 - slider_pic)
     # 保存图片
     cv2.imwrite(slider01, slider_pic)
     # 读取滑块
     slider_pic = cv2.imread(slider01)
     # 读取背景图
     background_pic = cv2.imread(background_01)
     # 比较两张图的重叠区域
     result = cv2.matchTemplate(slider_pic, background_pic, cv2.TM_CCOEFF_NORMED)
     # 获取图片的缺口位置
     top, left = np.unravel_index(result.argmax(), result.shape)
     # 背景图中的图片缺口坐标位置
     print("当前滑块的缺口位置:", (left, top, left + width, top + height))
     return left
   def slide_verification(self, driver, slide_element, distance):
     """
     滑动滑块进行验证

     :param driver: driver对象
     :type driver:webdriver.Chrome
     :param slide_element: 滑块的元组
     :type slider_ele: WebElement
     :param distance: 滑动的距离
     :type: int
     :return:
     """
     # 获取滑动前页面的url地址
     start_url = driver.current_url
     print("需要滑动的距离为:", distance)
     # 根据滑动距离生成滑动轨迹
     locus = self.get_slide_locus(distance)
     print("生成的滑动轨迹为:{},轨迹的距离之和为{}".format(locus, distance))
     # 按下鼠标左键
     ActionChains(driver).click_and_hold(slide_element).perform()
     time.sleep(0.5)
     # 遍历轨迹进行滑动
     for loc in locus:
       time.sleep(0.01)
       ActionChains(driver).move_by_offset(loc, random.randint(-5, 5)).perform()
       ActionChains(driver).context_click(slide_element)
     # 释放鼠标
     ActionChains(driver).release(on_element=slide_element).perform()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Python 200行代码实现一个滑动验证码过程详解

    前言 做网络爬虫的同学肯定见过各种各样的验证码,比较高级的有滑动.点选等样式,看起来好像挺复杂的,但实际上它们的核心原理还是还是很清晰的,本文章大致说明下这些验证码的原理以及带大家实现一个滑动验证码. 实际上这类验证码的校验是分为两个步骤的: 1.第一步就是前端的校验.一般来说,登录注册页面在点击提交的时候都会伴随着一个表单提交,在表单提交的时候会有 JavaScript 事件的触发.如果加入了验证码,那么在表单提交的时候会多加一个额外的验证,判断这个验证码是否已经成功完成了操作.如果没有的话,

  • python验证码识别教程之滑动验证码

    前言 上篇文章记录了2种分割验证码的方法,此外还有一种叫做"滴水算法"(Drop Fall Algorithm)的方法,但本人智商原因看这个算法看的云里雾里的,所以今天记录滑动验证码的处理吧.网上据说有大神已经破解了滑动验证码的算法,可以不使用selenium来破解,但本人能力不足还是使用笨方法吧. 基础原理很简单,首先点击验证码按钮后的图片是滑动后的完整结果,点击一下滑块后会出现拼图,对这2个分别截图后比较像素值来找出滑动距离,并结合selenium来实现拖拽效果. 至于seleni

  • python爬虫之验证码篇3-滑动验证码识别技术

    滑动验证码介绍 本篇涉及到的验证码为滑动验证码,不同于极验证,本验证码难度略低,需要的将滑块拖动到矩形区域右侧即可完成. 这类验证码不常见了,官方介绍地址为:https://promotion.aliyun.com/ntms/act/captchaIntroAndDemo.html 使用起来肯定是非常安全的了,不是很好通过机器检测 如何判断验证码类型 这个验证码的标识一般比较明显,在页面源码中一般存在一个 nc.js 基本可以判定是阿里云的验证码了 <script type="text/j

  • 使用Python的OpenCV模块识别滑动验证码的缺口(推荐)

    最近终于找到一个好的方法,使用Python的OpenCV模块识别滑动验证码的缺口,可以将滑动验证码中的缺口识别出来了. 测试使用如下两张图片: target.jpg template.png 现在想要通过"template.png"在"target.jpg"中找到对应的缺口,代码实现如下: # encoding=utf8 import cv2 import numpy as np def show(name): cv2.imshow('Show', name) cv

  • Python3网络爬虫开发实战之极验滑动验证码的识别

    上节我们了解了图形验证码的识别,简单的图形验证码我们可以直接利用 Tesserocr 来识别,但是近几年又出现了一些新型验证码,如滑动验证码,比较有代表性的就是极验验证码,它需要拖动拼合滑块才可以完成验证,相对图形验证码来说识别难度上升了几个等级,本节来讲解下极验验证码的识别过程. 1. 本节目标 本节我们的目标是用程序来识别并通过极验验证码的验证,其步骤有分析识别思路.识别缺口位置.生成滑块拖动路径,最后模拟实现滑块拼合通过验证. 2. 准备工作 本次我们使用的 Python 库是 Selen

  • 使用python实现滑动验证码功能

    首先安装一个需要用到的模块 pip install social-auth-app-django 安装完后在终端输入pip list会看到 social-auth-app-django 3.1.0 social-auth-core 3.0.0 然后可以来我的github,下载关于滑动验证码的这个demo:https://github.com/Edward66/slide_auth_code 下载完后启动项目 python manage.py runserver 启动这个项目后,在主页就能看到示例

  • python破解bilibili滑动验证码登录功能

    地址:https://passport.bilibili.com/login 左图事完整验证码图,右图是有缺口的验证码图                                    步骤: 1.准备bilibili账号 2.工具:pycharm selenium chromedriver PIL 3.破解思路: 找到完整验证码和有缺口的验证码图片,然后计算缺口坐标,再利用selenium移动按钮到指定位置,齐活 步骤代码如下: 先导入需要的包和库 from selenium impor

  • 基于python实现破解滑动验证码过程解析

    前言: 很多小伙伴们反馈,在web自动化的过程中,经常会被登录的验证码给卡住,不知道如何去通过验证码的验证.今天专门给大家来聊聊验证码的问题,一般的情况下遇到验证码我们可以都可以找开发去帮忙解决,关闭验证码,或者给一个万能的验证码!那么如果开发不提供帮助的话,我们自己有没有办法来处理这些验证码的问题呢?答案当然是有的,常见的验证码一般分为两类,一类是图文验证码,一类是滑动验证码! 今天我们主要来聊聊滑动验证码如何去识别破解. 滑动验证破解思路 关于滑动验证码破解的思路大体上来讲就是以下两个步骤:

  • 用Python爬虫破解滑动验证码的案例解析

    做爬虫总会遇到各种各样的反爬限制,反爬的第一道防线往往在登录就出现了,为了限制爬虫自动登录,各家使出了浑身解数,所谓道高一尺魔高一丈. 今天分享个如何简单处理滑动图片的验证码的案例. 类似这种拖动滑块移动到图片中缺口位置与之重合的登录验证在很多网站或者APP都比较常见,因为它对真实用户体验友好,容易识别.同时也能拦截掉大部分初级爬虫. 作为一只python爬虫,如何正确地自动完成这个验证过程呢? 先来分析下,核心问题其实是要怎么样找到目标缺口的位置,一旦知道了位置,我们就可以借用selenium

  • Django中使用极验Geetest滑动验证码过程解析

    一,环境部署 1.创建一个django测试项目 二,文档部署 1.下载安装python对应的SDK 使用命令从Github导入完整项目:git clone https://github.com/GeeTeam/gt3-python-sdk.git 手动下载压缩包文件:https://github.com/GeeTeam/gt3-python-sdk/archive/master.zip 2.参数配置 修改请求参数(可选) 名称 说明 user_id 用户标识,若担心用户信息风险,可作预处理(如哈

  • 基于Python检测动态物体颜色过程解析

    本篇文章将通过图片对比的方法检查视频中的动态物体,并将其中会动的物体定位用cv2矩形框圈出来.本次项目可用于树莓派或者单片机追踪做一些思路参考.寻找动态物体也可以用来监控是否有人进入房间等等场所的监控.不仅如此,通过对物体的像素值判断分类,达到判断动态物体总体颜色的效果. 引言 物体检测,是一种基于目的几何学和统计资料特点的影像拆分,它将目的的拆分和辨识,其准确度和实时性是整个该系统的一项最重要战斗能力.特别是在是在简单桥段中的,必须对多个目的展开实时处理时,目的系统会萃取和辨识就变得尤其最重要

  • 基于python实现获取网页图片过程解析

    环境:python3, 要安装bs4这个第三方库 获取请求头的方法 这里使用的是Chrome浏览器. 打开你想查询的网站,按F12,或者鼠标右键一下选择检查.会弹出如下的审查元素页面: 然后点击上方选项中的Network选项: 此时在按Ctrl+R: 选择下方框中的第一个,单击: 选择Headers选项,其中就会有Request Headers,包括你需要的信息. 介绍:这个程序是用来批量获取网页的图片,用于新手入门 注意:由于是入门的程序在获取某些网页的图片时会出问题!!!!! import

  • python自动化测试之破解滑动验证码

    在Web自动化测试的过程中,经常会被登录的验证码给卡住,不知道如何去通过验证码的验证.一般的情况下遇到验证码我们可以都可以找开发去帮忙解决,关闭验证码,或者给一个万能的验证码!那么如果开发不提供帮助的话,我们自己有没有办法来处理这些验证码的问题呢?答案当然是有的,常见的验证码一般分为两类,一类是图文验证码,一类是滑动验证码! 滑动验证破解思路 关于滑动验证码破解的思路大体上来讲就是以下两个步骤: 1.获取滑块滑动的距离 2.模拟拖动滑块,通过验证. 关于这种滑动的验证码,滑块和缺口背景都是分别是

  • python绕过图片滑动验证码实现爬取PTA所有题目功能 附源码

    最近学了python爬虫,本着学以致用的态度去应用在生活中.突然发现算法的考试要来了,范围就是PTA刷过的题.让我一个个复制粘贴?不可能,必须爬它! 先开页面,人傻了,PTA的题目是异步加载的,爬了个寂寞(空数据).AJAX我又不熟,突然想到了selenium. selenium可以模拟人的操作让浏览器自动执行动作,具体的自己去了解,不多说了.干货来了: 登录界面有个图片的滑动验证码 破解它的最好方式就是用opencv,opencv巨强,自己了解. 思路开始: 1.将背景图片和可滑动的图片下载

  • Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)

    一.滑块验证码简述 有爬虫,自然就有反爬虫,就像病毒和杀毒软件一样,有攻就有防,两者彼此推进发展.而目前最流行的反爬技术验证码,为了防止爬虫自动注册,批量生成垃圾账号,几乎所有网站的注册页面都会用到验证码技术.其实验证码的英文为 CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart),翻译成中文就是全自动区分计算机和人类的公开图灵测试,它是一种可以区分用户是计算机还是人的测试,只要能通

  • Python+selenium破解拼图验证码的脚本

    目录 实现思路 核心代码 实现思路 很多网站都有拼图验证码 1.首先要了解拼图验证码的生成原理 2.制定破解计划,考虑其可能性和成功率. 3.编写脚本 很多网站的拼图验证码都是直接借助第三方插件,也就是一类一种解法. 笔者遇到的这种拼图验证码实际上是多个小碎片经过重新组合成的一张整体,首先要在网站上抓取这种小碎片图片并下载到本地 我们先捋一捋大体思路: 获取所有碎片图片----找出他们的排列顺序逻辑-----找出他们中含有颜色深的真正位置的那个小碎块的序号-----根据每块碎片的宽度和上下和这个

  • python打包成so文件过程解析

    这篇文章主要介绍了python打包成so文件过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 wget https://bootstrap.pypa.io/get-pip.py python get-pip.py pip install cython 编写setput.py文件: setup.py文件内容如下: from distutils.core import setup from distutils.extension import

随机推荐