golang支持数字字母算术音频验证码生成插件库base64Captcha的使用

Golang支持数字字母算术音频验证码生成插件库base64Captcha的使用

base64Captcha是一个灵活的验证码生成库,支持数字、字母、算术和音频验证码的生成。

1. 快速开始

1.1 安装包

go get -u github.com/mojocn/base64Captcha

对于中国大陆用户,如果无法获取golang.org/x/image,可以设置代理:

export GOPROXY=https://goproxy.io

2. 基本使用

2.1 实现Store接口或使用内置内存存储

type Store interface {
    // Set sets the digits for the captcha id.
    Set(id string, value string)

    // Get returns stored digits for the captcha id. Clear indicates
    // whether the captcha must be deleted from the store.
    Get(id string, clear bool) string
    
    //Verify captcha's answer directly
    Verify(id, answer string, clear bool) bool
}

2.2 实现Driver接口或使用内置驱动

内置驱动包括:

  • DriverDigit - 数字验证码
  • DriverString - 字符串验证码
  • DriverMath - 数学验证码
  • DriverChinese - 中文验证码
// Driver captcha interface for captcha engine to to write staff
type Driver interface {
    //DrawCaptcha draws binary item
    DrawCaptcha(content string) (item Item, err error)
    //GenerateIdQuestionAnswer creates rand id, content and answer
    GenerateIdQuestionAnswer() (id, q, a string)
}

2.3 核心代码示例

package main

import (
    "encoding/json"
    "fmt"
    "github.com/mojocn/base64Captcha"
    "log"
    "net/http"
)

//configJsonBody json request body.
type configJsonBody struct {
    Id            string
    CaptchaType   string
    VerifyValue   string
    DriverAudio   *base64Captcha.DriverAudio
    DriverString  *base64Captcha.DriverString
    DriverChinese *base64Captcha.DriverChinese
    DriverMath    *base64Captcha.DriverMath
    DriverDigit   *base64Captcha.DriverDigit
}

var store = base64Captcha.DefaultMemStore

// 生成验证码处理函数
func generateCaptchaHandler(w http.ResponseWriter, r *http.Request) {
    // 解析请求参数
    decoder := json.NewDecoder(r.Body)
    var param configJsonBody
    err := decoder.Decode(&param)
    if err != nil {
        log.Println(err)
    }
    defer r.Body.Close()
    var driver base64Captcha.Driver

    // 根据类型创建验证码
    switch param.CaptchaType {
    case "audio":
        driver = param.DriverAudio
    case "string":
        driver = param.DriverString.ConvertFonts()
    case "math":
        driver = param.DriverMath.ConvertFonts()
    case "chinese":
        driver = param.DriverChinese.ConvertFonts()
    default:
        driver = param.DriverDigit
    }
    c := base64Captcha.NewCaptcha(driver, store)
    id, b64s, err := c.Generate()
    body := map[string]interface{}{"code": 1, "data": b64s, "captchaId": id, "msg": "success"}
    if err != nil {
        body = map[string]interface{}{"code": 0, "msg": err.Error()}
    }
    w.Header().Set("Content-Type", "application/json; charset=utf-8")
    json.NewEncoder(w).Encode(body)
}

// 验证验证码处理函数
func captchaVerifyHandle(w http.ResponseWriter, r *http.Request) {
    // 解析请求参数
    decoder := json.NewDecoder(r.Body)
    var param configJsonBody
    err := decoder.Decode(&param)
    if err != nil {
        log.Println(err)
    }
    defer r.Body.Close()
    
    // 验证验证码
    body := map[string]interface{}{"code": 0, "msg": "failed"}
    if store.Verify(param.Id, param.VerifyValue, true) {
        body = map[string]interface{}{"code": 1, "msg": "ok"}
    }

    // 设置JSON响应
    w.Header().Set("Content-Type", "application/json; charset=utf-8")
    json.NewEncoder(w).Encode(body)
}

func main() {
    // 静态文件服务
    http.Handle("/", http.FileServer(http.Dir("./static")))

    // 生成验证码API
    http.HandleFunc("/api/getCaptcha", generateCaptchaHandler)

    // 验证验证码API
    http.HandleFunc("/api/verifyCaptcha", captchaVerifyHandle)

    fmt.Println("Server is at :8777")
    if err := http.ListenAndServe(":8777", nil); err != nil {
        log.Fatal(err)
    }
}

3. 自定义验证码

你可以通过实现DriverItem接口来自定义验证码的显示样式。

4. 许可证

base64Captcha采用Apache License 2.0许可证。


更多关于golang支持数字字母算术音频验证码生成插件库base64Captcha的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang支持数字字母算术音频验证码生成插件库base64Captcha的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang 数字字母算术音频验证码生成插件库 - base64Captcha 使用指南

base64Captcha 是一个强大的 Golang 验证码生成库,支持数字、字母、算术和音频验证码,并能将验证码以 Base64 格式输出,非常适合 Web 应用开发。

安装

go get github.com/mojocn/base64Captcha

基本使用示例

1. 数字验证码

package main

import (
	"fmt"
	"github.com/mojocn/base64Captcha"
)

func main() {
	// 配置数字验证码参数
	digit := base64Captcha.DriverDigit{
		Height:   80,
		Width:    240,
		Length:   5,
		MaxSkew:  0.7,
		DotCount: 80,
	}
	
	// 生成验证码
	id, b64s, answer, err := digit.GenerateIdQuestionAnswer()
	if err != nil {
		fmt.Println("生成验证码失败:", err)
		return
	}
	
	// 存储验证码ID和答案(通常存入数据库或缓存)
	fmt.Println("验证码ID:", id)
	fmt.Println("验证码答案:", answer)
	
	// 返回给前端的Base64图片
	fmt.Println("Base64图片:", b64s)
}

2. 字母验证码

func generateCharCaptcha() {
	// 配置字母验证码参数
	char := base64Captcha.DriverString{
		Height:          60,
		Width:           240,
		NoiseCount:      50,
		ShowLineOptions: base64Captcha.OptionShowSineLine | base64Captcha.OptionShowSlimeLine,
		Length:          6,
		Source:          "1234567890qwertyuiopasdfghjklzxcvbnm",
		BgColor:         &color.RGBA{R: 255, G: 255, B: 255, A: 255},
		Fonts:           []string{"wqy-microhei.ttc"},
	}
	
	// 生成验证码
	id, b64s, answer, err := char.GenerateIdQuestionAnswer()
	if err != nil {
		fmt.Println("生成验证码失败:", err)
		return
	}
	
	fmt.Println("验证码ID:", id)
	fmt.Println("验证码答案:", answer)
	fmt.Println("Base64图片:", b64s)
}

3. 算术验证码

func generateMathCaptcha() {
	// 配置算术验证码参数
	math := base64Captcha.DriverMath{
		Height:          60,
		Width:           240,
		NoiseCount:      10,
		ShowLineOptions: base64Captcha.OptionShowHollowLine,
	}
	
	// 生成验证码
	id, b64s, answer, err := math.GenerateIdQuestionAnswer()
	if err != nil {
		fmt.Println("生成验证码失败:", err)
		return
	}
	
	fmt.Println("验证码ID:", id)
	fmt.Println("验证码答案:", answer)
	fmt.Println("Base64图片:", b64s)
}

4. 音频验证码

func generateAudioCaptcha() {
	// 配置音频验证码参数
	audio := base64Captcha.DriverAudio{
		Length:   6,
		Language: "zh",
	}
	
	// 生成验证码
	id, b64s, answer, err := audio.GenerateIdQuestionAnswer()
	if err != nil {
		fmt.Println("生成验证码失败:", err)
		return
	}
	
	fmt.Println("验证码ID:", id)
	fmt.Println("验证码答案:", answer)
	fmt.Println("Base64音频:", b64s)
}

验证码验证

func verifyCaptcha(id, answer string) bool {
	// 创建验证码存储(实际项目中应该使用Redis等持久化存储)
	store := base64Captcha.DefaultMemStore
	
	// 验证验证码
	return store.Verify(id, answer, true)
}

完整Web示例

package main

import (
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/mojocn/base64Captcha"
	"net/http"
)

var store = base64Captcha.DefaultMemStore

// 获取验证码
func getCaptcha(c *gin.Context) {
	// 配置验证码驱动
	driver := base64Captcha.DriverDigit{
		Height:   80,
		Width:    240,
		Length:   5,
		MaxSkew:  0.7,
		DotCount: 80,
	}
	
	// 生成验证码
	captcha := base64Captcha.NewCaptcha(&driver, store)
	id, b64s, err := captcha.Generate()
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"code":    500,
			"message": "生成验证码失败",
		})
		return
	}
	
	c.JSON(http.StatusOK, gin.H{
		"code":      200,
		"captchaId": id,
		"image":     b64s,
	})
}

// 验证验证码
func verifyCaptcha(c *gin.Context) {
	type request struct {
		CaptchaId string `json:"captchaId"`
		Answer    string `json:"answer"`
	}
	
	var req request
	if err := c.ShouldBindJSON(&req); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"code":    400,
			"message": "参数错误",
		})
		return
	}
	
	// 验证验证码
	if store.Verify(req.CaptchaId, req.Answer, true) {
		c.JSON(http.StatusOK, gin.H{
			"code":    200,
			"message": "验证码正确",
		})
	} else {
		c.JSON(http.StatusOK, gin.H{
			"code":    400,
			"message": "验证码错误",
		})
	}
}

func main() {
	r := gin.Default()
	
	r.GET("/captcha", getCaptcha)
	r.POST("/verify", verifyCaptcha)
	
	fmt.Println("Server running at :8080")
	r.Run(":8080")
}

高级配置

自定义存储

// 自定义存储实现
type RedisStore struct {
	client *redis.Client
}

func (s *RedisStore) Set(id string, value string) {
	s.client.Set(id, value, time.Minute*5) // 5分钟过期
}

func (s *RedisStore) Get(id string, clear bool) string {
	val, err := s.client.Get(id).Result()
	if err != nil {
		return ""
	}
	if clear {
		s.client.Del(id)
	}
	return val
}

func (s *RedisStore) Verify(id, answer string, clear bool) bool {
	return s.Get(id, clear) == answer
}

// 使用自定义存储
func setupWithRedisStore() {
	redisClient := redis.NewClient(&redis.Options{
		Addr:     "localhost:6379",
		Password: "",
		DB:       0,
	})
	
	store := &RedisStore{client: redisClient}
	
	driver := base64Captcha.DriverDigit{
		Height:   80,
		Width:    240,
		Length:   5,
		MaxSkew:  0.7,
		DotCount: 80,
	}
	
	captcha := base64Captcha.NewCaptcha(&driver, store)
	// 使用captcha生成和验证验证码...
}

注意事项

  1. 生产环境中应该使用Redis等持久化存储替代默认的内存存储
  2. 验证码长度不宜过长,通常4-6位即可
  3. 可以调整验证码的复杂度参数防止机器识别
  4. 验证码应该有合理的过期时间
  5. 前端应该限制验证码的尝试次数防止暴力破解

base64Captcha 是一个功能全面且易于集成的验证码库,通过上述示例你可以快速将其集成到你的Golang应用中。

回到顶部