教你python自动识别图文验证码的解决方案!

验证码识别解决方案 对于web应用程序来讲,处于安全性考虑,在登录的时候,都会设置验证码,验证码的类型种类繁多,有图片中辨别数字字母的,有点击图片中指定的文字的,也有算术计算结果的,再复杂一点就是滑动验证的。诸如此类的验证码,对我们的系统增加了安全性的保障,但是对于我们测试人员来讲,在自动化测试的过程中,无疑是一个棘手的问题。

如果对软件测试、接口、自动化、性能测试、测试开发、面试经验交流。感兴趣可以加裙485187702,群内会有不定期的发放免费的资料链接,这些资料都是从各个技术网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。

1、web自动化验证码解决方案 一般在我们测试过程中,登录遇到上述的验证码的时候,有以下种解决方案:

第一种、让开发去掉验证码 第二种、设置一个万能的验证码 第三种、通过cookie绕过登录 第四种、自动识别技术识别验证码 2、自动识别技术识别验证码 前三种解决方案,想必大家都比较了解,本文重点阐述第四种解决方案,也就是验证码的自动识别,关于验证码识别这一块,可以通过两个方案来解决,

第一种是:OCR自动识别技术, 第二种是:通过第三方打码平台的接口来识别。 OCR识别技术 OCR中文名称光学识别, tesseract是一个有名的开源OCR识别框架,它与Leptonica图片处理库结合,可以读取各种格式的图像并将它们转化成超过60种语言的文本,可以不断训练自己的识别库,使图像转换文本的能力不断增强。如果团队深度需要,还可以以它为模板,开发出符合自身需求的OCR引擎。那么接下来给大家介绍一下如何使用tessract来识别我们的验证码。

关于OCR自动识别这一块,需要大家安装Tesseract,并配置好环境,步骤如下 1)、安装tesseract

适用于Tesseract 3.05-02和Tesseract 4.00-beta的

Windows安装程序下载地址:github.com/UB-Mannheim…

2)、加入培训数据

tesseract 默认只能识别英文,如果您想要识别其他语言,则需要下载相应的培训数据

下载地址:github.com/tesseract-o…

下图为中文数据包

我们只做中文,暂时下载一个中文的文字训练数据就可以 ,然后将.traineddata文件复制到安装之后的'tessdata'目录中。C:\OCR\Tesseract-OCR\tessdata

3)、配置环境变量

要从任何位置访问tesseract-OCR,您可能必须将tesseract-OCR二进制文件所在的目录添加到Path变量中C:\OCR\Tesseract-OCR。

安装后tesseract之后 ,并不能直接在python中使用,我们要想在python中使用,需要安装pytesseract模块我们可以通过 pip 安装 pip install pytesseract python中识别验证码图片内容 安装好后。找一张验证码图片,如下图(命名为test.jpg),放在当前python文件同级目录下面,

使用 PIL中的Image中的open方法打开验证码图片,调用pytesseract.image_to_string方法,可以识别图片中的文字,并且转换成字符串,如下面代码所示。

import pytesseract from PIL import Image pic = Image.open('test.jpg')

pic 为打开的图片,lang指定识别转换的语言库

text = pytesseract.image_to_string(pic,lang='chi_sim') print(text) 通过上述方法能识别简单的验证码,但是存在一定的问题,识别的精度不高,对于一些复杂一点,有干扰线的验证码无法正确识别出结果。

接下来给大家介绍一下第二种识别的方案,第三方的打码平台识别

打码平台识别验证码 第三方的打码平台相对于OCR来讲,优势在于识别的精准度高,网络上的第三方打码平台很多,百度随便一搜就有几十个,这个给大家列举几个,如下所示:

网络上的第三方打码平台众多,这里小编选择超级鹰这个第三方的平台来给大家做演示。

首先登录我们需要注册登录超级鹰这个网站 www.chaojiying.com,进入之后我们找到python对应的开发文档并下载, 下载开发文档 下载之后解压缩,得到如下文件 第三方打码平台的接口分析 我们打开chaojiying.py这个文件后,会发现这个文件中给出了的接口非常简单,如下所示

首先第一步创建一个用户对象:三个参数(账号,密码,软件ID),账号密码就是该网站的账号密码,那么软件ID呢?软件ID我们可以在用户中心找到软件ID,然后进去点击生成一个软件ID(如下图),

第二行代码就是打开一个要识别的验证码图片,并读取内容, 第三行,调用PostPic方法识别验证码,两个参数(验证码图片内容,验证码类型),关于验证码类型,请参考该网站的价格体系(如下图),根据验证码类型选择对应的数值传入。

结果提取: PostPic返回的是一个字典类型的数据,识别的验证码在该字典中的pic_str这个键中 res = cjy.PostPic(im, 1902) # 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加() data = res['pic_str'] print(data) 第三方接口给大家介绍到这里,接下来我们实际应用到登录中去。 提示:打码平台一般都是收费的(差不多是一分钱,识别一次)

3、自动识别验证码登录案例 登录案例 接下来以超级鹰这个网站为列,使用web自动化测试框架selenium来实现验证码识别自动登录, 需要用到的库有selenium、pillow、time,和我们上面下载的超级鹰的接口文件 环境安装 1、selenium安装 pip install selenium 2、chromedriver 安装

下载地址

chromedriver.storage.googleapis.com/index.html 下载和自己chrome浏览器对应的chromedriver版本, 配置环境变量

3、pillow模块安装(处理图像的库) pip install pillow

实现步骤分析 1、获取账号密码输入框:输入账号密码 2、获取验证码图片 将当前页面截图 选择图片元素,获取上下左右位置 使用PIL模块对页面图片进行再次截图(获取验证码图片) 将验证码图片保存

3、调用第三方接口识别验证码 4、输入验证码结果 5、点击登录 1 具体代码实现 1、selenium打开登录页面 import time from selenium import webdriver from PIL import Image from chaojiying import Chaojiying_Client ​

创建一个浏览器

browser = webdriver.Chrome()

访问登录页面

url = 'www.chaojiying.com/user/mysoft…' browser.get(url) time.sleep(1) # 暂停一秒钟 2、获取账号密码输入框:输入账号密码

选择账号、密码输入栏,输入对应的账号密码

input_user=browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[1]/input')

输入账号

input_user.send_keys('账号') input_pwd=browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[2]/input')

输入密码

input_pwd.send_keys('密码') 2、获取验证码图片 将当前页面截图

对当前页面进行截图

browser.save_screenshot('login.png') 选择图片元素,获取上下左右位置

选择验证码图片的元素

yzm_btn = browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/div/img')

获取图片元素的位置

loc = yzm_btn.location

获取图片的宽高

size = yzm_btn.size 获取验证码上下左右的位置,此处要注意查看电脑显示的缩放比列(如下图),根据比列乘以相应的系数,我这边的显示比列是125,那么对于的系数就是1.25(如果你的是150,那么就乘以1.5) left = loc['x']*1.25 # 计算左边界 top = loc['y']*1.25 # 计算上边界 right = (loc['x'] + size['width'])*1.25 # 计算右边界 botom = (loc['y'] + size['height'])*1.25 # 计算下边界

将上下左右边界值放到元祖中(注意顺序:左 上 右 下)

local = (left, top, right, botom)

使用PIL模块对页面图片进行再次截图(获取验证码图片),将验证码图片保存 pic = PIL.Image.open('file') pic.crop(local) pic.sava('zym,png')

3、调用第三方接口识别验证码

识别验证码

cjy = Chaojiying_Client('账号', '密码', '软件ID') # 用户中心>>软件ID 生成一个 im = open('yzm.png', 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要// res = cjy.PostPic(im, 1902) # 1902 验证码类型 data = res['pic_str'] print(data) 4、输入验证码结果

在输入框输入验证码

yzm_input = browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[3]/input') yzm_input.send_keys(data) 5、点击登录

点击登录

submit = browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[4]/input') submit.click( import time from selenium import webdriver from PIL import Image from chaojiying import Chaojiying_Client ​

创建一个浏览器

browser = webdriver.Chrome()

访问登录页面

url = 'www.chaojiying.com/user/mysoft…' browser.get(url) time.sleep(1) # 暂停一秒钟

选择账号、密码输入栏,输入对应的账号密码

input_user = browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[1]/input') input_user.send_keys('qq121292679') input_pwd = browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[2]/input') input_pwd.send_keys('546245426')

获取验证码的图片,并进行识别,将识别的结果,输入到验证码输入框中

对当前页面进行截图

browser.save_screenshot('login.png')

选择验证码图片的元素

yzm_btn = browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/div/img')

获取图片元素的位置

loc = yzm_btn.location

获取图片的宽高

size = yzm_btn.size

获取验证码上下左右的位置

left = loc['x']*1.25 top = loc['y']*1.25 right = (loc['x'] + size['width'])*1.25 botom = (loc['y'] + size['height'])*1.25 val = (left, top, right, botom)

打开网页截图

login_pic = Image.open('login.png')

通过上下左右的值,去截取验证码

yzm_pic = login_pic.crop(val) yzm_pic.save('yzm.png') ​

识别验证码

cjy = Chaojiying_Client('qq121292679', '546245426', '96001') # 用户中心>>软件ID 生成一个替换 96001 im = open('yzm.png', 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要// res = cjy.PostPic(im, 1902) # 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加() data = res['pic_str'] print(data) ​

在输入框输入验证码

yzm_input = browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[3]/input') yzm_input.send_keys(data) ​ ​

点击登录

submit = browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[4]/input') submit.click() ​

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/30418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

成都爱尔李晓峰主任讲解眼角多出一层“膜”是什么?怎么治

眼角边突然发现长出来一层皮一层膜一样的东西,肉色挡在眼白上呈三角形,这到底是什么? 一种常见眼科疾病“翼状胬肉”,因其形状像昆虫的翅膀而得名的,它是受外界剌激而引起的一种慢性炎症性病变。 覆盖在眼睛表面的那…

JUC并发编程第十三章——读写锁、邮戳锁

本章路线总纲 无锁——>独占锁——>读写锁——>邮戳锁 1 关于锁的面试题 你知道Java里面有那些锁你说说你用过的锁,锁饥饿问题是什么?有没有比读写锁更快的锁StampedLock知道吗?(邮戳锁/票据锁)ReentrantR…

使用自定义注解进行权限校验

一,前言 对于一些重复性的操作我们可以用提取为util的方式进行处理,但也可以更简便一些,比如自定义个注解进行。选择看这篇文章的小伙伴想必都对注解不陌生,但是可能对它的工作原理不太清楚。这里我们用注解实现对接口的权限校验…

Wireshark v4 修改版安装教程(免费开源的网络嗅探抓包工具)

前言 Wireshark(前称Ethereal)是一款免费开源的网络嗅探抓包工具,世界上最流行的网络协议分析器!网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark网络抓包工具使用WinPCAP作为…

基于GWO-CNN-LSTM数据时间序列预测(多输入单输出)-多维时间序列模型-MATLAB实现

基于GWO-CNN-LSTM数据时间序列预测(多输入单输出)-多维时间序列模型-MATLAB实现 基于灰狼优化(Grey Wolf Optimizer, GWO)、卷积神经网络(Convolutional Neural Network, CNN)和长短期记忆网络(Long Short-Term Memor…

【计算机视觉(11)】

基于Python的OpenCV基础入门——图像梯度变换 图像梯度变换Sobel算子Scharr算子Laplacian算子 图像梯度变换的代码实现以及效果图 图像梯度变换 图像梯度变换可以用于边缘检测、特征提取、增强图像和压缩图像等多种任务。图图像梯度可以把图像看成二维离散函数,图像…

什么是进程?

目录 进程 进程的特征, 概念 我们下面先简单介绍一下什么是进程 接下来看看一个程序的运行过程 进程的组成 进程的状态和转换 进程的状态 进程状态的转换 ​编辑 进程的组织方式 进程控制 如何实现进程控制 为什么进程控制的过程需要一气呵成? 进程控制的实现…

前端初学java

目录 java术语 JDK Javac Java Jdb Jhat JVM JRE JAR JDK下载 运行java文件 字面量 隐式转换 强制转换 注意 运算符 &&、||、&、| Switch 程序入口 String[] args 数组 静态初始化 动态初始化 变量初始化 Java内存 方法 重载 Final 包 …

智警杯数据库学习(1)

CentOS中安装MySQL数据库 检测系统是否自带安装 MySQL 首先检查是否自带mysql rpm -qa | grep mysql 如果有删除 rpm -e mysq 未安装,开始安装 进入software目录,解压安装包mysql5.7.25 cd /root/software tar -xvf mysql-5.7.25-1.el7.x86_64.rp…

【决战欧洲杯巅峰】欧洲杯含金量比世界杯高吗?有走地数据分析软件吗?

关于欧洲杯和世界杯的含金量对比,这是一个相当主观的问题,因为两者的价值和重要性很大程度上取决于个人的喜好和观点。但我可以从一些关键方面来为你提供比较的视角。 首先,从参赛队伍和竞技水平来看,世界杯无疑是全球范围内最具…

[渗透测试学习] SolarLab-HackTheBox

SolarLab-HackTheBox 信息搜集 nmap扫描端口 nmap -sV -v 10.10.11.16扫描结果如下 PORT STATE SERVICE VERSION 80/tcp open http nginx 1.24.0 135/tcp open msrpc Microsoft Windows RPC 139/tcp open netbios-ssn Microsoft Windows n…

C/S、B/S架构(详解)

一、CS、BS架构定义 CS架构(Client-Server Architecture)是一种分布式计算模型,其中客户端和服务器之间通过网络进行通信。在这种架构中,客户端负责向服务器发送请求,并接收服务器返回的响应。服务器则负责处理客户端的…

浅谈RC4

一、什么叫RC4?优点和缺点 RC4是对称密码(加密解密使用同一个密钥)算法中的流密码(一个字节一个字节的进行加密)加密算法。 优点:简单、灵活、作用范围广,速度快 缺点:安全性能较差&…

Pytorch编写Transformer

本文参考自https://github.com/datawhalechina/learn-nlp-with-transformers/blob/main/docs/ 在学习了图解Transformer以后,需要用Pytorch编写Transformer,下面是写代码的过程中的总结,结构根据图解Transformer进行说明。 import numpy as …

前字节员工自爆:我原腾讯一哥们,跳槽去小公司做小领导,就签了竞业,又从小公司离职去了对手公司,结果被发现了,小公司要他赔80万

“世界那么大,我想去看看”,这句曾经火遍网络的辞职宣言,说出了多少职场人心中的渴望。然而,当我们真的迈出跳槽那一步时,才发现,现实远比想象中残酷得多。 最近,一起前字节跳动员工爆料的事件…

年终奖发放没几天,提离职领导指责我不厚道,我该怎么办?

“年终奖都发了,你还跳槽?太不厚道了吧!” “拿完年终奖就走人,这不是典型的‘骑驴找马’吗?” 每到岁末年初,关于“拿到年终奖后是否应该立即辞职”的话题总会引发热议。支持者认为,这是个人…

如何验证Rust中的字符串变量在超出作用域时自动释放内存?

讲动人的故事,写懂人的代码 在公司内部的Rust培训课上,讲师贾克强比较了 Rust、Java 和 C++ 三种编程语言在变量越过作用域时自动释放堆内存的不同特性。 Rust 通过所有权系统和借用检查,实现了内存安全和自动管理,从而避免了大部分内存泄漏。Rust 自动管理标准库中数据类…

PID控制算法学习笔记分享

目录 一、参数设定 二、PID计算公式 三、位置式PID代码实现 四、增量式PID代码实现 五、两种控制算法的优缺点 六、PID算法的改进 一、参数设定 比例系数(kp):P项的作用是根据当前误差的大小来产生一个控制量。它直接与误差成正比&#…

【机器学习300问】126、词嵌入(Word Embedding)是什么意思?

人类的文字,作为一种高度抽象化的符号系统,承载着丰富而复杂的信息。为了让电脑也能像人类一样理解并处理这些文字,科学家们不断探索各种方法,以期将人类的语言转化为计算机能够理解的格式。 一、One-Hot编码的不足 在自然语言处…

NSSCTF中的[WUSTCTF 2020]朴实无华、[FSCTF 2023]源码!启动! 、[LitCTF 2023]Flag点击就送! 以及相关知识点

目录 [WUSTCTF 2020]朴实无华 [FSCTF 2023]源码!启动! [LitCTF 2023]Flag点击就送! 相关知识点 1.intval 绕过 绕过的方式: 2.session伪造攻击 [WUSTCTF 2020]朴实无华 1.进入页面几乎没什么可用的信息,所以想到使用dis…