使用tesseract.js在离线状态下进行验证码识别

发布于 2024-08-16  155 次阅读


Tesseract.js 是一个基于 JavaScript 的光学字符识别(OCR)库,它使开发者能够在浏览器中直接从图像中提取文本,而无需将图像上传到服务器进行处理。Tesseract.js 是对 Google 的 Tesseract OCR 引擎的 JavaScript 实现,并且可以在浏览器和 Node.js 环境中运行。

tesseract.js项目地址:https://github.com/naptha/tesseract.js

安装

首先安装tesseract.js库:

npm install tesseract.js
yarn add tesseract.js

tesseract.js默认会从CDN加载部分资源,而我们要进行离线状态下的识别,因此我们需要将语言(.gz格式)和核心保存至本地并指定路径。

 const worker = await createWorker('eng', 1, {
    langPath: './lang/',
    corePath: './core/'
});

语言包

tesseract.js-core

captcha_example                                 
├─ core                                
│ ├─ tesseract-core-lstm.wasm.js      
│ ├─ tesseract-core-simd-lstm.wasm.js  
│ ├─ tesseract-core-simd.wasm.js      
│ └─ tesseract-core.wasm.js            
└─ lang                                
  └─ eng.traineddata.gz                                                      

基本用法

这里使用某大学统一身份认证平台的纯数字验证码进行测试,因此导入英文语言包eng.traineddata即可。

验证码图片中间还有用于混淆的曲线,tesseract会将它识别为一些特殊符号,用正则表达式将他们过滤只保留数字即可。由于这里的验证码长度均为四位,所以过滤之后还可对最终保留下来的文本长度进行检查,位数不对直接返回false进行刷新验证码的操作,避免因为验证失败次数过多导致账号被风控。

示例代码:

const { createWorker } = require('tesseract.js');
​
async function getCaptcha(img) {
    console.log('开始识别验证码');
    try {
        const worker = await createWorker('eng', 1, {
            langPath: './lang/',
            corePath: './core/'
        });
​
        const ret = await worker.recognize(img);
        console.log('原始数据:' + ret.data.text);
        let result = ret.data.text.replace(/[^\d]/g, '');  //保留纯数字
        console.log('保留纯数字:' + result);
        if (result.length !== 4)
            return { success: false, msg: '验证码识别错误' };  //识别错误后进行刷新验证码的操作,避免验证失败次数过多
        await worker.terminate();
        return { success: true, msg: result };
    } catch (err) {
        return { success: false, msg: err.message };
    }
}
​
getCaptcha('./example.png'); //测试图片 可传base64图片
​
module.exports = getCaptcha;

编写代码使用puppeteer进行自动化登录测试:

经过多次测试后得出,对于简单的纯数字验证码识别tesseract.js的识别准确率可达90%

  • alipay_img
  • wechat_img
平芜尽处是春山
最后更新于 2024-08-16