应用场景:在测试接口时,需要先自动执行登录接口,登录接口需要输入图片中的字符验证码。
实现的步骤主要有以下几步:
一、执行/captcha接口,从接口响应中提取图形验证码的base64编码值;
二、去掉base64编码值中的格式部分,data:image\/png;base64,截取到图片的编码值;
三、对的base64编码转成验证图片;
四、利用ddddocr识别验证码上的字符;
实现的代码如下:
import base64
import ddddocr
import requests
from PIL import Image
def get_code():
"""识别出登录接口中图像验证码上的字符"""
# 请求接口,解析响应中的base64编码数据
url = "https://xxxxxxx/api/captcha"
res = requests.request("post", url).json()
res_data = res['data']['url']
# key = res_data['key'] # 解析响应中的key
base64_data = res_data['img'] # 解析验证码的base64编码数据
# 对的base64编码转换成图片
data = base64_data.split(',')[1] # 去掉编码数据中的data:image\/png;base64
# print(data)
img_data = base64.b64decode(data) # 解码
with open('./img.png', 'wb') as png: # 打开图片
png.write(img_data) # 保存图片
# 利用ddddocr识别验证码图片上的字符
ocr = ddddocr.DdddOcr() # 实例化对象
with open('./img.png', 'rb') as f:
img_bytes = f.read() # 读取图片
code = ocr.classification(img_data) # 识别图片上的字符
print('验证码: ', code)
if __name__ == '__main__':
get_code()
遇到的问题:
1、 报错: AttributeError: module 'PIL.Image' has no attribute 'ANTIALIAS'
解决方法:
# 修改ddddocr的_init_.py文件,将其中的ANTIALIAS替换为LANCZOS:
# image = image.resize((int(image.size[0] * (64 / image.size[1])), 64), Image.ANTIALIAS).convert('L')
image = image.resize((int(image.size[0] * (64 / image.size[1])), 64), Image.LANCZOS).convert('L')
2、代码执行后报:"欢迎使用ddddocr,本项目专注带动行业内卷,个人博客:wenanzhe.com......"
解决方法:
# 修改ddddocr的_init_.py文件,将show_ad修改成False:
class DdddOcr(object):
def __init__(self, ocr: bool = True, det: bool = False, old: bool = False, beta: bool = False, use_gpu: bool = False,
device_id: int = 0, show_ad=False, import_onnx_path: str = "", charsets_path: str = ""):
if show_ad:
print("欢迎使用ddddocr,本项目专注带动行业内卷,个人博客:wenanzhe.com")
print("训练数据支持来源于:http://146.56.204.113:19199/preview")
print("爬虫框架feapder可快速一键接入,快速开启爬虫之旅:https://github.com/Boris-code/feapder")
print("谷歌reCaptcha验证码 / hCaptcha验证码 / funCaptcha验证码商业级识别接口:https://yescaptcha.com/i/NSwk7i")