前言
上一篇文章写了自己搭建环境、处理图片、识别验证码等具体操作(上一篇文章地址)。对于没有经验的小伙伴来说,还是比较麻烦的,而且如果训练集处理的不好,识别率会非常低,所以上一篇文章可以作为学习参考,使用的话,我个人觉得本篇文章比较适合入手。
首先感谢大佬的开源模块《带带弟弟OCR通用验证码识别SDK免费开源版》
地址:https://pypi.org/project/ddddocr/
DDDDocr介绍
ddddocr是由sml2h3开发的专为验证码厂商进行对自家新版本验证码难易强度进行验证的一个python库,其由作者与kerlomz共同合作完成,通过大批量生成随机数据后进行深度网络训练,本身并非针对任何一家验证码厂商而制作,本库使用效果完全靠玄学,可能可以识别,可能不能识别。
ddddocr奉行着开箱即用、最简依赖的理念,尽量减少用户的配置和使用成本,希望给每一位测试者带来舒适的体验
项目地址: https://github.com/sml2h3/ddddocr
搭建准备工作
1.python3.9以下环境 (直接百度一大堆)
2.Windows/Linux/Macos(暂时不支持Macbook M1(X),M1(X)用户需要自己编译onnxruntime才可以使用)
3.需要用的的库
pip install uvicorn
pip install fastapi
pip install base64
pip install ddddocr
pip install PIL
准备工作做完,可以直接上代码了
代码实现
import uvicorn
from fastapi import FastAPI, Body
import base64
import ddddocr
from io import BytesIO
from PIL import Image
app = FastAPI(title='文档', description='by:juzi', version="1.0.4")
@app.post("/code", summary='识别图片内文字/字母', description='普通图片验证码识别,上传图片的Base64编码', tags=['图片验证码识别'])
def identify_GeneralCAPTCHA(ImageBase64: str = Body(..., title='验证码图片Bse64文本', embed=True)):
base64_data = base64.b64decode(ImageBase64)
ocr = ddddocr.DdddOcr(show_ad=False)
res = ocr.classification(base64_data)
return {"result": res}
@app.post("/math", summary='识别算术验证码', description='算术题验证码识别,上传图片的Base64编码,提供两个返回,solution_result为识别结果', tags=['图片验证码识别'])
def identify_ArithmeticCAPTCHA(ImageBase64: str = Body(..., title='验证码图片Bse64文本', embed=True)):
base64_data = base64.b64decode(ImageBase64)
ocr = ddddocr.DdddOcr(show_ad=False)
res = ocr.classification(base64_data)
print("res:---------->" + res)
if "+" or '-' or 'x' or '/' or '÷' or '*' not in res:
zhi = "Calculation error"
if '+' in res:
a = res.split('+')[0]
b = res.split('+')[1]
zhi = int(a) + int(b)
if '-' in res:
a = res.split('-')[0]
b = res.split('-')[1]
zhi = int(a) - int(b)
if 'x' in res:
a = res.split('x')[0]
b = res.split('x')[1]
zhi = int(a) * int(b)
if '/' in res:
a = res.split('/')[0]
b = res.split('/')[1]
zhi = int(a) / int(b)
if '÷' in res:
a = res.split('÷')[0]
b = res.split('÷')[1]
zhi = int(a) / int(b)
if '*' in res:
a = res.split('*')[0]
b = res.split('*')[1]
zhi = int(a) * int(b)
return {"solution_result": zhi,
"raw_result": res
}
if __name__ == '__main__':
# swagger地址:http://localhost:6688/docs
uvicorn.run(app, port=6688, host="0.0.0.0")
直接启动main函数,即可开始识别操作。
项目可以部署到服务器上,这样就只用搭建一次,随处调用
(此处因篇幅问题,只列举了字符和算数识别的代码。若需要滑块,点选等代码可以私聊作者)
效果测试
本次我用的是java来测试,模拟在爬虫时遇到的某网站图片验证码识别。
测试代码:
public static void main(String[] args) {
String validateUrl = "http://127.0.0.1:6688/code";//python项目启动的端口和路径
String codeUrl = "*****" //该地址为图片验证码路径,此处不做展示,请自行寻找测试;
String localSavePath = "D://codeTest.jpg";
saveImage(codeUrl, localSavePath);
String imgBase64 = GetImageStr(localSavePath);
JSONObject requestBody = new JSONObject();
requestBody.put("ImageBase64", imgBase64);
System.out.println(MyUtils.sendPost(validateUrl, requestBody.toJSONString(), null));
}
/**
* 保存接口响应图片
*
* @param codeRul :验证码接口地址
* @param savePath :本地保存地址
*/
public static void saveImage(String codeRul, String savePath) {
try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(codeRul).get().build();
// 将字节数组转化为流
InputStream inputStream = client.newCall(request).execute().body().byteStream();
OutputStream os = null;
// 100K的数据缓冲
byte[] bs = new byte[102400];
// 读取到的数据长度
int len;
// 保存图片
os = new FileOutputStream(savePath);
// 开始读取
while ((len = inputStream.read(bs)) != -1) {
os.write(bs, 0, len);
}
} catch (Exception e) {
System.out.println("保存失败");
e.printStackTrace();
}
}
/**
* 图片转化成base64字符串
*
* @param imgPath :图片绝对路径
* @return base64字符串
*/
public static String GetImageStr(String imgPath) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
String imgFile = imgPath;// 待处理的图片
InputStream in = null;
byte[] data = null;
String encode = null; // 返回Base64编码过的字节数组字符串
// 对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();
try {
// 读取图片字节数组
in = new FileInputStream(imgFile);
data = new byte[in.available()];
in.read(data);
encode = encoder.encode(data);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
}
}
return encode;
}
运行结果:
可以看出,即使是有干扰的图片,该接口也可以迅速且准确的识别出来。文章来源:https://www.toymoban.com/news/detail-689606.html
觉得本文对您有帮助的话,请动动发财的小手点个赞支持~文章来源地址https://www.toymoban.com/news/detail-689606.html
到了这里,关于python | 傻瓜式一键搭建图片验证码识别接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!