广告
返回顶部
首页 > 资讯 > 后端开发 > Python >如何使用Python实现极验验证码识别验证码
  • 440
分享到

如何使用Python实现极验验证码识别验证码

2023-07-05 04:07:19 440人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

这篇“如何使用python实现极验验证码识别验证码”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何使用Python实现极验

这篇“如何使用python实现极验验证码识别验证码”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何使用Python实现极验验证码识别验证码”文章吧。

环境使用

目标

我们的目标是用程序来识别并通过极验验证码的验证,包括分析识别思路、识别缺口位置、生成滑块拖动路径、模拟实现滑块 拼合通过验证等步骤。

准备工作

本次我们使用的 Python 库是 selenium,浏览器为 Chrome。请确保已经正确安装 Selenium 库、Chrome 浏览器, 并配置 ChromeDriver。

了解极验验证码

现在极验验证码已经更新到 3.0 版本。全球有 16 万家企业使用极验,每天服务响应超过 4 亿次。极验验证码广泛应用于直播视频、金融服务、电子商务、游戏娱乐、企业等各大类型网站。下面图中是斗鱼、魅族的登录页面,它们都对接了极验验证码。

如何使用Python实现极验验证码识别验证码

极验验证码的特点

极验验证码相较于图形验证码来说识别难度更大。对于极验验证码 3.0 版本,我们首先点击按钮进行智能验证。如果验证不通过,则会弹出滑动验证的窗口,拖动滑块拼合图像进行验证。之后三个加密参数会生成,通过表单提交到后台,后台还会进行一次验证。

极验验证码还增加了机器学习的方法来识别拖动轨迹。官方网站的安全防护有如下几点说明。

三角防护之防模拟

恶意程序模仿人类行为轨迹对验证码进行识别。针对模拟,极验拥有超过 4000 万人机行为样本的海量数据。利用机器学习神经网络构建线上线下的多重静态、动态防御模型。识别模拟轨迹,界定人机边界。

三角防护之防伪造

恶意程序通过伪造设备浏览器环境对验证码进行识别。针对伪造,极验利用设备基因技术。深度分析浏览器的实际性能来辨识伪造信息。同时根据伪造事件不断更新黑名单,大幅提高防伪造能力。

三角防护之防暴力

恶意程序短时间内进行密集的攻击,对验证码进行暴力识别 针对暴力,极验拥有多种验证形态,每一种验证形态都有利用神经网络生成的海量图库储备,每一张图片都是独一无二的,且图库不断更新,极大程度提高了暴力识别的成本。

识别思路

对于应用了极验验证码的网站,如果我们直接模拟表单提交,加密参数的构造是个问题,需要分析其加密和校验逻辑,相对烦琐。所以我们采用直接模拟浏览器动作的方式来完成验证。在 Python 中,我们可以使用 Selenium 来完全模拟人的行为的方式来完成验证,此验证成本相比直接去识别加密算法少很多。

首先我们找到一个带有极验验证的网站,最合适的当然为极验官方后台了。此按钮为智能验证按钮。一般来说,如果是同一个会话,一段时间内第二次点击会直接通过验证。如果智能识别不通过,则会弹出滑动验证窗口,我们要拖动滑块拼合图像完成二步验证,验证成功后,验证按钮变成如图所示的状态。

如何使用Python实现极验验证码识别验证码

接下来,我们便可以提交表单了。

所以,识别验证需要完成如下三步。

  • 模拟点击验证按钮

  • 识别滑动缺口的位置

  • 模拟拖动滑块

拟点击验证按钮

第一步操作是最简单的,我们可以直接用 Selenium 模拟点击按钮即可。

识别滑动缺口的位置

第二步操作识别缺口的位置比较关键,这里需要用到图像的相关处理方法。首先观察缺口的样子,缺口的四周边缘有明显的断裂边缘,边缘和边缘周围有明显的区别。我们可以实现一个边缘检测算法来找出缺口的位置。对于极验验证码来说,我们可以利用和原图对比检测的方式来识别缺口的位置,因为在没有滑动滑块之前,缺口并没有呈现。

我们可以同时获取两张图片。设定一个对比阈值,然后遍历两张图片,找出相同位置像素 RGB 差距超过此阈值的像素点,那么此像素点的位置就是缺口的位置。

模拟拖动滑块

第3步操作看似简单,但其中的坑比较多。极验验证码增加了机器轨迹识别,匀速移动、随机速度移动等方法都不能通过验证,只有完全模拟人的移动轨迹才可以通过验证。人的移动轨迹一般是先加速后减速,我们需要模拟这个过程才能成功。

有了基本的思路之后,我们就用程序来实现极验验证码的识别过程吧。

模拟点击

首先,我们先模拟登录,其中 admin 和 PASSWord 就是登录极验需要的用户名和密码,如果没有的话可以先注册一下。

admin = '[账号]'PASSWORD = '[密码]'class CrackGeetest():    def __init__(self):        self.url = 'https://account.geetest.com/login'        self.browser = WEBdriver.Chrome()        self.wait = WebDriverWait(self.browser, 20)        self.email = EMAIL        self.password = PASSWORD

实现第一步的操作,也就是模拟点击初始的验证按钮。我们定义一个方法来获取这个按钮,利用显式等待的方法来实现,如下所示:

def get_geetest_button(self):    """    获取初始验证按钮    :return: 按钮对象    """    button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'geetest_radar_tip')))    return button# 点击验证按钮button = self.get_geetest_button()button.click()

识别缺口

接下来识别缺口的位置。首先获取前后两张比对图片,二者不一致的地方即为缺口。获取不带缺口的图片,利用 Selenium 选取图片元素,得到其所在位置和宽高,然后获取整个网页的截图,图片裁切出来即可,代码实现如下:

def get_position(self):        img = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_canvas_img')))    time.sleep(2)    location = img.location    size = img.size    top, bottom, left, right = location['y'], location['y'] + size['height'], location['x'], location['x'] + size['width']    return (top, bottom, left, right)def get_geetest_image(self, name='captcha.png'):    top, bottom, left, right = self.get_position()    print(' 验证码位置 ', top, bottom, left, right)    screenshot = self.get_screenshot()    captcha = screenshot.crop((left, top, right, bottom))    return captcha

这里 get_position() 函数首先获取图片对象,获取它的位置和宽高,随后返回其左上角和右下角的坐标。get_geetest_image() 方法获取网页截图,调用了 crop() 方法将图片裁切出来,返回的是 Image 对象。

接下来我们需要获取第二张图片,也就是带缺口的图片。要使得图片出现缺口,只需要点击下方的滑块即可。这个动作触发之后,图片中的缺口就会显现,如下所示:

def get_slider(self):    slider = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'geetest_slider_button')))    return sliderslider = self.get_slider()slider.click()

调用 get_geetest_image() 方法将第二张图片获取下来即可。

现在我们已经得到两张图片对象,分别赋值给变量 image1 和 image2。接下来对比图片获取缺口。我们在这里遍历图片的每个坐标点,获取两张图片对应像素点的 RGB 数据。如果二者的 RGB 数据差距在一定范围内,那就代表两个像素相同,继续比对下一个像素点。如果差距超过一定范围,则代表像素点不同,当前位置即为缺口位置,代码实现如下:

def is_pixel_equal(self, image1, image2, x, y):    pixel1 = image1.load()[x, y]    pixel2 = image2.load()[x, y]    threshold = 60    if abs(pixel1[0] - pixel2[0]) <threshold and abs(pixel1[1] - pixel2[1]) < threshold and abs(pixel1[2] - pixel2[2]) < threshold:        return True    else:        return Falsedef get_gap(self, image1, image2):    left = 60    for i in range(left, image1.size[0]):        for j in range(image1.size[1]):            if not self.is_pixel_equal(image1, image2, i, j):                left = i                return left    return left

get_gap() 方法即获取缺口位置的方法。此方法的参数是两张图片,一张为带缺口图片,另一张为不带缺口图片。这里遍历两张图片的每个像素,利用 is_pixel_equal() 方法判断两张图片同一位置的像素是否相同。比较两张图 RGB 的绝对值是否均小于定义的阈值 threshold。如果绝对值均在阈值之内,则代表像素点相同,继续遍历。否则代表不相同的像素点,即缺口的位置。

两张图片有两处明显不同的地方:一个就是待拼合的滑块,一个就是缺口。滑块的位置会出现在左边位置,缺口会出现在与滑块同一水平线的位置,所以缺口一般会在滑块的右侧。如果要寻找缺口,直接从滑块右侧寻找即可。我们直接设置遍历的起始横坐标为 60,也就是从滑块的右侧开始识别,这样识别出的结果就是缺口的位置。

现在,我们获取了缺口的位置。完成验证还剩下最后一步 &mdash;&mdash; 模拟拖动。

模拟拖动

到这里,会有一个小问题。如果是匀速拖动,极验必然会识别出它是程序的操作,因为人无法做到完全匀速拖动。极验验证码利用机器学习模型,筛选此类数据为机器操作,验证码识别失败。我们尝试分段模拟,将拖动过程划分几段,每段设置一个平均速度,速度围绕该平均速度小幅度随机抖动,这样也无法完成验证。那怎么办呢?

我们可以完全模拟加速减速的过程通过了验证。即前段滑块做匀加速运动,后段滑块做匀减速运动,利用物理学的加速度公式即可完成验证。接下来我们就可以构造轨迹移动算法,计算出先加速后减速的运动轨迹,最后按照该运动轨迹拖动滑块即可,方法实现如下所示:

def move_to_gap(self, slider, tracks):    ActionChains(self.browser).click_and_hold(slider).perfORM()    for x in tracks:        ActionChains(self.browser).move_by_offset(xoffset=x, yoffset=0).perform()    time.sleep(0.5)    ActionChains(self.browser).release().perform()

最后经过测试,验证通过,识别完成。

以上就是关于“如何使用Python实现极验验证码识别验证码”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网Python频道。

--结束END--

本文标题: 如何使用Python实现极验验证码识别验证码

本文链接: https://www.lsjlt.com/news/349467.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用Python实现极验验证码识别验证码
    这篇“如何使用Python实现极验验证码识别验证码”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何使用Python实现极验...
    99+
    2023-07-05
  • Python通用验证码识别OCR库之ddddocr验证码识别
    目录前言传统验证码滑动验证码文字点选验证码总结前言 相信做自动化测试的同学一定不可忽视的问题就是验证码,他几乎是一个网站登录的标配,当然,我一般是不建议在这上面浪费时间去做识别的。 ...
    99+
    2022-11-11
  • python 识别图片验证码/滑块验证码准确率极高的 ddddocr 库
    前言 验证码的种类有很多,它是常用的一种反爬手段,包括:图片验证码,滑块验证码,等一些常见的验证码场景。 识别验证码的python 库有很多,用起来也并不简单,这里推荐一个简单实用的识别验证码的库 d...
    99+
    2023-09-05
    python 开发语言 numpy
  • Python+Pillow+Pytesseract实现验证码识别
    目录一、环境配置二、验证码识别实例1实例2实例3昨天十行代码实现文字识别,感觉怎样,是不是很爽 今天咋们继续利用pillow和pytesseract来实现验证码的识别 一、环境配置 ...
    99+
    2022-11-12
  • 如何使用php+js实现极验,拖动滑块验证码验证表单
    这篇文章给大家分享的是有关如何使用php+js实现极验,拖动滑块验证码验证表单的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。   代码实现   html文件   <!...
    99+
    2022-10-19
  • python 验证码识别库pytesse
    笔者环境 centos7 python3 pytesseract只是tesseract-ocr的一种实现接口。所以要先安装tesseract-ocr(大名鼎鼎的开源的OCR识别引擎)。   依赖安装 yum install-y auto...
    99+
    2023-01-30
    验证码 python pytesse
  • python简单验证码识别
    在学习python通过接口自动登录网站时,用户名密码、cookies、headers都好解决但是在碰到验证码这个时就有点棘手了;于是通过网上看贴,看官网完成了对简单验证码的识别,如果是复杂的请看大神的贴这里解决不了; 以上两张为网站的上...
    99+
    2023-01-31
    验证码 简单 python
  • Python网站验证码识别
    0x00 识别涉及技术 验证码识别涉及很多方面的内容。入手难度大,但是入手后,可拓展性又非常广泛,可玩性极强,成就感也很足。 验证码图像处理 验证码图像识别技术主要是操作图片内的像素点,通过对图片...
    99+
    2022-06-04
    验证码 网站 Python
  • 详解Python验证码识别
    以前写过一个刷校内网的人气的工具,Java的(以后再也不行Java程序了),里面用到了验证码识别,那段代码不是我自己写的:-) 校内的验证是完全单色没有任何干挠的验证码,识别起来比较容易,不过从那段代码中可...
    99+
    2022-06-04
    验证码 详解 Python
  • 如何用三行Python代码实现验证码识别
    这篇文章主要介绍了如何用三行Python代码实现验证码识别的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何用三行Python代码实现验证码识别文章都会有所收获,下面我们一起来看看吧。源码如下:调试:输出:关于...
    99+
    2023-06-04
  • 如何使用TensorFlow2识别验证码
    这篇文章主要介绍如何使用TensorFlow2识别验证码,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!验证码是根据随机字符生成一幅图片,然后在图片中加入干扰象素,用户必须手动填入,防止有人利用机器人自动批量注册、灌水...
    99+
    2023-06-15
  • Python教学|Python验证码识别
    大致介绍 在python爬虫爬取某些网站的验证码的时候可能会遇到验证码识别的问题,现在的验证码大多分为四类: 计算验证码 滑块验证码 识图验证码 语音验证码 这篇博客主要写的就是识图验证码,识别的是简...
    99+
    2023-09-01
    python opencv 开发语言
  • Python验证码识别处理实例
    一、准备工作与代码实例 (1)安装PIL:下载后是一个exe,直接双击安装,它会自动安装到C:Python27Libsite-packages中去, (2)pytesser:下载解压后直接放C:Python...
    99+
    2022-06-04
    验证码 实例 Python
  • python实现腾讯滑块验证码识别
    腾讯滑块验证码识别,识别凹槽的x轴位置,mock滑块的加速度。该项目公开API,提供识别和加速度模拟部分,第二部分模拟滑动进行识别返回数据请求 项目地址:https://github.com/zhaojunlike/...
    99+
    2022-06-02
    python 验证码识别 python 滑块验证码识别 python 腾讯验证码
  • Python+Selenium+Pytesseract实现图片验证码识别
    目录一、selenium截取验证码二、安装识别环境pytesseract+Tesseract-OCR验证识别环境是否正常三、处理验证码图片图片处理识别一、selenium截取验证码 ...
    99+
    2022-11-12
  • Python+Pillow+Pytesseract怎么实现验证码识别
    这篇“Python+Pillow+Pytesseract怎么实现验证码识别”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Py...
    99+
    2023-06-30
  • Python怎么实现图形验证码识别
    这篇文章主要介绍了Python怎么实现图形验证码识别的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python怎么实现图形验证码识别文章都会有所收获,下面我们一起来看看吧。环境使用python 3.9pycha...
    99+
    2023-07-05
  • python如何实现腾讯滑块验证码识别
    小编给大家分享一下python如何实现腾讯滑块验证码识别,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注的是解决问题,而不是搞明白语言本身。2...
    99+
    2023-06-14
  • python验证码识别的实例详解
    其实关于验证码识别涉及很多方面的内容,入手难度大,但是入手后,可拓展性又非常广泛,可玩性极强,成就感也很足,对这感兴趣的朋友们下面跟着小编一起来学习学习吧。 依赖 sudo apt-get instal...
    99+
    2022-06-04
    验证码 详解 实例
  • 教你使用TensorFlow2识别验证码
    验证码是根据随机字符生成一幅图片,然后在图片中加入干扰象素,用户必须手动填入,防止有人利用机器人自动批量注册、灌水、发垃圾广告等等 。 数据集来源:https://www.kaggl...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作