python | 傻瓜式一键搭建图片验证码识别接口

前言

上一篇文章写了自己搭建环境、处理图片、识别验证码等具体操作(上一篇文章地址)。对于没有经验的小伙伴来说,还是比较麻烦的,而且如果训练集处理的不好,识别率会非常低,所以上一篇文章可以作为学习参考,使用的话,我个人觉得本篇文章比较适合入手。

首先感谢大佬的开源模块《带带弟弟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;
    }

运行结果:

python | 傻瓜式一键搭建图片验证码识别接口_第1张图片

可以看出,即使是有干扰的图片,该接口也可以迅速且准确的识别出来。

觉得本文对您有帮助的话,请动动发财的小手点个赞支持~

你可能感兴趣的:(python,python,深度学习,爬虫,web安全)