用 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"}
浙公网安备 33010602011771号