基于 Node.js 与 Tesseract.js 的验证码识别系统设计与实现

news/2025/12/3 23:55:27/文章来源:https://www.cnblogs.com/ocr12/p/19304382

一、项目背景

验证码(CAPTCHA)广泛用于防止恶意行为,如刷票、注册机等。传统验证码识别依赖 Python 等语言,但前端开发者也可以使用 JavaScript 完成 OCR 工作。本文介绍如何使用 Node.js 与浏览器版 Tesseract.js 实现一套轻量级验证码识别系统。

二、技术栈选择
技术 用途
Node.js 后端运行环境
Tesseract.js OCR 识别库(Web 版本)
Express.js 提供简单 API 接口
Jimp 图像处理(灰度化、二值化)
三、项目环境准备

  1. 安装 Node.js

官网下载安装:https://nodejs.org/

  1. 初始化项目并安装依赖
    mkdir captcha-ocr-js
    cd captcha-ocr-js
    npm init -y

npm install express tesseract.js jimp multer
更多内容访问ttocr.com或联系1436423940
四、项目结构
captcha-ocr-js/
├── index.js # 主程序
├── uploads/ # 上传验证码的临时文件夹
└── package.json

五、核心代码实现

  1. index.js
    const express = require('express');
    const multer = require('multer');
    const Jimp = require('jimp');
    const Tesseract = require('tesseract.js');
    const fs = require('fs');

const app = express();
const port = 3000;

const upload = multer({ dest: 'uploads/' });

app.post('/upload', upload.single('captcha'), async (req, res) => {
const imagePath = req.file.path;

// 加载并预处理图像
const image = await Jimp.read(imagePath);
image.grayscale()      // 灰度处理.contrast(1)      // 增强对比度.write(imagePath); // 覆盖保存// OCR 识别
const { data: { text } } = await Tesseract.recognize(imagePath,'eng',{logger: m => console.log(m) // 可选:输出进度}
);fs.unlinkSync(imagePath); // 删除临时文件
res.json({ result: text.trim() });

});

app.listen(port, () => {
console.log(验证码识别服务运行于 http://localhost:${port});
});

六、测试

  1. 启动服务
    node index.js

  2. 使用 curl 或 Postman 测试上传
    curl -F "captcha=@./test.png" http://localhost:3000/upload

返回:

{
"result": "4Gk7"
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/986161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用 Rust 和 Leptess 构建轻量级验证码识别工具

一、引言 在验证码识别领域,主流方案多以 Python 为主,但对于追求性能、安全性与资源控制的开发者而言,Rust 是一门理想语言。本文将介绍如何使用 Rust 与 Leptess(Tesseract 的 Rust 封装)实现一个基础的验证码识…

12.2 HTML

<img srcset="small.jpg 480w, medium.jpg 800w, large.jpg 1200w" sizes="(max-width: 600px) 100vw, (max-width: 900px) 50vw, 33vw" src="medium.jpg" alt="自适应图片&quo…

WIN11系统环境松灵机器人SCOUT2.0底盘CAN通信控制测试

WIN11系统环境松灵机器人SCOUT2.0底盘CAN通信控制测试参考资料 用户手册 https://new.agilex.ai/raw/upload/20230718/SCOUT 2.0用户手册20230718_74677.pdf 如何通过开源SDK控制松灵机器人SCOUT底盘? https://blo…

软工团队作业4

作业信息这个作业属于哪个课程 首页 - 计科23级34班 - 广东工业大学 - 班级博客 - 博客园这个作业要求在哪里 团队作业4——项目冲刺 - 作业 - 计科23级34班 - 班级博客 - 博客园这个作业的目标 进行项目七天敏捷冲刺七…

使用Frp+Caddy把https映射到内网的web服务

使用Frp+Caddy把https映射到内网的web服务Posted on 2025-12-03 23:40 火冰瓶 阅读(0) 评论(0) 收藏 举报1. frps.tomltomlbindPort = 7000# 开启 http 虚拟主机代理 vhostHTTPPort = 8080 vhostHTTPSPort = 8443…

刷题日记—前缀和

1.基本前缀和与差分思想 2.前缀和的拓展——前缀乘法—左右区间乘积的前后累乘。点击查看代码 ```cpp #include <iostream> #include<vector> using namespace std; //这道题实际上是前缀和的拓展,前缀乘…

第五十四篇

今天是12月3号,上了离散和马原

AI元人文:理论与技术的协同进化框架

AI元人文:理论与技术的协同进化框架 AI元人文构想理论体系聚焦于AI应用中的高维度价值权衡。其实行不仅需要借助AI作为计算与模拟平台来验证复杂模型,更依赖于AI作为最终的载体与执行体,将理论架构转化为实际运作的…

Flutter 安卓测试运行

一、Android Studio创建并启动 Android 模拟器二、Android Studio加速 1.配置国内代理2.settings.gradle.kts增加国内镜像源 pluginManagement {val flutterSdkPath =run {val properties = java.util.Properties()fil…

第七篇Scrum冲刺

第七篇Scrum冲刺 站立式会议照:昨天已完成工作:成员 工作郭涛 #106 设计商店购买逻辑,编写金币扣除逻辑区泽明 #206 完善伤害系统与生命值的联动袁智燊 #306 设计不同难度敌机的生成逻辑梁法恩 #406 设计商店UI的交…

今日趣事

今天和朋友们吃完饭,打车回去学校,我们在车上聊天,我的朋友说之前坐绿皮火车幸好没有遇到臭脚味的,结果我们下车之后,我坐在前面的同学说她在调整桌椅的时候看到司机没有穿鞋子,光着脚开车,啊啊啊啊啊,我就说这…

高德地图_使用PlaceSearch查找指定名称的POI

1. 初始化PlaceSearch使用new AMap.PlaceSearch初始化placeSearch实例 可以使用city与citylimit配置来限定搜索结果在指定的城市范围内let $placeSearch = null function initPlaceSearch() {$placeSearch = new AMap.…

团队作业4——学生信息管理系统

项目冲刺这个作业属于哪个课程 广工-计算机科学与技术-2023级这个作业要求在哪里 团队作业4:敏捷冲刺这个作业的目标 <执行为期七天的敏捷冲刺>项目仓库 https://gitee.com/C35121/Students-Information-Manage…

01-IFoxCAD概述与入门

第一章:IFoxCAD概述与入门 1.1 IFoxCAD简介 1.1.1 什么是IFoxCAD IFoxCAD是一个基于.NET的AutoCAD/中望CAD二次开发类库,它是由落魄山人基于雪山飞狐(狐哥)的NFox类库重构而来的开源项目。IFoxCAD的命名寓意为&quo…

昌江019通道维修

第一次在博客园上记录自己毕业之后第二次出差维修工作生活,希望能够有所长进。 这次维修比以前在漳州更加麻烦: 11.25刚开始设备失效换了信号线就恢复正常,但是过了40小时,从主控上看数据直接从36HZ涨到300HZ; 11…

lucas定理求组合数+错排模板

int jc[M]; int f[M];int ksm(int a,int b){int res=1;while(b){if(b&1)res=res*a%mod;a=a*a%mod;b>>=1;}return res%mod; } int c(int a,int b){return jc[a]%mod*ksm(jc[b]*jc[a-b]%mod,mod-2)%mod; } int…