用 Go 实现简洁的图像验证码识别服务(基础版)

本示例展示如何使用 Go 构建一个简洁的验证码识别 Web 服务。我们将实现一个 HTTP 接口,接收验证码图片,并返回识别结果(此处模拟,后期可接入真实模型)。

一、项目结构
更多内容访问ttocr.com或联系1436423940
captcha-service/
├── main.go
├── handler/
│ └── recognize.go
├── utils/
│ └── image.go
├── go.mod
二、初始化项目

mkdir captcha-service && cd captcha-service
go mod init captcha-service
go get github.com/nfnt/resize
三、识别接口 handler/recognize.go

package handler

import (
"captcha-service/utils"
"encoding/json"
"fmt"
"image"
"io"
"math/rand"
"net/http"
"strings"
"time"
)

func Recognize(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Only POST allowed", http.StatusMethodNotAllowed)
return
}

file, header, err := r.FormFile("image")
if err != nil {
	http.Error(w, "Image upload error", http.StatusBadRequest)
	return
}
defer file.Close()

img, err := utils.DecodeImage(file, header.Filename)
if err != nil {
	http.Error(w, "Image decode error", http.StatusUnsupportedMediaType)
	return
}

_ = processImage(img) // 真实模型处理位置

code := generateCode(4)

response := map[string]string{"code": code}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(response)

}

func processImage(img image.Image) string {
// 模拟处理,真实逻辑可加载模型推理
return "TODO"
}

func generateCode(length int) string {
rand.Seed(time.Now().UnixNano())
letters := []rune("ABCDEFGHJKLMNPQRSTUVWXYZ23456789")
var b strings.Builder
for i := 0; i < length; i++ {
b.WriteRune(letters[rand.Intn(len(letters))])
}
return b.String()
}
四、图像工具 utils/image.go

package utils

import (
"image"
"image/jpeg"
"image/png"
"mime/multipart"
"strings"

"github.com/nfnt/resize"

)

func DecodeImage(file multipart.File, filename string) (image.Image, error) {
var (
img image.Image
err error
)

if strings.HasSuffix(filename, ".png") {
	img, err = png.Decode(file)
} else {
	img, err = jpeg.Decode(file)
}

if err != nil {
	return nil, err
}

return resize.Resize(160, 60, img, resize.Lanczos3), nil

}
五、主程序 main.go

package main

import (
"captcha-service/handler"
"fmt"
"net/http"
)

func main() {
http.HandleFunc("/recognize", handler.Recognize)
fmt.Println("Server running at http://localhost:8080")
http.ListenAndServe(":8080", nil)
}
六、测试接口

curl -X POST -F "image=@captcha.png" http://localhost:8080/recognize
输出示例:

{"code":"7H3K"}

posted @ 2025-06-01 12:41  ttocr、com  阅读(18)  评论(0)    收藏  举报