web 自动化之验证码识别解决方案

本贴最后更新于 1569 天前,其中的信息可能已经时移世改

验证码识别解决方案

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

image.png

1、web自动化验证码解决方案

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

2、自动识别技术识别验证码

前三种解决方案,想必大家都比较了解,本文重点阐述第四种解决方案,也就是验证码的自动识别,关于验证码识别这一块,可以通过两个方案来解决,

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,

image.png

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

3)、配置环境变量

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

pip install pytesseract

安装好后。找一张验证码图片,如下图(命名为test.jpg),放在当前python文件同级目录下面,

image.png

使用 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来讲,优势在于识别的精准度高,网络上的第三方打码平台很多,百度随便一搜就有几十个,这个给大家列举几个,如下所示:

image.png

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

首先登录我们需要注册登录超级鹰这个网站 www.chaojiying.com,进入之后我们找到python对应的开发文档并下载,

image.png

image.png

image.png

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

image.png

第二行代码就是打开一个要识别的验证码图片,并读取内容,

第三行,调用PostPic方法识别验证码,两个参数(验证码图片内容,验证码类型),关于验证码类型,请参考该网站的价格体系(如下图),根据验证码类型选择对应的数值传入。
image.png

结果提取:

PostPic返回的是一个字典类型的数据,识别的验证码在该字典中的pic_str这个键中

res = cjy.PostPic(im, 1902)  # 1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()
data = res['pic_str'] 
print(data)

第三方接口给大家介绍到这里,接下来我们实际应用到登录中去。

提示:打码平台一般都是收费的(差不多是一分钱,识别一次)

3、自动识别验证码登录案例

image.png

image.png

完整代码如下(账号密码自行修改):

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('账号')
input_pwd = browser.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[2]/input')
input_pwd.send_keys('密码')
# 获取验证码的图片,并进行识别,将识别的结果,输入到验证码输入框中
# 对当前页面进行截图
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('账号', '密码', '软件ID')  # 用户中心>>软件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 操作
mslemonban 在 2020-08-06 17:48:55 更新了该帖
53 回帖
请输入回帖内容 ...
  • sarch

    大佬就是牛+863

  • 其他回帖
  • zjing306

    from chaojiying import Chaojiying_Client
    为什么要这样导入,需要安装第三方库么 ,我这边显示红色波浪线

  • sarch

    大佬就是牛+175

  • test123

    文章通俗易懂,内容很有用

  • 查看更多回帖