目前 chptcha 好像只可以生成纯数字的图像验证码,不过对于普通简单应用来说也足够了。captcha默认将store封装到内部,未提供对外操作的接口,因此使用自己显式生成的store,可以通过store自定义要生成的验证码。
package main
import (
"bytes"
"fmt"
"github.com/dchest/captcha"
"log"
"os"
)
// Captcha 方便后期扩展
type Captcha struct{}
// 单例
var captchaInstance *Captcha
func Instance() *Captcha {
if captchaInstance == nil {
captchaInstance = &Captcha{}
}
return captchaInstance
}
// CreateImage 创建图片验证码
func (this *Captcha) CreateImage() string {
length := captcha.DefaultLen
captchaId := captcha.NewLen(length)
return captchaId
}
// Reload 重载
func (this *Captcha) Reload(captchaId string) bool {
return captcha.Reload(captchaId)
}
// Verify 验证
func (this *Captcha) VerifyString(captchaId, val string) bool {
return captcha.VerifyString(captchaId, val)
}
func (this *Captcha) Verify(captchaId string, digits []byte) bool {
return captcha.Verify(captchaId, digits)
}
// GetImageByte 获取图片二进制流
func (this *Captcha) GetImageByte(captchaId string) []byte {
var content bytes.Buffer
err := captcha.WriteImage(&content, captchaId, captcha.StdWidth, captcha.StdHeight)
if err != nil {
log.Println(err)
return nil
}
return content.Bytes()
}
// WriteImageFile 写图片文件
func (this *Captcha) WriteImageFile(b []byte, file string) {
f, err := os.OpenFile(file, os.O_CREATE | os.O_RDWR, os.ModePerm)
defer f.Close()
if err != nil {
log.Println(err)
}
f.Write(b)
}
func main() {
// capt := Instance()
// captId := capt.CreateImage()
// capt.WriteImageFile(capt.GetImageByte(captId), "test.png")
// captcha默认将store封装到内部,未提供对外操作的接口
// 使用自己显式生成的store,可以通过store自定义要生成的图形验证码
store := captcha.NewMemoryStore(captcha.CollectNum, captcha.Expiration)
captcha.SetCustomStore(store)
capt := Instance()
captId := capt.CreateImage()
b := []byte{6, 6, 6, 8, 8, 8}
store.Set(captId, b)
// store.Set(captId, captcha.RandomDigits(6))
fmt.Println(store.Get(captId, false))
capt.WriteImageFile(capt.GetImageByte(captId), "test.png")
// vs := capt.VerifyString(captId, "666888")
v := capt.Verify(captId, b)
if v {
fmt.Println("verify succeed")
} else {
fmt.Println("verify failed")
}
}