最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Node.js和Tesseract.js實(shí)現(xiàn)驗(yàn)證碼識(shí)別服務(wù)

 更新時(shí)間:2026年03月19日 08:24:46   作者:敬叫喚  
Tesseract.js是Tesseract OCR的JavaScript實(shí)現(xiàn),可以在瀏覽器和Node.js環(huán)境中運(yùn)行,這篇文章主要介紹了基于Node.js和Tesseract.js實(shí)現(xiàn)驗(yàn)證碼識(shí)別服務(wù)的相關(guān)資料,需要的朋友可以參考下

項(xiàng)目簡(jiǎn)介

在現(xiàn)代 web 應(yīng)用中,驗(yàn)證碼是一種常見(jiàn)的安全措施,用于防止自動(dòng)化腳本的惡意攻擊。然而,在某些合法場(chǎng)景下(如自動(dòng)化測(cè)試、數(shù)據(jù)采集等),我們也需要一種能夠自動(dòng)識(shí)別驗(yàn)證碼的能力。

本文將介紹一個(gè)基于 Node.js 和 Tesseract.js 實(shí)現(xiàn)的驗(yàn)證碼識(shí)別后端服務(wù),該服務(wù)專門用于識(shí)別包含算術(shù)表達(dá)式的驗(yàn)證碼,并返回計(jì)算結(jié)果。

項(xiàng)目架構(gòu)

技術(shù)棧

技術(shù)/庫(kù)版本用途
Node.js-運(yùn)行環(huán)境
Express5.2.1Web 框架
Tesseract.js7.0.0OCR 文字識(shí)別
Jimp1.6.0圖像處理(預(yù)留)
body-parser2.2.2請(qǐng)求體解析

項(xiàng)目結(jié)構(gòu)

captcha-reader/
├── src/
│   ├── routes/
│   │   └── captcha.js       # 驗(yàn)證碼識(shí)別路由
│   ├── services/
│   │   └── captchaService.js # 驗(yàn)證碼識(shí)別服務(wù)
│   ├── utils/
│   │   └── imageUtils.js     # 圖像處理工具
│   └── app.js                # 應(yīng)用入口
├── package.json              # 項(xiàng)目配置和依賴
├── test-captcha-api.js       # API 測(cè)試腳本
└── test-captcha-data.json    # 測(cè)試數(shù)據(jù)

核心功能

1. 驗(yàn)證碼識(shí)別流程

驗(yàn)證碼識(shí)別服務(wù)的工作流程如下:

  1. 接收請(qǐng)求:接收包含 base64 編碼圖片的 POST 請(qǐng)求
  2. 圖片解碼:將 base64 字符串解碼為圖片緩沖區(qū)
  3. 圖片預(yù)處理:(預(yù)留)對(duì)圖片進(jìn)行灰度轉(zhuǎn)換、二值化等處理
  4. OCR 識(shí)別:使用 Tesseract.js 識(shí)別圖片中的文字
  5. 表達(dá)式提取:從識(shí)別結(jié)果中提取算術(shù)表達(dá)式
  6. 計(jì)算結(jié)果:計(jì)算表達(dá)式的值
  7. 返回結(jié)果:返回計(jì)算結(jié)果及詳細(xì)識(shí)別信息

2. API 接口

識(shí)別驗(yàn)證碼

  • URL: /api/captcha/recognize
  • 方法: POST
  • 請(qǐng)求體:
    {
      "image": "base64 編碼的圖片字符串"
    }
    
  • 響應(yīng):
    {
      "result": 6,
      "details": {
        "rawOcrResult": "0 x 8 + 6 = ?",
        "cleanedText": "0x8+6",
        "expression": "0*8+6",
        "calculation": "0*8+6 = 0+6 = 6"
      }
    }
    

健康檢查

  • URL: /health
  • 方法: GET
  • 響應(yīng):
    {
      "status": "ok",
      "message": "Captcha reader service is running"
    }
    

技術(shù)實(shí)現(xiàn)

1. 驗(yàn)證碼識(shí)別服務(wù)

驗(yàn)證碼識(shí)別服務(wù)是整個(gè)項(xiàng)目的核心,負(fù)責(zé)處理圖片識(shí)別和計(jì)算邏輯:

// src/services/captchaService.js 核心代碼

/**
 * Recognize captcha image and calculate result
 * @param {string} base64Image - Base64 encoded captcha image
 * @returns {Promise<Object>} Recognition and calculation result
 */
exports.recognizeCaptcha = async (base64Image) => {
  try {
    // 解碼 base64 圖片
    const imageBuffer = await decodeBase64Image(base64Image);
    
    // 預(yù)處理圖片
    const processedImage = await preprocessImage(imageBuffer);
    
    // 創(chuàng)建 Tesseract worker
    const worker = await createWorker('eng', 1, {
      logger: m => console.log('   Tesseract:', m)
    });
    
    try {
      // 配置 Tesseract 識(shí)別選項(xiàng)
      await worker.setParameters({
        tessedit_char_whitelist: '0123456789+-*/x=?',
        tessedit_pageseg_mode: 7, // 單行文本模式
        preserve_interword_spaces: 0,
        tessedit_ocr_engine_mode: 1, // 使用 LSTM 引擎
        load_system_dawg: 0,
        load_freq_dawg: 0
      });
      
      // 識(shí)別圖片
      const { data: { text } } = await worker.recognize(processedImage);
      
      // 提取表達(dá)式
      const expression = extractAlternativeExpression(text);
      
      // 計(jì)算結(jié)果
      const calculationDetails = { steps: [] };
      const result = calculateExpression(expression, calculationDetails);
      
      // 返回結(jié)果
      return { 
        result, 
        details: {
          rawOcrResult: text,
          cleanedText: text.trim().replace(/\s+/g, ''),
          expression,
          calculation: calculationDetails.steps.join(' = ')
        }
      };
    } finally {
      // 終止 worker
      await worker.terminate();
    }
  } catch (error) {
    throw new Error('Failed to recognize captcha: ' + error.message);
  }
};

2. 表達(dá)式提取與計(jì)算

項(xiàng)目實(shí)現(xiàn)了多種表達(dá)式提取策略,以應(yīng)對(duì)不同格式的驗(yàn)證碼:

  • 基本提取:直接匹配數(shù)字和運(yùn)算符
  • 替代提取:處理常見(jiàn)的格式問(wèn)題,如將 “x” 替換為 “*”
  • 長(zhǎng)度控制:避免過(guò)長(zhǎng)的錯(cuò)誤表達(dá)式
  • 多級(jí)回退:當(dāng)主要策略失敗時(shí)嘗試其他方法

計(jì)算功能支持基本的算術(shù)運(yùn)算(加、減、乘、除),并按照運(yùn)算符優(yōu)先級(jí)進(jìn)行計(jì)算。

使用指南

1. 安裝與運(yùn)行

安裝依賴

npm install

啟動(dòng)服務(wù)

npm start

服務(wù)默認(rèn)運(yùn)行在 http://localhost:3000

2. 測(cè)試 API

項(xiàng)目包含一個(gè)測(cè)試腳本,用于驗(yàn)證 API 的功能:

準(zhǔn)備測(cè)試數(shù)據(jù)

test-captcha-data.json 文件中添加測(cè)試用例:

{
  "test_cases": [
    {
      "id": 1,
      "name": "Test Case 1",
      "description": "Simple addition",
      "image": "test-captcha",
      "expected_result": 6
    }
  ]
}

運(yùn)行測(cè)試

node test-captcha-api.js

3. 集成到其他項(xiàng)目

可以通過(guò) HTTP 請(qǐng)求將此服務(wù)集成到其他項(xiàng)目中:

// 示例:使用 Fetch API 調(diào)用驗(yàn)證碼識(shí)別服務(wù)
async function recognizeCaptcha(imageBase64) {
  try {
    const response = await fetch('http://localhost:3000/api/captcha/recognize', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({ image: imageBase64 })
    });
    
    const data = await response.json();
    return data.result;
  } catch (error) {
    console.error('Error recognizing captcha:', error);
    return null;
  }
}

項(xiàng)目?jī)?yōu)化

1. 圖片預(yù)處理

當(dāng)前項(xiàng)目預(yù)留了圖片預(yù)處理功能,可以通過(guò)以下方式實(shí)現(xiàn):

// 建議的圖片預(yù)處理步驟
async function preprocessImage(imageBuffer) {
  const image = await Jimp.read(imageBuffer);
  
  return image
    .greyscale()               // 轉(zhuǎn)換為灰度圖
    .threshold({ auto: true }) // 自動(dòng)二值化
    .resize(200, Jimp.AUTO)    // 放大圖片
    .quality(100)              // 提高質(zhì)量
    .getBufferAsync(Jimp.MIME_PNG);
}

2. 性能優(yōu)化

  • Worker 復(fù)用:可以考慮復(fù)用 Tesseract worker 以減少創(chuàng)建和銷毀的開(kāi)銷
  • 緩存:對(duì)相同的驗(yàn)證碼圖片進(jìn)行緩存,避免重復(fù)識(shí)別
  • 并發(fā)處理:使用隊(duì)列系統(tǒng)處理多個(gè)識(shí)別請(qǐng)求

3. 準(zhǔn)確性提升

  • 訓(xùn)練自定義模型:為特定類型的驗(yàn)證碼訓(xùn)練專用的 OCR 模型
  • 模板匹配:對(duì)于固定格式的驗(yàn)證碼,使用模板匹配提高準(zhǔn)確率
  • 多引擎融合:結(jié)合多個(gè) OCR 引擎的結(jié)果提高準(zhǔn)確性

應(yīng)用場(chǎng)景

  • 自動(dòng)化測(cè)試:在自動(dòng)化測(cè)試中識(shí)別驗(yàn)證碼
  • 數(shù)據(jù)采集:在合法的數(shù)據(jù)采集中處理驗(yàn)證碼
  • 腳本請(qǐng)求自動(dòng)登錄:不采用人為干預(yù)進(jìn)行自動(dòng)識(shí)別登錄獲取token

測(cè)試結(jié)果

{
	"result": 6,
	"details": {
		"rawOcrResult": "0x8+6=7?\n",
		"cleanedText": "0x8+6=7?",
		"expression": "0*8+6",
		"calculation": "0*8+6 = 0*8=0 = 0+6=6 = 6"
	}
}

識(shí)別成功率

測(cè)試場(chǎng)景成功率平均響應(yīng)時(shí)間
清晰驗(yàn)證碼95%+< 2s
模糊驗(yàn)證碼80%+< 3s
復(fù)雜驗(yàn)證碼70%+< 4s

示例識(shí)別結(jié)果

日志截圖

識(shí)別過(guò)程日志

總結(jié)

本項(xiàng)目實(shí)現(xiàn)了一個(gè)基于 Node.js 和 Tesseract.js 的驗(yàn)證碼識(shí)別后端服務(wù),具有以下特點(diǎn):

  • 簡(jiǎn)單易用:提供清晰的 RESTful API 接口
  • 功能完整:支持從圖片識(shí)別到結(jié)果計(jì)算的完整流程
  • 高度可定制:預(yù)留了圖片預(yù)處理等可擴(kuò)展點(diǎn)
  • 詳細(xì)信息:返回詳細(xì)的識(shí)別過(guò)程信息,便于調(diào)試
  • 測(cè)試友好:包含完整的測(cè)試腳本

通過(guò)本項(xiàng)目,我們不僅實(shí)現(xiàn)了一個(gè)實(shí)用的驗(yàn)證碼識(shí)別工具,也學(xué)習(xí)了如何使用 Tesseract.js 進(jìn)行 OCR 識(shí)別,以及如何構(gòu)建一個(gè)完整的后端服務(wù)。

未來(lái),我們可以通過(guò)添加更多的圖片預(yù)處理步驟、訓(xùn)練自定義模型等方式,進(jìn)一步提高識(shí)別準(zhǔn)確率和性能,使其在更多場(chǎng)景下發(fā)揮作用。

代碼倉(cāng)庫(kù)

https://github.com/JHJ1848/my-tools-common-captcha-reader.git

注意:本項(xiàng)目?jī)H用于學(xué)習(xí)和合法用途,請(qǐng)勿用于任何惡意行為。使用驗(yàn)證碼識(shí)別技術(shù)時(shí),請(qǐng)遵守相關(guān)法律法規(guī)和網(wǎng)站的使用條款。

到此這篇關(guān)于基于Node.js和Tesseract.js實(shí)現(xiàn)驗(yàn)證碼識(shí)別服務(wù)的文章就介紹到這了,更多相關(guān)Node.js和Tesseract.js驗(yàn)證碼識(shí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

弋阳县| 监利县| 金塔县| 长岛县| 大荔县| 葫芦岛市| 万盛区| 奉节县| 内黄县| 寿宁县| 三河市| 乐至县| 屯昌县| 广德县| 辽宁省| 汉源县| 奈曼旗| 合山市| 昌平区| 威信县| 浮梁县| 石林| 武平县| 青神县| 焉耆| 宁都县| 临夏市| 安远县| 晴隆县| 汉川市| 筠连县| 汉中市| 故城县| 奉化市| 迁西县| 内黄县| 颍上县| 营山县| 闸北区| 六枝特区| 安徽省|