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(¶m)
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(¶m)
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. 自定义验证码
你可以通过实现Driver
和Item
接口来自定义验证码的显示样式。
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生成和验证验证码...
}
注意事项
- 生产环境中应该使用Redis等持久化存储替代默认的内存存储
- 验证码长度不宜过长,通常4-6位即可
- 可以调整验证码的复杂度参数防止机器识别
- 验证码应该有合理的过期时间
- 前端应该限制验证码的尝试次数防止暴力破解
base64Captcha
是一个功能全面且易于集成的验证码库,通过上述示例你可以快速将其集成到你的Golang应用中。