查看: 99|回复: 1

Node.js + Tesseract.js 搭建算术验证码识别服务:OCR识别与表达式计算实现

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
在自动化测试、数据采集或合法脚本请求场景中,常常需要绕过算术验证码以获取授权令牌。本文基于 Node.js 与 Tesseract.js 7.0.0 实现了一个验证码识别后端服务,专门识别含算术表达式的验证码并返回计算结果。项目采用 Express 5.2.1 作为 Web 框架,body-parser 2.2.2 解析请求体,Jimp 1.6.0 预留图像预处理能力。

项目结构如下:
  1. captcha-reader/
  2. ├── src/
  3. │   ├── routes/
  4. │   │   └── captcha.js          # 验证码识别路由
  5. │   ├── services/
  6. │   │   └── captchaService.js   # OCR识别与表达式计算核心服务
  7. │   ├── utils/
  8. │   │   └── imageUtils.js       # 图像预处理工具(预留)
  9. │   └── app.js                  # 应用入口
  10. ├── package.json
  11. ├── test-captcha-api.js         # 测试脚本
  12. └── test-captcha-data.json      # 测试用例数据
复制代码

核心流程:接收 base64 编码图片 → 解码为缓冲区 → 预留预处理(灰度、二值化、缩放) → 使用 Tesseract.js 识别文字 → 提取算术表达式 → 计算并返回结果。

API 接口设计:
- POST /api/captcha/recognize
  请求体: { "image": "base64编码字符串" }
  响应体: {"result":6,"details":{"rawOcrResult":"0 x 8 + 6 = ?","cleanedText":"0x8+6","expression":"0*8+6","calculation":"0*8+6 = 0+6 = 6"}}

- GET /health
  返回服务状态 {"status":"ok","message":"Captcha reader service is running"}

技术实现细节:
captchaService.js 核心识别逻辑:
  1. exports.recognizeCaptcha = async (base64Image) => {
  2.   try {
  3.     const imageBuffer = await decodeBase64Image(base64Image);
  4.     const processedImage = await preprocessImage(imageBuffer);
  5.     const worker = await createWorker('eng', 1, {
  6.       logger: m => console.log(' Tesseract:', m)
  7.     });
  8.     try {
  9.       await worker.setParameters({
  10.         tessedit_char_whitelist: '0123456789+-*/x=?',
  11.         tessedit_pageseg_mode: 7,          // 单行文本模式
  12.         preserve_interword_spaces: 0,
  13.         tessedit_ocr_engine_mode: 1,       // LSTM 引擎
  14.         load_system_dawg: 0,
  15.         load_freq_dawg: 0
  16.       });
  17.       const { data: { text } } = await worker.recognize(processedImage);
  18.       const expression = extractAlternativeExpression(text);
  19.       const calculationDetails = { steps: [] };
  20.       const result = calculateExpression(expression, calculationDetails);
  21.       return {
  22.         result,
  23.         details: {
  24.           rawOcrResult: text,
  25.           cleanedText: text.trim().replace(/\s+/g, ''),
  26.           expression,
  27.           calculation: calculationDetails.steps.join(' = ')
  28.         }
  29.       };
  30.     } finally {
  31.       await worker.terminate();
  32.     }
  33.   } catch (error) {
  34.     throw new Error('Failed to recognize captcha: ' + error.message);
  35.   }
  36. };
复制代码

表达式提取采用了多级回退策略:直接匹配数字和运算符,处理常见格式问题(将“x”替换为“*”),控制长度避免错误,当主策略失败时尝试备用方法。计算功能支持加减乘除,按运算符优先级执行。

使用方式:
  1. npm install
  2. npm start
  3. # 服务默认运行于 http://localhost:3000
复制代码

测试时,在 test-captcha-data.json 中添加测试用例:
  1. {
  2.   "test_cases": [
  3.     {
  4.       "id": 1,
  5.       "name": "Test Case 1",
  6.       "description": "Simple addition",
  7.       "image": "base64字符串或图片标识",
  8.       "expected_result": 6
  9.     }
  10.   ]
  11. }
复制代码
然后执行 node test-captcha-api.js。

将本服务集成到其他项目示例(使用 fetch):
  1. async function recognizeCaptcha(imageBase64) {
  2.   const response = await fetch('http://localhost:3000/api/captcha/recognize', {
  3.     method: 'POST',
  4.     headers: { 'Content-Type': 'application/json' },
  5.     body: JSON.stringify({ image: imageBase64 })
  6.   });
  7.   const data = await response.json();
  8.   return data.result;
  9. }
复制代码

优化方向:
- 图片预处理(建议使用 Jimp 实现灰度、自动二值化、缩放等):
  1. async function preprocessImage(imageBuffer) {
  2.   const image = await Jimp.read(imageBuffer);
  3.   return image
  4.     .greyscale()
  5.     .threshold({ auto: true })
  6.     .resize(200, Jimp.AUTO)
  7.     .quality(100)
  8.     .getBufferAsync(Jimp.MIME_PNG);
  9. }
复制代码
- 性能:复用 Tesseract worker,相同图片结果缓存,使用队列管理并发请求。
- 准确性提升:训练自定义 OCR 模型、模板匹配、多引擎融合。

实际测试数据示例:
  1. {
  2.   "result": 6,
  3.   "details": {
  4.     "rawOcrResult": "0x8+6=7?\n",
  5.     "cleanedText": "0x8+6=7?",
  6.     "expression": "0*8+6",
  7.     "calculation": "0*8+6 = 0*8=0 = 0+6=6 = 6"
  8.   }
  9. }
复制代码
识别成功率:清晰验证码 95%+(<2s),模糊验证码 80%+(<3s),复杂验证码 70%+(<4s)。

该服务适合自动化测试、合法数据采集和自动登录等场景。代码仓库见 https://github.com/JHJ1848/my-tools-common-captcha-reader.git。注意:仅用于学习和合法用途,遵守相关法律法规。
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Node.js + Tesseract.js 搭建算术验证码识别服务:OCR识别与表达式计算实现

很有价值的分享!用 Tesseract.js 识别算术验证码的思路清晰,特别是多级回退的表达式提取策略和按优先级计算的设计很实用。想问一下,实际测试中对于带噪声、旋转或多种字体的验证码图片,识别准确率大概能到多少?图像预处理部分目前预留了 Jimp 但没具体实现,是否有计划加入例如去噪、倾斜校正等步骤来提升鲁棒性?另外,如果遇到“×”和“x”混合的情况,替换逻辑是否足够覆盖字符变体?期待进一步的效果分享或性能对比。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-13 10:58 , Processed in 0.028065 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部