Java 实战:构建一个验证码识别微服务
在后台管理系统、数据采集任务中,经常会遇到验证码拦截自动化操作。为了解决这个问题,我们可以使用 Java 构建一个轻量级的验证码识别微服务,供多个应用调用,从而实现验证码的自动化识别。
一、技术选型
Java 17:现代 Java 开发环境,支持更强的性能优化。
Spring Boot:构建微服务框架,方便快速启动 HTTP 服务。
Tess4J:Tesseract OCR 的 Java 封装,用于图像文字识别。
Maven:依赖管理和构建工具。
二、项目结构概览
captcha-ocr-service/
├── src/
│ └── main/
│ ├── java/
│ │ └── com.example.ocr/
│ │ ├── CaptchaController.java
│ │ ├── CaptchaService.java
│ │ └── ImageUtils.java
│ └── resources/
│ └── application.yml
└── pom.xml
三、核心功能实现
- ImageUtils.java:图像处理
public class ImageUtils {
public static BufferedImage preprocess(BufferedImage image) {
BufferedImage gray = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
Graphics2D g = gray.createGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();
return gray;
}
}
2. CaptchaService.java:验证码识别逻辑
@Service
public class CaptchaService {
public String recognize(BufferedImage image) throws TesseractException {
ITesseract tesseract = new Tesseract();
tesseract.setDatapath("tessdata"); // 放置 tessdata 文件夹的位置
tesseract.setLanguage("eng");
tesseract.setPageSegMode(7);
tesseract.setTessVariable("tessedit_char_whitelist", "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
return tesseract.doOCR(ImageUtils.preprocess(image)).replaceAll("\s+", "");
}
}
3. CaptchaController.java:上传接口
@RestController
@RequestMapping("/api/ocr")
public class CaptchaController {
@Autowired
private CaptchaService captchaService;
@PostMapping("/captcha")
public ResponseEntity<String> recognizeCaptcha(@RequestParam("file") MultipartFile file) throws IOException, TesseractException {
BufferedImage image = ImageIO.read(file.getInputStream());
String result = captchaService.recognize(image);
return ResponseEntity.ok(result);
}
}
四、配置文件 application.yml
server:
port: 8081
spring:
servlet:
multipart:
max-file-size: 2MB
max-request-size: 2MB
五、运行项目
启动 Spring Boot 项目
使用 curl 或 Postman 测试上传图片:
curl -F "file=@captcha.png" http://localhost:8081/api/ocr/captcha
六、进一步优化
部署为 Docker 容器,方便在各个环境中运行
增加日志与错误处理逻辑
添加缓存机制避免重复识别同一图像
为特定验证码场景训练自定义 Tesseract 模型