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

这篇具有很好参考价值的文章主要介绍了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,python,深度学习,爬虫,web安全

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

觉得本文对您有帮助的话,请动动发财的小手点个赞支持~文章来源地址https://www.toymoban.com/news/detail-689606.html

到了这里,关于python | 傻瓜式一键搭建图片验证码识别接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包