当前位置: 首页 > 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")}
}

 

相关文章:

  • 使用docker部署ELK日志框架-Elasticsearch
  • 使用 Redis 实现分布式锁,解决分布式锁原子性、死锁、误删、可重入、自动续期等问题(使用SpringBoot环境实现)
  • 封装比较好的登录页面
  • 性能测试常见问题总结
  • 数据库表字段以表格形式写入Word
  • vite+react+typescript 遇到的问题
  • 002 OpenCV dft 傅里叶变换
  • 阿里云服务器 手动搭建WordPress(CentOS 8)
  • 【Java 进阶篇】深入理解 JQuery 事件绑定:标准方式
  • Python小白之PyCharm仍然显示“No module named ‘xlwings‘”
  • 基于单片机的水位检测系统仿真设计
  • Postman+Newman+Jenkins实现接口测试持续集成
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • 【智能家居项目】FreeRTOS版本——多任务系统中使用DHT11 | 获取SNTP服务器时间 | 重新设计功能框架
  • gRPC之SAN证书生成
  • 【译】JS基础算法脚本:字符串结尾
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • Android系统模拟器绘制实现概述
  • Angular 2 DI - IoC DI - 1
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • IndexedDB
  • Java Agent 学习笔记
  • java8 Stream Pipelines 浅析
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • js中forEach回调同异步问题
  • mysql 5.6 原生Online DDL解析
  • Travix是如何部署应用程序到Kubernetes上的
  • vagrant 添加本地 box 安装 laravel homestead
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 老板让我十分钟上手nx-admin
  • 理解在java “”i=i++;”所发生的事情
  • 微信小程序:实现悬浮返回和分享按钮
  • 我的zsh配置, 2019最新方案
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (C语言)fread与fwrite详解
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (function(){})()的分步解析
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (Python第六天)文件处理
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (分布式缓存)Redis分片集群
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (数据结构)顺序表的定义
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .NET连接数据库方式