python之web自动化验证码识别解决方案
验证码识别解决方案
对于web应用程序来讲,处于安全性考虑,在登录的时候,都会设置验证码,验证码的类型种类繁多,有图片中辨别数字字母的,有点击图片中指定的文字的,也有算术计算结果的,再复杂一点就是滑动验证的。诸如此类的验证码,对我们的系统增加了安全性的保障,但是对于我们测试人员来讲,在自动化测试的过程中,无疑是一个棘手的问题。
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安装程序下载地址:https://github.com/UB-Mannheim/tesseract/wik。
2)、加入培训数据
tesseract 默认只能识别英文,如果您想要识别其他语言,则需要下载相应的培训数据
下载地址:https://github.com/tesseract-ocr/tesseract/wiki/Data-Files,
下图为中文数据包
我们只做中文,暂时下载一个中文的文字训练数据就可以 ,然后将.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 安装
# 下载地址
http://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 = 'http://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 = 'http://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()
1
python之web自动化验证码识别解决方案的更多相关文章
- Java验证码识别解决方案
建库,去重,切割,识别. package edu.fzu.ir.test; import java.awt.Color; import java.awt.image.BufferedImage; im ...
- python使用tesseract-ocr完成验证码识别(模型训练和使用部分)
一.Tesseract训练 大体流程为:安装jTessBoxEditor -> 获取样本文件 -> Merge样本文件 –> 生成BOX文件 -> 定义字符配置文件 -> ...
- python selenium - web自动化环境搭建
前提: 安装python环境. 参考另一篇博文:https://www.cnblogs.com/Simple-Small/p/9179061.html web自动化:实现代码驱动浏览器进行点点点的操作 ...
- 【Java】验证码识别解决方案
对于类似以下简单的验证码的识别方案: 1. 2 3 4. 1.建库:切割验证码为单个字符,人工标记,比如:A. 2.识别:给一个验证码:切割为单个字符,在库中查询识别. /*** * author:c ...
- 使用Python基于OpenCV的验证码识别
Blog:https://blog.csdn.net/qq_40962368/article/details/89312429(Verification_Code_Identification) 步骤 ...
- python使用tesseract-ocr完成验证码识别
全自动区分计算机和人类的公开图灵测试(Completely Automated Public Turing test to tell Computers and Humans Apart) 简称CAP ...
- python selenium + web自动化,切换到新的窗口,元素定位不到?
问题描述: 自动化由首页切换到分页面,打开了一个新的窗口,不过,定位不到这个窗口的元素,通过开发者工具是可以查到这个元素的 原因是: 因为窗口句柄还停留在上一个页面,所以导致无法定位元素.报错 &qu ...
- python使用tesseract-ocr完成验证码识别(安装部分)
一.tesseract-ocr安装 Ubuntu版本: 1.tesseract-ocr安装 sudo apt-get install tesseract-ocr 2.pytesseract安装 sud ...
- 【Python web自动化】之读取配置文件参数,利用cookie返回值进行跳过验证码进行登录操作
当进行Python的Web自动化时,会涉及到验证码问题,该如何跳过执行呢,下面请看代码: 1.首先新建配置文件*.ini格式 config.ini [db] #基础地址: baseurl = http ...
随机推荐
- 搭建oj平台
欢迎使用https://github.com/QingdaoU/OnlineJudgeDeploy
- Excel催化剂开源第33波-Quick Bible For PPT插件项目全代码开源
很感恩,能够在上帝奇妙地带领下,经过多方的资源整合后,可以从我手中完成一款对教会内部制作PPT过程中,引用圣经的这个小环节能够发挥一些小小的作用的小插件.因制作本插件时,也大量用到VSTO开发的一些技 ...
- easypermissions的基本使用
转载请注明出处 http://blog.csdn.net/pyfysf/article/details/78204395 Android 6.0(API 级别 23)开始,在应用运行时向其授予权限,而 ...
- C#3.0新增功能09 LINQ 基础06 LINQ 查询操作中的类型关系
连载目录 [已更新最新开发文章,点击查看详细] 若要有效编写查询,应了解完整的查询操作中的变量类型是如何全部彼此关联的. 如果了解这些关系,就能够更容易地理解文档中的 LINQ 示例和代码示例. ...
- C#3.0新增功能09 LINQ 基础07 LINQ 中的查询语法和方法语法
连载目录 [已更新最新开发文章,点击查看详细] 介绍性的语言集成查询 (LINQ) 文档中的大多数查询是使用 LINQ 声明性查询语法编写的.但是在编译代码时,查询语法必须转换为针对 .NET ...
- [leetcode] 486. Predict the Winner (medium)
原题 思路: 解法一: 转换比较拿取分数多少的思路,改为考虑 player拿的分数为正,把Player2拿的视为负,加上所有分数,如果最后结果大于0则Player1赢. 思考得出递归表达式: max( ...
- C#编程之自动实现的属性
在 C# 3.0 及更高版本,当属性访问器中不需要任何其他逻辑时,自动实现的属性会使属性声明更加简洁.它们还允许客户端代码创建对象.当你声明以下示例中所示的属性时,编译器将创建仅可以通过该属性的 ge ...
- 【Algorithm】插入排序法
通常人们整理桥牌的方法是一张一张的来,将每一张插入到其他已经有序的牌中的适当位置. • 思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的序列的合适位置,直到全部插入排序完为止. Jav ...
- 用python twilio模块实现发手机短信的功能
前排提示:这个模块不是用于对陌生人进行短信轰炸和电话骚扰的,这个模块也没有这个功能,如果是抱着这个心态来的,可以关闭网页了 语言:python 步骤一:安装twilio模块 pip install t ...
- zabbix监控WEB网站性能
一直在纠结用什么实例来给大家演示呢?想来想去还是官方的好,那我们怎么用zabbix监控web性能和可用性呢?我们这边分为几个步骤:打开网站.登陆.登陆验证.退出,一共4个小step,看实例. 检测流程 ...