diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..f6c26977bbb993b180afd759658dcf5ea6619cd0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,194 @@ +木兰宽松许可证,第2版 + +木兰宽松许可证,第2版 + +2020年1月 http://license.coscl.org.cn/MulanPSL2 + +您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束: + +0. 定义 + +“软件” 是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 + +“贡献” 是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 + +“贡献者” 是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 + +“法人实体” 是指提交贡献的机构及其“关联实体”。 + +“关联实体” 是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是 +指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 + +1. 授予版权许可 + +每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可 +以复制、使用、修改、分发其“贡献”,不论修改与否。 + +2. 授予专利许可 + +每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定 +撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡 +献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软 +件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“ +关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或 +其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权 +行动之日终止。 + +3. 无商标许可 + +“本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定 +的声明义务而必须使用除外。 + +4. 分发限制 + +您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“ +本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 + +5. 免责声明与责任限制 + +“软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对 +任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于 +何种法律理论,即使其曾被建议有此种损失的可能性。 + +6. 语言 + +“本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文 +版为准。 + +条款结束 + +如何将木兰宽松许可证,第2版,应用到您的软件 + +如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: + +1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; + +2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; + +3, 请将如下声明文本放入每个源文件的头部注释中。 + +Copyright (c) [Year] [name of copyright holder] +[Software Name] is licensed under Mulan PSL v2. +You can use this software according to the terms and conditions of the Mulan +PSL v2. +You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 +THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY +KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +See the Mulan PSL v2 for more details. + +Mulan Permissive Software License,Version 2 + +Mulan Permissive Software License,Version 2 (Mulan PSL v2) + +January 2020 http://license.coscl.org.cn/MulanPSL2 + +Your reproduction, use, modification and distribution of the Software shall +be subject to Mulan PSL v2 (this License) with the following terms and +conditions: + +0. Definition + +Software means the program and related documents which are licensed under +this License and comprise all Contribution(s). + +Contribution means the copyrightable work licensed by a particular +Contributor under this License. + +Contributor means the Individual or Legal Entity who licenses its +copyrightable work under this License. + +Legal Entity means the entity making a Contribution and all its +Affiliates. + +Affiliates means entities that control, are controlled by, or are under +common control with the acting entity under this License, ‘control’ means +direct or indirect ownership of at least fifty percent (50%) of the voting +power, capital or other securities of controlled or commonly controlled +entity. + +1. Grant of Copyright License + +Subject to the terms and conditions of this License, each Contributor hereby +grants to you a perpetual, worldwide, royalty-free, non-exclusive, +irrevocable copyright license to reproduce, use, modify, or distribute its +Contribution, with modification or not. + +2. Grant of Patent License + +Subject to the terms and conditions of this License, each Contributor hereby +grants to you a perpetual, worldwide, royalty-free, non-exclusive, +irrevocable (except for revocation under this Section) patent license to +make, have made, use, offer for sale, sell, import or otherwise transfer its +Contribution, where such patent license is only limited to the patent claims +owned or controlled by such Contributor now or in future which will be +necessarily infringed by its Contribution alone, or by combination of the +Contribution with the Software to which the Contribution was contributed. +The patent license shall not apply to any modification of the Contribution, +and any other combination which includes the Contribution. If you or your +Affiliates directly or indirectly institute patent litigation (including a +cross claim or counterclaim in a litigation) or other patent enforcement +activities against any individual or entity by alleging that the Software or +any Contribution in it infringes patents, then any patent license granted to +you under this License for the Software shall terminate as of the date such +litigation or activity is filed or taken. + +3. No Trademark License + +No trademark license is granted to use the trade names, trademarks, service +marks, or product names of Contributor, except as required to fulfill notice +requirements in section 4. + +4. Distribution Restriction + +You may distribute the Software in any medium with or without modification, +whether in source or executable forms, provided that you provide recipients +with a copy of this License and retain copyright, patent, trademark and +disclaimer statements in the Software. + +5. Disclaimer of Warranty and Limitation of Liability + +THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY +KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR +COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT +LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING +FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO +MATTER HOW IT’S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF +THE POSSIBILITY OF SUCH DAMAGES. + +6. Language + +THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION +AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF +DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION +SHALL PREVAIL. + +END OF THE TERMS AND CONDITIONS + +How to Apply the Mulan Permissive Software License,Version 2 +(Mulan PSL v2) to Your Software + +To apply the Mulan PSL v2 to your work, for easy identification by +recipients, you are suggested to complete following three steps: + +i. Fill in the blanks in following statement, including insert your software +name, the year of the first publication of your software, and your name +identified as the copyright owner; + +ii. Create a file named "LICENSE" which contains the whole context of this +License in the first directory of your software package; + +iii. Attach the statement to the appropriate annotated syntax at the +beginning of each source file. + +Copyright (c) [Year] [name of copyright holder] +[Software Name] is licensed under Mulan PSL v2. +You can use this software according to the terms and conditions of the Mulan +PSL v2. +You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 +THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY +KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +See the Mulan PSL v2 for more details. diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..551ac141465fbdd993e7246fd04a2612eb202eed --- /dev/null +++ b/README.md @@ -0,0 +1,387 @@ +
+ +![logo][image-logo] + +### tianaiCAPTCHA - 天爱验证码 +#### 基于 Golang 实现的滑动/旋转/点选 验证码 **[在线体验][online-demo-link]** +可能是开源界最好用的行为验证码工具
+ +[![][github-release-shield]][github-release-link] [![][github-license-shield]][github-license-link]
+ +
+ +--- + +- **tianai CAPTCHA Golang 版** 目前含有的的行为验证码类型 + + + + + + + + + + + + + + +
滑块验证码旋转验证码文字点选验证码
滑块验证码旋转验证码文字点选验证码
在线体验 🚀
+ +> 更多验证码类型待开发,敬请期待! ✨ + +> [!NOTE] +> 功能更丰富的 Java 版:[github.com/dromara/tianai-captcha][tianai-captcha-java-link] + +# 快速开始 + +> [!TIP] +> Demo 参考 [gitee.com/tianai/captcha-go-demo][captcha-go-demo-link] + +## 1. mod 导入 +```shell +go get github.com/tianaiyouqing/tianai-captcha-go@v1.0.1 +``` +> #### 需要本地开发,可拉取至项目根目录,并在 `go.mod` 添加 +> ```mod +> replace github.com/tianaiyouqing/tianai-captcha-go => ./tianai-captcha-go +> ``` + +## 2. 初始化验证码 + +
+ 展开 + +```go +import ( + "github.com/tianaiyouqing/tianai-captcha-go/application" + "github.com/tianaiyouqing/tianai-captcha-go/common/model" +) + +var Captcha *application.TianAiCaptchaApplication + +func init() { + builder := application.NewBuilder() + // 添加滑块验证码 + builder.AddProvider(application.CreateSliderProvider()) + // 添加旋转验证码 + builder.AddProvider(application.CreateRotateProvider()) + // 添加文字点选验证码, 参数为nil时会读取默认的字体,可以替换成自定义字体, 传入多个字体会随机选择 + builder.AddProvider(application.CreateWordClickProvider(nil)) + // 注意 构建出来的 CaptchaApplication 是单例的,所以可以全局使用 + Captcha = builder.Build() +} +``` +
+ +## 3. 在项目中使用 + +
+ 展开 + +```go +// 这里以gin框架为例,其它框架自行修改即可 + +// 生成验证码 +func GenCaptcha(c *gin.Context) { + // 这里生成类型为 SLIDER的验证码, 目前支持 SLIDER、ROTATE、WORD_IMAGE_CLICK + captcha, err := Captcha.GenerateCaptcha(&model.GenerateParam{ + CaptchaName: "SLIDER", + }) + if err != nil { + c.JSON(500, gin.H{ + "code": 500, + "msg": err.Error(), + }) + return + } + // 这边返回的结构是为了适配 tianai-captcha-web-sdk 前端项目 + c.JSON(200, gin.H{ + "code": 200, + "msg": "success", + "id": captcha.Id, + "captcha": captcha, + }) + +} + +// 校验验证码 +func Valid(c *gin.Context) { + + // 此接收的参数结构是前端项目 tianai-captcha-web-sdk 的 ValidParam + validParam := new(ValidParam) + if err := c.ShouldBindJSON(validParam); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + valid, err := Captcha.Valid(validParam.Id, &validParam.Data) + if err != nil { + c.JSON(500, gin.H{ + "code": 500, + "msg": err.Error(), + }) + return + } + c.JSON(200, valid) +} + +type ValidParam struct { + Id string `json:"id" binding:"required"` + Data model.ImageCaptchaTrack `json:"data" binding:"required"` +} + +``` +
+ +--- + +> [!NOTE] +> 默认前端 SDK
+> [github.com/tianaiyouqing/captcha-web-sdk][tianai-captcha-web-sdk-link] + + +## 扩展 + +
+ 自定义背景图片和模板图片 + +```go +package controller + +import ( + "github.com/tianaiyouqing/tianai-captcha-go/application" + "github.com/tianaiyouqing/tianai-captcha-go/common" + "github.com/tianaiyouqing/tianai-captcha-go/common/model" + "github.com/tianaiyouqing/tianai-captcha-go/resource" +) + +var Captcha *application.TianAiCaptchaApplication + +func init() { + + // 创建一个resourceStore存储 + store := resource.NewMemoryImageCaptchaResourceStore() + + // ==================== 设置背景图片 ==================== + + // 注意: 背景图片的宽高为 600*360, 后台支持自定义调整宽高, 但是 tianai-captcha-web-sdk 项目设置的样式必须为 600*360的比例, 可以缩放大小,但是小白的话直接就设置600*360 + + // 第一个参数为验证码名称,第二个参数为资源, 验证码名称目前支持 "SLIDER" "ROTATE" "WORD_IMAGE_CLICK" + store.AddResource(common.CAPTCHA_NAME_SLIDER, &model.Resource{ + ResourceType: "file", // 这个参数指定资源类型,目前支持file、url, 可以自己扩展相对应的资源读取器,这里演示file类型 + Data: "./rsources/1.jpeg", // 如果类型为file, 则data为文件路径, 如果类型为url, 则data为url地址, 以此类推 + }) + store.AddResource(common.CAPTCHA_NAME_ROTATE, &model.Resource{ + ResourceType: "file", + Data: "./rsources/2.jpeg", + }) + store.AddResource(common.CAPTCHA_NAME_SLIDER, &model.Resource{ + ResourceType: "file", + Data: "./rsources/3.jpeg", + }) + store.AddResource(common.CAPTCHA_NAME_SLIDER, &model.Resource{ + ResourceType: "file", + Data: "./rsources/4.jpegg", + }) + + // ============================ 设置模板图片 ============================ + // 注意模板图片要按照指定的格式设置样式和尺寸, 下面给出默认大小,该宽高是按照背景图为 600*360计算的, 如果模板图片不符合要求, 则需要自己调整样式和尺寸 + // slider 底图样式大小为 110*110, 滑块样式大小为 110*110 + // rotate 底图样式大小为 200*200, 旋转图片样式大小为 200*200 + + // ============= 设置自定义模板 ==================== + resourceMap := model.NewResourceMap() + resourceMap.PutValue("active.png", &model.Resource{ + ResourceType: "file", + Data: "C:\\Users\\Thinkpad\\Desktop\\captcha\\templates\\六边形-滑块.png", + }) + resourceMap.PutValue("fixed.png", &model.Resource{ + ResourceType: "file", + Data: "C:\\Users\\Thinkpad\\Desktop\\captcha\\templates\\六边形-底图.png", + }) + store.AddTemplate(common.CAPTCHA_NAME_SLIDER, resourceMap) + + // ============= 设置默认模板 ==================== + // 如果小白只想替换背景图,不想设置模板,也可以使用系统自带的模板,代码如下 + defaultSliderTemplates := resource.GetDefaultSliderTemplates() + for _, template := range defaultSliderTemplates { + store.AddTemplate(common.CAPTCHA_NAME_SLIDER, template) + } + defaultRotateTemplates := resource.GetDefaultRotateTemplate() + for _, template := range defaultRotateTemplates { + store.AddTemplate(common.CAPTCHA_NAME_ROTATE, template) + } + + // ========= 构建验证码应用 ========== + + builder := application.NewBuilder() + // 设置存放资源的存储器 + builder.SetResourceStore(store) + // 添加验证码生成器 + builder.AddProvider(application.CreateSliderProvider()) + builder.AddProvider(application.CreateRotateProvider()) + builder.AddProvider(application.CreateWordClickProvider(nil)) + Captcha = builder.Build() +} +``` +
+ +
+ 验证码校验信息的存储位置 + +#### 验证码的校验信息默认存储在内存中,若要换成 Redis 之类的,自定义扩展即可,例子: + +```go +package controller + +import ( + "github.com/tianaiyouqing/tianai-captcha-go/application" + "github.com/tianaiyouqing/tianai-captcha-go/common/model" +) + +var Captcha *application.TianAiCaptchaApplication + +func init() { + // 自定义缓存存储器 + customCacheStore := &CustomCacheStore{} + + builder := application.NewBuilder() + // 设置自定义缓存存储器 + builder.SetCacheStore(customCacheStore) + // 添加验证码生成器 + builder.AddProvider(application.CreateSliderProvider()) + builder.AddProvider(application.CreateRotateProvider()) + builder.AddProvider(application.CreateWordClickProvider(nil)) + Captcha = builder.Build() +} + +type CustomCacheStore struct{} + +func (CustomCacheStore) GetCache(key string) (value map[string]any, ok bool) { + //TODO 通过key获取缓存 + panic("implement me") +} + +func (CustomCacheStore) GetAndRemoveCache(key string) (value map[string]any, ok bool) { + //TODO 通过key获取缓存并删除 + panic("implement me") +} + +func (CustomCacheStore) SetCache(key string, data map[string]any, captchaInfo *model.ImageCaptchaInfo) error { + //TODO 设置缓存 + panic("implement me") +} +``` +
+ +
+ 自定义图片转换器 + +```go +package controller + +import ( + "github.com/tianaiyouqing/tianai-captcha-go/application" + "github.com/tianaiyouqing/tianai-captcha-go/common/model" + "github.com/tianaiyouqing/tianai-captcha-go/generator" +) + +var Captcha *application.TianAiCaptchaApplication + +func init() { + // 自定义缓存存储器 + + + builder := application.NewBuilder() + // 设置自定义图片转换器, 默认是base64格式的转换前, 背景图为 jpg, 模板图为png, 如有需要可自定义实现 `generator.ImageTransform` 接口进行转换 + builder.SetImageTransform(generator.NewBase64ImageTransform()) + // 添加验证码生成器 + builder.AddProvider(application.CreateSliderProvider()) + builder.AddProvider(application.CreateRotateProvider()) + builder.AddProvider(application.CreateWordClickProvider(nil)) + Captcha = builder.Build() +} +``` +
+ +
+ 其他 + +```go +package controller + +import ( + "github.com/tianaiyouqing/tianai-captcha-go/application" + "github.com/tianaiyouqing/tianai-captcha-go/common/model" + "github.com/tianaiyouqing/tianai-captcha-go/generator" + "github.com/tianaiyouqing/tianai-captcha-go/resource" + "github.com/tianaiyouqing/tianai-captcha-go/validator" + "time" +) + +var Captcha *application.TianAiCaptchaApplication + +func init() { + builder := application.NewBuilder() + + // 设置资源存储器 + builder.SetResourceStore(resource.NewMemoryImageCaptchaResourceStore()) + // 设置资源读取器,负责把Resource对象转换成Image图片对象 + readers := resource.NewDefaultImageCaptchaResourceReaders() + //readers.AddResourceReader(nil)// 自定义可以添加自定义的资源读取器 + builder.SetResourceImageReader(readers) + // 设置自定义图片转换器, 默认是base64格式的转换前, 背景图为 jpg, 模板图为png, 如有需要可自定义实现 `generator.ImageTransform` 接口进行转换 + builder.SetImageTransform(generator.NewBase64ImageTransform()) + // 设置缓冲存储器, 默认是内存存储器, 如需要扩展redis之类, 可自定义实现 `application.CacheStore` 接口 + builder.SetCacheStore(application.NewMemoryCacheStore(5*time.Minute, 5*time.Minute)) + // 设置验证码验证器 参数为默认的容错值,传nil则容错值默认设置为 0.02 + builder.SetImageCaptchaValidator(validator.NewSimpleImageCaptchaValidator(nil)) + + // 添加验证码生成器 + builder.AddProvider(application.CreateSliderProvider()) + builder.AddProvider(application.CreateRotateProvider()) + builder.AddProvider(application.CreateWordClickProvider(nil)) + Captcha = builder.Build() +} +``` +
+ +--- + +> [!TIP] +> ### 👋 加入我们,与其他爱好者交流学习 +> +> QQ群:`197340494`
+> +> 微信群:群满,可扫码添加好友拉入群聊,或搜索微信号: `youseeseeyou-1ttd` 备注 `验证码` +> +> ![qrcode-link][qrcode-link]
+> + +--- + +## 贡献者 + + + + + + +
+ +
+
+ +--- + +[image-logo]: https://minio.tianai.cloud/public/captcha/logo/logo-519x100.png +[github-release-shield]: https://img.shields.io/github/v/release/tianaiyouqing/tianai-captcha-go?color=369eff&labelColor=black&logo=github&style=flat-square +[github-release-link]: https://github.com/tianaiyouqing/tianai-captcha-go/releases +[github-license-link]: https://github.com/tianaiyouqing/tianai-captcha-go/blob/master/LICENSE +[github-license-shield]: https://img.shields.io/badge/MulanPSL-2.0-white?labelColor=black&style=flat-square +[tianai-captcha-java-link]: https://github.com/dromara/tianai-captcha +[captcha-go-demo-link]: https://gitee.com/tianai/captcha-go-demo +[tianai-captcha-web-sdk-link]: https://github.com/tianaiyouqing/captcha-web-sdk +[online-demo-link]: http://captcha.tianai.cloud +[qrcode-link]: https://minio.tianai.cloud/public/qun4.png \ No newline at end of file diff --git a/application/application.go b/application/application.go index ba4cbe2159a5138ba9bd3f73f819bae9ddd99eac..220047fb8e179189212946c14d74c818f18636a1 100644 --- a/application/application.go +++ b/application/application.go @@ -66,7 +66,7 @@ func (self *TianAiCaptchaApplication) GenerateCaptcha(param *model.GenerateParam } func (self *TianAiCaptchaApplication) Valid(id string, track *model.ImageCaptchaTrack) (*model.ApiResponse, error) { - validData, ok := self.CacheStore.getCache(id) + validData, ok := self.CacheStore.GetCache(id) if !ok { response := model.ApiResponse{} return response.Expire(), nil diff --git a/application/caches.go b/application/caches.go index 33a44ba55b0a05edbb89d6c1b04ade558011e55b..322500d2a9de527fd381edf9a13b82f6eec3f9cc 100644 --- a/application/caches.go +++ b/application/caches.go @@ -7,8 +7,8 @@ import ( ) type CacheStore interface { - getCache(key string) (value map[string]any, ok bool) - getAndRemoveCache(key string) (value map[string]any, ok bool) + GetCache(key string) (value map[string]any, ok bool) + GetAndRemoveCache(key string) (value map[string]any, ok bool) SetCache(key string, data map[string]any, captchaInfo *model.ImageCaptchaInfo) error } @@ -23,7 +23,7 @@ func NewMemoryCacheStore(expired time.Duration, cleanUpInterval time.Duration) * } } -func (self *MemoryCacheStore) getCache(key string) (value map[string]any, ok bool) { +func (self *MemoryCacheStore) GetCache(key string) (value map[string]any, ok bool) { data, ok := self.cache.Get(key) if ok { return data.(map[string]any), ok @@ -31,7 +31,7 @@ func (self *MemoryCacheStore) getCache(key string) (value map[string]any, ok boo return nil, ok } -func (self *MemoryCacheStore) getAndRemoveCache(key string) (value map[string]any, ok bool) { +func (self *MemoryCacheStore) GetAndRemoveCache(key string) (value map[string]any, ok bool) { data, ok := self.cache.Get(key) if ok { self.cache.Delete(key) diff --git a/go.mod b/go.mod index d305d228547037a75ad3c3503850bb4f8b0fba40..87e0be04bf7ae97e527e2ab5450b6b395785f9ca 100644 --- a/go.mod +++ b/go.mod @@ -3,9 +3,10 @@ module github.com/tianaiyouqing/tianai-captcha-go go 1.21 require ( - github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/patrickmn/go-cache v2.1.0+incompatible // indirect - github.com/pkg/errors v0.9.1 // indirect - golang.org/x/image v0.18.0 // indirect + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 + github.com/google/uuid v1.6.0 + github.com/patrickmn/go-cache v2.1.0+incompatible + github.com/pkg/errors v0.9.1 ) + +require golang.org/x/image v0.18.0 // indirect diff --git a/go.sum b/go.sum index 6ecc73b2a0459ed14947d8136911367d3a45a5ca..8d6c89b5f5cace34a555ea48c1a7a3bd79b511f6 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,3 @@ -github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= -github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -8,9 +6,5 @@ github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaR github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ= golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=