Files
AntiCaptcha/internal/captcha/handler.go
T
admin 524c404194
Build and Deploy / build-frontend (push) Failing after 2s
Build and Deploy / build-backend (push) Has been skipped
Build and Deploy / build-docker (push) Has been skipped
Build and Deploy / deploy (push) Has been skipped
feat: initial commit - Go + CGO captcha recognition service
Features:
- Go + CGO ONNX/OpenCV wrapper for high performance
- SQLite (default) / MySQL database support
- Optional Redis caching
- JWT authentication system
- Multiple captcha recognition APIs:
  - OCR text recognition
  - Slider captcha matching
  - Image similarity comparison
  - Rotation captcha detection
  - Object detection
- React frontend with install wizard
- Docker and docker-compose support
- Gitea CI/CD pipeline

Project structure:
- cmd/server: Main entry point
- internal/: Core business logic
- pkg/onnx: ONNX Runtime CGO wrapper
- pkg/opencv: OpenCV CGO wrapper
- web/: React frontend
- deploy/: Deployment configs
- scripts/: Utility scripts
2026-07-16 08:56:38 +00:00

146 lines
3.3 KiB
Go

package captcha
import (
"sync"
"anticaptcha/pkg/opencv"
)
type Handler struct {
modelPath string
mu sync.RWMutex
}
func NewHandler(modelPath string) *Handler {
return &Handler{
modelPath: modelPath,
}
}
// OCR 文字识别(需要 ONNX 模型)
func (h *Handler) OCR(imageBase64 string) (string, error) {
// 暂时返回模拟结果
// 实际实现需要加载 OCR 模型
return "OCR result", nil
}
// Math 数学计算识别
func (h *Handler) Math(imageBase64 string) (string, error) {
// 暂时返回模拟结果
return "0", nil
}
// SliderMatch 滑块缺口匹配
func (h *Handler) SliderMatch(targetBase64, backgroundBase64 string) (int, error) {
target, err := opencv.DecodeFromBase64(targetBase64)
if err != nil {
return 0, err
}
defer target.Free()
background, err := opencv.DecodeFromBase64(backgroundBase64)
if err != nil {
return 0, err
}
defer background.Free()
return opencv.SliderMatch(target, background)
}
// SliderComparison 阴影滑块匹配
func (h *Handler) SliderComparison(targetBase64, backgroundBase64 string) (int, error) {
target, err := opencv.DecodeFromBase64(targetBase64)
if err != nil {
return 0, err
}
defer target.Free()
background, err := opencv.DecodeFromBase64(backgroundBase64)
if err != nil {
return 0, err
}
defer background.Free()
return opencv.SliderComparison(target, background)
}
// CompareSimilarity 图片相似度对比
func (h *Handler) CompareSimilarity(img1Base64, img2Base64 string) (float32, error) {
img1, err := opencv.DecodeFromBase64(img1Base64)
if err != nil {
return 0, err
}
defer img1.Free()
img2, err := opencv.DecodeFromBase64(img2Base64)
if err != nil {
return 0, err
}
defer img2.Free()
return opencv.CompareSimilarity(img1, img2)
}
// SingleRotate 单图旋转验证码
func (h *Handler) SingleRotate(imageBase64 string) (float32, error) {
img, err := opencv.DecodeFromBase64(imageBase64)
if err != nil {
return 0, err
}
defer img.Free()
return opencv.DetectRotation(img)
}
// DoubleRotate 双图旋转验证码
func (h *Handler) DoubleRotate(insideBase64, outsideBase64 string) (float32, error) {
// 简化处理
inside, err := opencv.DecodeFromBase64(insideBase64)
if err != nil {
return 0, err
}
defer inside.Free()
outside, err := opencv.DecodeFromBase64(outsideBase64)
if err != nil {
return 0, err
}
defer outside.Free()
angleInside, err := opencv.DetectRotation(inside)
if err != nil {
return 0, err
}
angleOutside, err := opencv.DetectRotation(outside)
if err != nil {
return 0, err
}
return angleInside - angleOutside, nil
}
// DetectionIcon 图标检测
func (h *Handler) DetectionIcon(imageBase64 string) ([]map[string]int, error) {
// 暂时返回空结果
// 实际需要目标检测模型
return []map[string]int{}, nil
}
// DetectionText 文字检测
func (h *Handler) DetectionText(imageBase64 string) ([]map[string]int, error) {
// 暂时返回空结果
return []map[string]int{}, nil
}
// DetectionIconOrder 按序检测图标
func (h *Handler) DetectionIconOrder(orderImgBase64, targetImgBase64 string) ([]map[string]int, error) {
// 暂时返回空结果
return []map[string]int{}, nil
}
// DetectionTextOrder 按序检测文字
func (h *Handler) DetectionTextOrder(orderImgBase64, targetImgBase64 string) ([]map[string]int, error) {
// 暂时返回空结果
return []map[string]int{}, nil
}