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;
    }

运行结果:

在这里插入图片描述

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

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

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要使用 Python Selenium 调用阿里 API 实现图片验证码识别,您需要先注册阿里云账户并开通 OCR 服务。然后,您可以按照以下步骤进行操作: 1. 安装阿里云 Python SDK 您可以使用以下命令进行安装: ``` pip install aliyun-python-sdk-core-v3 pip install aliyun-python-sdk-ocr ``` 2. 在 Python 中调用 OCR API 以下是一个示例代码,它可以将本地图片文件上传到阿里云 OCR 服务,并返回识别结果: ```python from aliyunsdkcore.client import AcsClient from aliyunsdkocr.request.v20191230 import RecognizeCharacterRequest # 阿里云 OCR API 配置 access_key_id = 'your_access_key_id' access_key_secret = 'your_access_key_secret' region_id = 'cn-shanghai' product_name = 'ocr' domain = 'ocr.cn-shanghai.aliyuncs.com' # 初始化阿里云 client client = AcsClient(access_key_id, access_key_secret, region_id) # 读取本地图片文件 with open('captcha.png', 'rb') as f: image_data = f.read() # 构造 OCR API 请求 request = RecognizeCharacterRequest.RecognizeCharacterRequest() request.set_ImageURL(image_data) request.set_accept_format('json') # 调用 OCR API 进行识别 response = client.do_action(request) # 解析识别结果 result = response.decode('utf-8') print(result) ``` 在上面的示例代码中,`access_key_id` 和 `access_key_secret` 是您的阿里云账户的 Access Key ID 和 Access Key Secret,`region_id` 是 OCR 服务所在的地域,`product_name` 是 OCR 服务的产品名称,`domain` 是 OCR 服务的 API 域名。 需要注意的是,OCR 服务支持的图片格式有限,只支持 JPEG、JPG、PNG、BMP 等常见格式。另外,OCR 服务的免费配额较低,需要购买更多的调用次数才能满足大规模的识别需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值