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

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

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

安装

首先安装tesseract.js库:

1
2
npm install tesseract.js  
yarn add tesseract.js

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

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

语言包

tesseract.js-core

1
2
3
4
5
6
7
8
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进行刷新验证码的操作,避免因为验证失败次数过多导致账号被风控。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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%

 Comments
Comment plugin failed to load
Loading comment plugin
本站已支持IPv6