Go语言实现验证码文字提取:基于Tesseract的轻量级方案

  1. 项目背景

验证码的存在是为了防止自动化攻击,但在某些合法的自动化测试场景中,我们反而需要绕过它。与其手动输入,不如用代码识别。本文将介绍如何使用 Go 搭配 Tesseract 实现简单的验证码图像文字识别功能。

  1. 准备环境
    更多内容访问ttocr.com或联系1436423940
    Tesseract OCR 引擎(需提前安装)

Go 语言开发环境

OCR 封装库:github.com/otiai10/gosseract/v2

安装命令:

go get github.com/otiai10/gosseract/v2
确保你的系统中已安装 Tesseract,并可通过命令 tesseract -v 验证。

  1. 编写识别程序

以下代码完成从图像读取、灰度处理到文字识别的全过程:

package main

import (
"fmt"
"image"
"image/color"
"image/jpeg"
"os"

"github.com/otiai10/gosseract/v2"

)

func grayImage(img image.Image) *image.Gray {
bounds := img.Bounds()
gray := image.NewGray(bounds)

for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
	for x := bounds.Min.X; x < bounds.Max.X; x++ {
		r, g, b, _ := img.At(x, y).RGBA()
		luminance := uint8((r*299 + g*587 + b*114 + 500) / 1000 >> 8)
		gray.Set(x, y, color.Gray{Y: luminance})
	}
}
return gray

}

func main() {
// 加载原始验证码图像
file, err := os.Open("captcha.jpg")
if err != nil {
panic(err)
}
defer file.Close()

img, err := jpeg.Decode(file)
if err != nil {
	panic(err)
}

// 灰度处理后保存
gray := grayImage(img)
out, _ := os.Create("processed.jpg")
defer out.Close()
jpeg.Encode(out, gray, nil)

// 使用 Tesseract 识别
client := gosseract.NewClient()
defer client.Close()
client.SetImage("processed.jpg")

// 可根据验证码类型设置字符集,例如仅数字:
client.SetWhitelist("0123456789")

text, err := client.Text()
if err != nil {
	panic(err)
}

fmt.Println("验证码内容为:", text)

}
4. 说明与优化

灰度处理:有效提升 Tesseract 的识别准确率。

字符集限制:只识别数字、字母能显著减少误识别。

图像格式:尽量使用无损图像,如 PNG 或清晰的 JPEG。

  1. 应用场景

自动登录测试

内部系统数据填充

工具类脚本识别固定格式验证码

posted @ 2025-06-14 16:52  ttocr、com  阅读(25)  评论(0)    收藏  举报