Go 之 captcha 生成图像验证码

目前 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")
	}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/161135.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“升级图片管理,优化工作流程——轻松将JPG转为PNG“

在图片时代,无论是工作还是生活,图片管理都显得尤为重要。批量处理图片,将JPG格式轻松转换为PNG格式,能够使您的图片管理更优化,提高工作效率。 首先,我们进入首助编辑高手主页面,会看到有多种…

Springboot更新用户密码

UserController PatchMapping("/updatePwd")//RequestBody注解&#xff0c;mvc框架才能自动的去读取请求体里的json数据&#xff0c;转换成map集合对象public Result updatePwd(RequestBody Map<String,String> params){//1.校验数据String oldPwd params.get…

Leetcode——最长递增子序列

1. 题目链接&#xff1a;300. 最长递增子序列 2. 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&a…

C++项目案例圆和点的关系 (涉及知识点:头文件定义类,cpp文件实现类,类和作用域,linux编译运行c++项目)

一.项目描述 点与圆有三种关系&#xff1a; 点在圆外 点在圆上 点在圆内计算点到圆心的距离就能判断点在圆的哪个地方。二.项目结构 三.include文件 3.1 Circle类的声明 Circle.h // 防止头文件重复包含 #pragma once // #include<iostream> #include "Point.h&…

JPA整合Sqlite解决Dialect报错问题, 最新版Hibernate6

前言 我个人项目中&#xff0c;不想使用太重的数据库&#xff0c;而内嵌数据库中SQLite又是最受欢迎的&#xff0c; 因此决定采用这个数据库。 可是JPA并不支持Sqlite&#xff0c;这篇文章就是记录如何解决这个问题的。 原因 JPA屏蔽了底层的各个数据库差异&#xff0c; 但是…

【每日一题】数位和相等数对的最大和

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;哈希表 写在最后 Tag 【哈希表】【数组】【2023-11-18】 题目来源 2342. 数位和相等数对的最大和 题目解读 在数组中找出数位和相等数对的和的最大值。 解题思路 方法一&#xff1a;哈希表 维护一个不同的数位和表…

36 mysql 主键冲突 和 唯一索引冲突

前言 我们这里 来看一下 我们经常碰到的 "duplicate key xxx" 测试表结构如下 CREATE TABLE tz_test (id int(11) unsigned NOT NULL AUTO_INCREMENT,field1 varchar(128) DEFAULT NULL,PRIMARY KEY (id) USING BTREE,KEY field1 (field1) USING BTREE ) ENGINEI…

upload-labs关卡9(基于win特性data流绕过)通关思路

文章目录 前言一、靶场需要了解的知识1::$data是什么 二、靶场第九关通关思路1、看源码2、bp抓包修改后缀名3、检查是否成功上传 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去尚未授…

ACM练习——第五天

还有两天就要比赛了&#xff0c;进入正题吧 题目一&#xff1a;小红的签到题 小红的签到题 (nowcoder.com) 这道题也就是热身水平&#xff0c;机会很清楚的发现只需要c/a就可以得出答案了 参考代码&#xff1a; #include <iostream>using namespace std;int main(){int a…

动态头像如何制作?这个方法请收藏

照片是记录生活的一种方式&#xff0c;但是静态图片有时候不能够完全表达我们的情感。而动态的图片能够让图片以更生动的方式来展示我们的想象力和内心情感。那么&#xff0c;大家知道动态图片制作的方法有哪些吗&#xff1f;使用gif动画制作&#xff08;https://www.gif.cn/&a…

【Linux系统编程十九】:(进程通信)--匿名管道/模拟实现进程池

【Linux系统编程十九】&#xff1a;匿名管道原理/模拟实现进程池 一.进程通信理解二.通信实现原理三.系统接口四.五大特性与四种情况五.应用场景--进程池 一.进程通信理解 什么是通信&#xff1f; 通信其实就是一个进程想把数据给另一个进程&#xff0c;但因为进程具有独立性…

使用ADS进行serdes仿真时,Tx_Diff中EQ的设置对发送端波形的影响。

研究并记录一下ADS仿真中Tx_Diff的EQ设置。原理图如下&#xff1a; 最上面是选择均衡方法Choose equalization method&#xff1a;Specify FIR taps&#xff0c;Specify de-emphasis和none。 当选择Specify de-emphasis选项时&#xff0c;下方可以输入去加重具体的dB值&#x…

泛微E-Cology CheckServer.jspSQL注入漏洞(QVD-2023-9849) 复现

泛微E-Cology CheckServer.jspSQL注入漏洞(QVD-2023-9849) 复现 1.漏洞描述 泛微 Ecology OA 系统对用户传入的数据过滤处理不当&#xff0c;导致存在 SQL 注入漏洞&#xff0c;未经过身份认证的远程攻击者可利用此漏洞执行任意SQL指令&#xff0c;从而窃取数据库敏感信息。 …

深度学习交通车辆流量分析 - 目标检测与跟踪 - python opencv 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果3 DeepSORT车辆跟踪3.1 Deep SORT多目标跟踪算法3.2 算法流程 4 YOLOV5算法4.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; *…

python_面向对象中的特殊成员

一、几个常见的特殊成员 # 都只是语法&#xff0c;无特殊意义 class Foo(object):def __init__(self,a1,a2):self.a1 a1self.a2 a2def __call__(self,*args,**kwargs):print(11111,args,kwargs)return 123def __getitem__(self, item):print(item)return 8def __setitem__(s…

简单算法——回溯、贪心、动态规划

回溯法 回溯法深度优先剪枝&#xff0c;实质就是用递归代替for循环。 仍然是一种暴力遍历的手段&#xff0c;通常与递归配合使用&#xff0c;用于解决单纯for循环无法处理的问题&#xff0c;比如组合、切割、子集、排列等问题——比如求n个数里的长度为k的组合&#xff0c;需要…

JAVA刷题之字符串的一些个人思路

感谢您的阅读&#xff01; ꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯…

Unity之NetCode多人网络游戏联机对战教程(9)--NetworkAnimator组件

文章目录 前言NetworkAnimatorAnimator的Trigger属性服务器权威模式&#xff08;Server Authoritative Mode&#xff09;客户端权威模式 (Owner Authoritative Mode)学习文档 前言 这个组件是NetCode常用的组件之一&#xff0c;NetworkAnimator跟NetworkTransform一样&#xf…

【Spring篇】使用注解进行开发

&#x1f38a;专栏【Spring】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f970;欢迎并且感谢大家指出小吉的问题 文章目录 &#x1f33a;原代码&#xff08;无注解&#xff09;&#x1f384;加上注解⭐两个注…