当前位置: 首页 > news >正文

Go 之 captcha 生成图像验证码

目前 chptcha 好像只可以生成纯数字的图像验证码,不过对于普通简单应用来说也足够了。captcha默认将store封装到内部,未提供对外操作的接口,因此使用自己显式生成的store,可以通过store自定义要生成的验证码。

package mainimport ("bytes""fmt""github.com/dchest/captcha""log""os"
)// Captcha 方便后期扩展
type Captcha struct{}// 单例
var captchaInstance *Captchafunc Instance() *Captcha {if captchaInstance == nil {captchaInstance = &Captcha{}}return captchaInstance
}// CreateImage 创建图片验证码
func (this *Captcha) CreateImage() string {length := captcha.DefaultLencaptchaId := 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.Buffererr := 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")}
}

 

http://www.lryc.cn/news/234128.html

相关文章:

  • 【Java从入门到大牛】多线程
  • UE5 C++报错:is not currently enabled for Live Coding
  • mysql服务器数据同步
  • Docker Golang 开发环境搭建指南
  • MFC保存窗口客户区为图片
  • JAVA安全之Shrio550-721漏洞原理及复现
  • 有Mac或无Mac电脑通用的获取安卓公钥的方案
  • 电池故障估计:Realistic fault detection of li-ion battery via dynamical deep learning
  • 微服务和Spring Cloud Alibaba介绍
  • 【js】 lodash命名转换和封装
  • RK3568驱动指南|第七篇 设备树-第67章 of操作函数实验:获取属性
  • vue3安装vue-router
  • 〖大前端 - 基础入门三大核心之JS篇㊱〗- JavaScript 的DOM节点操作
  • 【计算机基础】优雅的PPT就应该这样设计
  • Vatee万腾的科技征程:Vatee数字化创新的前沿探讨
  • 【PB续命05】WinHttp.WinHttpRequest的介绍与使用
  • 【Linux】进程间是这样通信的--管道篇
  • Python基础入门例程60-NP60 跳过列表的某个元素(循环语句)
  • 三十二、W5100S/W5500+RP2040树莓派Pico<UPnP示例>
  • 2023.11.18 Hadoop之 YARN
  • ceph 常用命令
  • 6.8完全二叉树的节点个数(LC222-E)
  • 基于协作mimo系统的RM编译码误码率matlab仿真,对比硬判决译码和软判决译码
  • Django模型层
  • 计算机视觉的应用18-一键抠图人像与更换背景的项目应用,可扩展批量抠图与背景替换
  • Redis(哈希Hash和发布订阅模式)
  • php正则表达式汇总
  • Python与ArcGIS系列(八)通过python执行地理处理工具
  • cocos----刚体
  • 【SAP-HCM】--HR人员信息导入函数