在写自动化时,会遇到登录时需要设置验证码的问题,这时一般由两种方式:
方法一:请开发写一个万能验证码,直接登录即可;
方法一处理起来比较简单,不需要写代码处理,但是考虑到会有安全问题,部分项目无法适用,所以需要我们自己写代码读取并识别验证码。
方法二:写代码获取验证码,传入登录接口;
方法二主要是采用获取验证码图片+识别验证码,实现将验证码转换为字符串,传入登录接口即可。我这里的项目后端涉及到验证码base64转换,所以还会多一步解码过程。
环境配置
首先需要安装Tesseract-OCR、第三方库Pillow和pytesseract
安装Tesseract-OCR
下载地址:https://digi.bib.uni-mannheim.de/tesseract/
下载后直接安装,并配置环境变量
安装第三方库Pillow和pytesseract
pip3 install Pillow
pip3 install pytesseract
pip3 install tesseract
重启pycharm即可生效。
代码实现
总体思路如下:
获取base64加密的图片地址———>base64转换为图片——>图片写入文件——>识别验证码
# -*- coding: utf-8 -*-
from __future__ import print_function
from Common.handle_path import datas_dir
import base64
import requests
import pytesseract
from PIL import Image
"""获取登录页面base64加密验证码"""
url = "http://172.17.6.116:8001/api/user/kaptcha"
resp = requests.get(url)
im_base64_bytes = str.encode(resp.json()['data']['img']) # 获取的base64密文转换为bytes类型
im_base64_to_image = base64.b64decode(im_base64_bytes) # base64解码转换为图片
with open(datas_dir + r'/yzm.png', 'wb') as f: # 将图片写入文件yzm.png
f.write(im_base64_to_image)
f.close()
im = Image.open(datas_dir + r'/yzm.png')
im.show() # 将图片打开
text = pytesseract.image_to_string(im, lang='eng')
print(text)
运行结果与实际对比图如下:
代码识别的精确度有待提高,遇到比较复杂的可能读不准确甚至读不出来。。。后续再研究下怎么提高准确度吧
再附一个其他博主的代码,可参考学习,采取在页面获取图片xpath的方式完成,可供学习交流
from __future__ import print_function
from lxml import etree
import requests
import pytesseract
from PIL import Image
if __name__ == '__main__':
# 获取页面数据
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
page_text = requests.get(url=url).text
# 解析出页面中图片的地址
tree = etree.HTML(page_text)
cod_img_src = 'https://so.gushiwen.cn' + tree.xpath('//*[@id="imgCode"]/@src')[0]
cod_data = requests.get(url=cod_img_src).content
with open('./code.jpg', 'wb') as fp:
fp.write(cod_data)
text = pytesseract.image_to_string(Image.open(r'./code.jpg'))
print(text)
参考:https://www.jianshu.com/p/2db541800418