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

 

验证码识别解决方案

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

 

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

通常在咱们测试过程当中,登陆遇到上述的验证码的时候,有如下种解决方案:python

  • 第一种、让开发去掉验证码
  • 第二种、设置一个万能的验证码
  • 第三种、经过cookie绕过登陆
  • 第四种、自动识别技术识别验证码

 

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

前三种解决方案,想必你们都比较了解,本文重点阐述第四种解决方案,也就是验证码的自动识别,关于验证码识别这一块,能够经过两个方案来解决,git

  • 第一种是:OCR自动识别技术,
  • 第二种是:经过第三方打码平台的接口来识别。

OCR识别技术

OCR中文名称光学识别, tesseract是一个有名的开源OCR识别框架,它与Leptonica图片处理库结合,能够读取各类格式的图像并将它们转化成超过60种语言的文本,能够不断训练本身的识别库,使图像转换文本的能力不断加强。若是团队深度须要,还能够以它为模板,开发出符合自身需求的OCR引擎。那么接下来给你们介绍一下如何使用tessract来识别咱们的验证码。github

关于OCR自动识别这一块,须要你们安装Tesseract,并配置好环境,步骤以下

1)、安装tesseractweb

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

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

2)、加入培训数据浏览器

tesseract 默认只能识别英文,若是您想要识别其余语言,则须要下载相应的培训数据安全

下载地址:https://github.com/tesseract-ocr/tesseract/wiki/Data-Filescookie

  • 下图为中文数据包

咱们只作中文,暂时下载一个中文的文字训练数据就能够 ,而后将.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)

    第三方接口给你们介绍到这里,接下来咱们实际应用到登陆中去。

    提示:打码平台通常都是收费的(差很少是一分钱,识别一次)

三、自动识别验证码登陆案例

  • 登陆案例

    接下来以超级鹰这个网站为列,使用web自动化测试框架selenium来实现验证码识别自动登陆,

  • 须要用到的库有selenium、pillow、time,和咱们上面下载的超级鹰的接口文件
  • 环境安装
    • 一、selenium安装
      pip install selenium
    • 二、chromedriver 安装
      # 下载地址
      http://chromedriver.storage.googleapis.com/index.html
      • 下载和本身chrome浏览器对应的chromedriver版本,
      • 配置环境变量
    • 三、pillow模块安装(处理图像的库)
      pip install pillow

     

  • 实现步骤分析

  • 一、获取帐号密码输入框:输入帐号密码

  • 二、获取验证码图片
    • 将当前页面截图
    • 选择图片元素,获取上下左右位置
    • 使用PIL模块对页面图片进行再次截图(获取验证码图片)
    • 将验证码图片保存
  • 三、调用第三方接口识别验证码
  • 四、输入验证码结果
  • 五、点击登陆

    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)  # 暂停一秒钟
    • 二、获取帐号密码输入框:输入帐号密码
      # 选择帐号、密码输入栏,输入对应的帐号密码
      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
        • 获取验证码上下左右的位置,此处要注意查看电脑显示的缩放比列(以下图),根据比列乘以相应的系数,我这边的显示比列是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')
    • 三、调用第三方接口识别验证码
      # 识别验证码
      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)
    • 四、输入验证码结果
      # 在输入框输入验证码
      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()

       

 


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

相关文章
相关标签/搜索