头图

介绍一个 golang 图像验证码,简单易用,高安全性的“行为式验证码”Go库

go-captcha

go-captcha, 一个简洁易用、交互友好、高安全性的点选行为验证码 Go 库 ,采用 “验证码展示-采集用户行为-验证行为数据” 为流程,用户无需键盘手动输入,极大优化传统验证码用户体验不佳的问题,支持PC端及移动端,带有与前端交互的DEMO。

http://47.104.180.148/go-captcha/go-captcha-01.png

http://47.104.180.148/go-captcha/go-captcha.jpg

中国Go模块代理

设置Go模块的代理
  • Window

    $ set GO111MODULE=on
    $ set GOPROXY=https://goproxy.io,direct
    
    ### The Golang 1.13+ can be executed directly
    $ go env -w GO111MODULE=on
    $ go env -w GOPROXY=https://goproxy.io,direct
  • Linux or Mac

    $ export GO111MODULE=on
    $ export GOPROXY=https://goproxy.io,direct
    
    ### or
    $ echo "export GO111MODULE=on" >> ~/.profile
    $ echo "export GOPROXY=https://goproxy.cn,direct" >> ~/.profile
    $ source ~/.profile

依赖golang官方标准库

$ go get -u github.com/golang/freetype
$ go get -u golang.org/x/crypto
$ go get -u golang.org/x/image

安装模块

$ go get -u github.com/wenlng/go-captcha/captcha

引入模块

package main

import "github.com/wenlng/go-captcha/captcha"

func main(){
   // ....
}

快速使用

package main
import (
    "fmt"
    "os"
    "github.com/wenlng/go-captcha/captcha"
)

func main(){
    // Captcha Single Instances
    capt := captcha.GetCaptcha()
    
    // 生成验证码
    dots, b64, tb64, key, err := capt.Generate()
    if err != nil {
        panic(err)
        return
    }
    
    // 主图base64
    fmt.Println(len(b64))
    
    // 缩略图base64
    fmt.Println(len(tb64))
    
    // 唯一key
    fmt.Println(key)
    
    // 文本位置验证数据
    fmt.Println(dots)
}

验证码实例

  • 创建实例或者获取单例模式的实例

    package main
    import (
      "fmt"
      "github.com/wenlng/go-captcha/captcha"
    )
    
    func main(){
      // 创建验证码实例
      // capt := captcha.NewCaptcha() 
      
      // 单例模式的验证码实例
      capt := captcha.GetCaptcha()
    
      // ====================================================
      fmt.Println(capt)
    
    }

验证码配置

你可以直接拷贝实例中 "__example/resources" 的图片和字体文件到你的项目中使用

文本相关的配置
package main
import (
    "fmt"
    "github.com/wenlng/go-captcha/captcha"
)

func main(){
    capt := captcha.GetCaptcha()
    
    // ====================================================
    // Method: SetRangChars (chars []string) error;
    // Desc: Set random char of captcha
    // ====================================================
    // Letter
    //chars := "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    //_ = capt.SetRangChars(strings.Split(chars, ""))
    
    // Two Letter
    //chars := []string{"HE","CA","WO","NE","HT","IE","PG","GI","CH","CO","DA"}
    //_ = capt.SetRangChars(chars)

    // Chinese Char
    chars := []string{"你","好","呀","这","是","点","击","验","证","码","哟"}
    _ = capt.SetRangChars(chars)

    // ====================================================
    fmt.Println(capt)
}
图片相关的配置
package main
import (
    "fmt"
    "os"
    "github.com/wenlng/go-captcha/captcha"
)

func main(){
    capt := captcha.GetCaptcha()
    
    path, _ := os.Getwd()    
    // ====================================================
    // Method: SetBackground(color []string);
    // Desc: 设置验证码背景图
    // ====================================================
    capt.SetBackground([]string{
        path + "/__example/resources/images/1.jpg",
        path + "/__example/resources/images/2.jpg",
    })

    // ====================================================
    // Method: SetFont(fonts []string);
    // Desc: 设置验证码字体
    // ====================================================
    capt.SetFont([]string{
        path + "/__example/resources/fonts/fzshengsksjw_cu.ttf",
        path + "/__example/resources/fonts/fzssksxl.ttf",
    })

    // ====================================================
    // Method: SetImageSize(size *Size);
    // Desc: 设置验证码主图的尺寸
    // ====================================================
    capt.SetImageSize(&captcha.Size{300, 300})

    // ====================================================
    // Method: SetThumbSize(size *Size);
    // Desc: 设置验证码缩略图的尺寸
    // ====================================================
    capt.SetThumbSize(&captcha.Size{150, 40})

    // ====================================================
    // Method: SetFontDPI(val int);
    // Desc: 设置验证码字体的随机DPI,最好是72
    // ====================================================
    capt.SetFontDPI(72)

    // ====================================================
    // Method: SetTextRangLen(val *captcha.RangeVal);
    // Desc: 设置验证码文本总和的随机长度范围
    // ====================================================
    capt.SetTextRangLen(&captcha.RangeVal{6, 7})

    // ====================================================
    // Method: SetRangFontSize(val *captcha.RangeVal);
    // Desc: 设置验证码文本的随机大小
    // ====================================================
    capt.SetRangFontSize(&captcha.RangeVal{32, 42})

    // ====================================================
    // Method: SetRangCheckTextLen(val *captcha.RangeVal);
    // Desc:设置验证码校验文本的随机长度的范围
    // ====================================================
    capt.SetRangCheckTextLen(&captcha.RangeVal{2, 4})

    // ====================================================
    // Method: SetRangCheckFontSize(val *captcha.RangeVal);
    // Desc:设置验证码文本的随机大小
    // ====================================================
    capt.SetRangCheckFontSize(&captcha.RangeVal{24, 30})
    
    // ====================================================
    // Method: SetTextRangFontColors(colors []string);
    // Desc: 设置验证码文本的随机十六进制颜色
    // ====================================================
    capt.SetTextRangFontColors([]string{
        "#1d3f84",
        "#3a6a1e",
    })
 
    // ====================================================
    // Method: SetThumbTextRangFontColors(colors []string);
    // Desc: Set random hex color of captcha text
    // ====================================================
    capt.SetThumbTextRangFontColors([]string{
        "#1d3f84",
        "#3a6a1e",
    })

    // ====================================================
    // Method: SetImageFontAlpha(val float64);
    // Desc:设置验证码字体的透明度
    // ====================================================
    capt.SetImageFontAlpha(0.5)

    // ====================================================
    // Method: SetTextRangAnglePos(pos []*RangeVal);
    // Desc:设置验证码文本的角度
    // ====================================================
    capt.SetTextRangAnglePos([]*captcha.RangeVal{
        {1, 15},
        {15, 30},
        {30, 45},
        {315, 330},
        {330, 345},
        {345, 359},
    })

    // ====================================================
    // Method: SetImageFontDistort(val int);
    // Desc:设置验证码字体扭曲程度
    // ====================================================
    capt.SetImageFontDistort(captcha.DistortLevel2)
  
    // ====================================================
    // Method: SetThumbBgColors(colors []string);
    // Desc: 设置缩略验证码背景的随机十六进制颜色
    // ====================================================
    capt.SetThumbBgColors([]string{
        "#1d3f84",
        "#3a6a1e",
    })

    // ====================================================
    // Method: SetThumbBackground(colors []string);
    // Desc:设置缩略验证码随机图像背景
    // ====================================================
    capt.SetThumbBackground([]string{
        path + "/__example/resources/images/r1.jpg",
        path + "/__example/resources/images/r2.jpg",
    })

    // ====================================================
    // Method: SetThumbBgDistort(val int);
    // Desc:设置缩略验证码背景的扭曲程度
    // ====================================================
    capt.SetThumbBgDistort(captcha.DistortLevel2)

    // ====================================================
    // Method: SetThumbFontDistort(val int);
    // Desc:设置缩略验证码字体的扭曲程度
    // ====================================================
    capt.SetThumbFontDistort(captcha.DistortLevel2)

    // ====================================================
    // Method: SetThumbBgCirclesNum(val int);
    // Desc:设置验证码背景的圈点数
    // ====================================================
    capt.SetThumbBgCirclesNum(20)

    // ====================================================
    // Method: SetThumbBgSlimLineNum(val int);
    // Desc:设置验证码背景的线条数
    // ====================================================
    capt.SetThumbBgSlimLineNum(3)
    

    // ====================================================
    fmt.Println(capt)
}

生成验证码数据

package main
import (
    "fmt"
    "os"
    "github.com/wenlng/go-captcha/captcha"
)

func main(){
    capt := captcha.GetCaptcha()
        
    // generate ...
    // ====================================================
    // dots:  文本字符的位置信息
    //  - {"0":{"Index":0,"Dx":198,"Dy":77,"Size":41,"Width":54,"Height":41,"Text":"SH","Angle":6,"Color":"#885500"} ...}
    // imageBase64:  Verify the clicked image
    // thumbImageBase64: Thumb displayed
    // key: Only Key
    // ====================================================
    dots, imageBase64, thumbImageBase64, key, err := capt.Generate()
    if err != nil {
        panic(err)
        return
    }
    fmt.Println(len(imageBase64))
    fmt.Println(len(thumbImageBase64))
    fmt.Println(key)
    fmt.Println(dots)
}

在 __example 中的前端在数据请求或提交验证数据时的格式:

// Example: 获取验证码数据
API = http://....../captcha/captcha-data
    Respose Data = {
        "code": 0,
        "image_base64": "...",
        "thumb_base64": "...",
        "captcha_key": "...",
    }     

// Example: 提交校验数据 
API = http://....../captcha/check-data
    Request Data = {
        dots: "x1,y1,x2,y2,...."
        key: "......"
    }

<br/>

1 声望
0 粉丝
0 条评论
推荐阅读
go图像验证码、行为式验证码
go-captcha, 一个简洁易用、交互友好、高安全性的点选行为验证码 Go 库 ,采用 “验证码展示-采集用户行为-验证行为数据” 为流程,用户无需键盘手动输入,极大优化传统验证码用户体验不佳的问题,支持PC端及移动端。

wengaolng阅读 1.1k

前端如何入门 Go 语言
类比法是一种学习方法,它是通过将新知识与已知知识进行比较,从而加深对新知识的理解。在学习 Go 语言的过程中,我发现,通过类比已有的前端知识,可以更好地理解 Go 语言的特性。

robin23阅读 3.3k评论 6

封面图
Golang 中 []byte 与 string 转换
string 类型和 []byte 类型是我们编程时最常使用到的数据结构。本文将探讨两者之间的转换方式,通过分析它们之间的内在联系来拨开迷雾。

机器铃砍菜刀24阅读 58.2k评论 2

年度最佳【golang】map详解
这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。

去去100216阅读 11.6k评论 2

年度最佳【golang】GMP调度详解
Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析...

去去100215阅读 11.9k评论 4

万字详解,吃透 MongoDB!
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常...

JavaGuide8阅读 1.7k

封面图
数据结构与算法:二分查找
一、常见数据结构简单数据结构(必须理解和掌握)有序数据结构:栈、队列、链表。有序数据结构省空间(储存空间小)无序数据结构:集合、字典、散列表,无序数据结构省时间(读取时间快)复杂数据结构树、 堆图二...

白鲸鱼9阅读 5.3k

1 声望
0 粉丝
宣传栏