Go语言实现验证码文字提取:基于Tesseract的轻量级方案
- 项目背景
验证码的存在是为了防止自动化攻击,但在某些合法的自动化测试场景中,我们反而需要绕过它。与其手动输入,不如用代码识别。本文将介绍如何使用 Go 搭配 Tesseract 实现简单的验证码图像文字识别功能。
- 准备环境
更多内容访问ttocr.com或联系1436423940
Tesseract OCR 引擎(需提前安装)
Go 语言开发环境
OCR 封装库:github.com/otiai10/gosseract/v2
安装命令:
go get github.com/otiai10/gosseract/v2
确保你的系统中已安装 Tesseract,并可通过命令 tesseract -v 验证。
- 编写识别程序
以下代码完成从图像读取、灰度处理到文字识别的全过程:
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。
- 应用场景
自动登录测试
内部系统数据填充
工具类脚本识别固定格式验证码
浙公网安备 33010602011771号