python识别验证码

对于验证码这个问题,通常我们可以采取以下三个途径来解决该问题: 

1、第一种方法,在被测系统中暂时屏蔽验证功能。

即临时修改应用,无论用户输入的是什么验证码,都认为是正确的。

优点:这种方法最容易实现,对测试结果也不会有太大的影响(当然,这种方式去掉了“验证验证码”这个环节,不过这个环节本来就很难成为系统性能瓶颈)。

缺点:但这种方法有一个致命的问题:如果被测系统是一个实际已上线的系统,屏蔽验证功能会对已经在运行的业务造成非常大的安全性的风险,因此,对于已上线的系统来说,用这种方式就不合适了;     

2、第二种方法,留一个后门,我们设定一个所谓的“万能验证码”,只要用户输入这个“万能验证码”,我们就验证通过,否则,还是按照原先的验证方式进行验证。

这种方法在第一种方法的基础上稍微进行一些改进。第一种方法带来了很大的安全性问题,那么我们可以考虑,不取消验证,但在其中这种方式仍然存在安全性的问题,但由于我们可以通过管理手段将“万能验证码”控制在一个小的范围内,而且只在性能测试期间保留这个小小的后门,相对第一种方法来说,在安全性方面已经有较大的改进了;     

3、写一个验证码获取的DLL,在测试脚本中进行调用即可。

验证码也在不断的进步。在获取验证码的时候,我们需要根据验证码的难易程度进行。  

识别验证码:需要使用到pillow,pytesseract、tesseract-ocr.

pillow

PIL (Python Image Library) 是 Python 平台处理图片的标准库,兼具强大的功能和简洁的 API。但是目前PIL最新版本是1.1.7(PIL官方网站:http://www.pythonware.com/products/pil/

该版本只支持python2.4、2.5、2.6、2.7。看了网上相关资料后,使用了Pillow。 Pillow 库则是 PIL 的一个分支,维护和开发活跃,Pillow 兼容 PIL 的绝大多数语法,推荐使用。

Pillow的Github主页:https://github.com/python-pillow/Pillow

Pillow的文档(对应版本v3.0.0):https://pillow.readthedocs.org/en/latest/handbook/index.html

Pillow的文档中文翻译(对应版本v2.4.0):http://pillow-cn.readthedocs.org/en/latest/

Pillow的安装:

方法一:在pycharm环境中直接安装。

 方法二:使用pip进行安装:pip install Pillow

 pytesseract

pytesseract安装

方法一;

在pycharm环境中直接安装。

方法二:pip install pytesseract

真实案例的使用

 

代码如下:

from selenium import webdriver
import time
from PIL import Image
import pytesseract
driver=webdriver.Chrome()
driver.get("http://www.xxx.com/index.html#/user/login")
time.sleep(3)
driver.find_element_by_id('userName').send_keys("iotqy")#输入登录账户
driver.find_element_by_id("password").send_keys("123456")#输入登录密码

driver.save_screenshot('e://hbgj_login.png')#截取当前网页,该网页有我们需要的验证码
yzm=driver.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/div/form/div[1]/span/span/span[2]/div') #定位验证码
location=yzm.location#获取验证码x,y轴坐标
size=yzm.size#获取验证码的长宽
rangle=(int(location['x']),int(location['y']),int(location['x']+size['width']),int(location['y']+size['height']))#截取的位置坐标
i=Image.open('e://hbgj_login.png') #打开截图
frame4=i.crop(rangle)#使用Image的crop函数,从截图中再次截取我们需要的区域
frame4.save("e://yzm.jpg")#将截取到的验证码保存为jpg图片
qq=Image.open("e://yzm.jpg")#打开jpg验证码图片
text=pytesseract.image_to_string(qq).strip()#使用image_to_string识别验证码
driver.find_element_by_name("code").send_keys(text)#将识别的图片验证码信息输入到验证码输入文本框中

driver.find_element_by_xpath('//*[@id="root"]/div/div[1]/div[2]/div/form/div[3]/div/div/span/button').click()#点击登录按钮

=====================================================================================================================================

出现的问题:

1、KeyError: 'RGBA'

   OSError: cannot write mode RGBA as JPEG

解决办法:将截取到的验证码由jpg格式改为png格式。

改动如下:

 2、上诉改动后,出现新的错误

FileNotFoundError: [WinError 2] 系统找不到指定的文件。

pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in your path

解决办法:安装tesseract-ocr

 OCR(Optical Character Recognition, 光学字符识别) 软件

安装包含两个部分:ORC引擎本身以及对应语言的训练数据

github地址:   https://github.com/tesseract-ocr/tesseract

windows:

The latest installer can be downloaded here: tesseract-ocr-setup-3.05.01.exe and tesseract-ocr-setup-4.00.00dev.exe (experimental).

下载安装包tesseract-ocr-setup-3.05.01.exe,安装到默认路径:C:Program Files (x86)Tesseract-OCR

安装tesseract-ocr完成后:处理方式中任选一。

①处理方法一:把安装路径(C:Program Files (x86)Tesseract-OCR)添加到环境变量PATH中去

②处理方法二:修改pytesseract.py文件,指定tesseract.exe安装路径

tesseract_cmd = 'C:\Program Files (x86)\Tesseract-OCR\tesseract.exe‘

③处理方法三:在实际运行代码中指定

pytesseract.pytesseract.tesseract_cmd = 'C:\Program Files (x86)\Tesseract-OCR\tesseract.exe'

 OCR自动识别-识别验证码图片,识别过程:截取登录页面->获取验证码的位置坐标->打开截图->从截图中截取验证码的区域->使用pytesseract工具识别验证码

原文地址:https://www.cnblogs.com/benpao1314/p/9999283.html