Golang 图像验证码

https://github.com/mojocn/base64Captcha

小图片使用base64响应对于RESTful服务来说更便捷

 

安装golang包

1
go get -u github.com/mojocn/base64Captcha

 

对于国内用户 go get golang.org/x/image 失败的情况下:

  • go version > 1.11
  • set env GOPROXY=https://goproxy.io

 

创建 图像验证码  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package main
 
import (
    "fmt"
    "github.com/mojocn/base64Captcha"
)
 
func CreateCaptcha() {
 
    //config struct for digits
    //数字验证码配置
    var configD = base64Captcha.ConfigDigit{
        Height: 80,
        Width: 240,
        MaxSkew: 0.7,
        DotCount: 80,
        CaptchaLen: 5,
    }
 
    //config struct for audio
    //声音验证码配置
    var configA = base64Captcha.ConfigAudio{CaptchaLen: 6, Language: "zh"}
 
    //config struct for Character
    //字符,公式,验证码配置
    var configC = base64Captcha.ConfigCharacter{
        Height: 60,
        Width: 240,
        //const CaptchaModeNumber:数字,CaptchaModeAlphabet:字母,CaptchaModeArithmetic:算术,CaptchaModeNumberAlphabet:数字字母混合.
        Mode: base64Captcha.CaptchaModeNumber,
        ComplexOfNoiseText: base64Captcha.CaptchaComplexLower,
        ComplexOfNoiseDot: base64Captcha.CaptchaComplexLower,
        IsShowHollowLine: false,
        IsShowNoiseDot: false,
        IsShowNoiseText: false,
        IsShowSlimeLine: false,
        IsShowSineLine: false,
        CaptchaLen: 6,
    }
 
    //创建声音验证码
    //GenerateCaptcha 第一个参数为空字符串,包会自动在服务器一个随机种子给你产生随机uiid.
    idKeyA, capA := base64Captcha.GenerateCaptcha("", configA)
 
    //以base64编码
    base64stringA := base64Captcha.CaptchaWriteToBase64Encoding(capA)
 
    //创建字符公式验证码.
    //GenerateCaptcha 第一个参数为空字符串,包会自动在服务器一个随机种子给你产生随机uiid.
    idKeyC, capC := base64Captcha.GenerateCaptcha("", configC)
 
    //以base64编码
    base64stringC := base64Captcha.CaptchaWriteToBase64Encoding(capC)
 
    //创建数字验证码.
    //GenerateCaptcha 第一个参数为空字符串,包会自动在服务器一个随机种子给你产生随机uiid.
    idKeyD, capD := base64Captcha.GenerateCaptcha("", configD)
 
    //以base64编码
    base64stringD := base64Captcha.CaptchaWriteToBase64Encoding(capD)
 
    fmt.Println(idKeyA, base64stringA, " ")
    fmt.Println(idKeyC, base64stringC, " ")
    fmt.Println(idKeyD, base64stringD, " ")
}
 
func verfiyCaptcha(idkey, verifyValue string) {
    verifyResult := base64Captcha.VerifyCaptcha(idkey, verifyValue)
    if verifyResult {
        //success
    } else {
        //fail
    }
}
 
func main() {
    CreateCaptcha()
}

  

验证 图像验证码  

1
2
3
4
5
6
7
8
func verfiyCaptcha(idkey,verifyValue string){
    verifyResult := base64Captcha.VerifyCaptcha(idkey, verifyValue)
    if verifyResult {
        //success
    } else {
        //fail
    }
}

使用golang搭建API服务  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// example of HTTP server that uses the captcha package.
package main
 
import (
    "encoding/json"
    "fmt"
    "github.com/mojocn/base64Captcha"
    "log"
    "net/http"
)
 
//ConfigJsonBody json request body.
type ConfigJsonBody struct {
    Id              string
    CaptchaType     string
    VerifyValue     string
    ConfigAudio     base64Captcha.ConfigAudio
    ConfigCharacter base64Captcha.ConfigCharacter
    ConfigDigit     base64Captcha.ConfigDigit
}
 
// base64Captcha create http handler
func generateCaptchaHandler(w http.ResponseWriter, r *http.Request) {
    //parse request parameters
    //接收客户端发送来的请求参数
    decoder := json.NewDecoder(r.Body)
    var postParameters ConfigJsonBody
    err := decoder.Decode(&postParameters)
    if err != nil {
        log.Println(err)
    }
    defer r.Body.Close()
 
    //create base64 encoding captcha
 
    var config interface{}
    switch postParameters.CaptchaType {
    case "audio":
        config = postParameters.ConfigAudio
    case "character":
        config = postParameters.ConfigCharacter
    default:
        config = postParameters.ConfigDigit
    }
    captchaId, captcaInterfaceInstance := base64Captcha.GenerateCaptcha(postParameters.Id, config)
    base64blob := base64Captcha.CaptchaWriteToBase64Encoding(captcaInterfaceInstance)
 
    //or you can just write the captcha content to the httpResponseWriter.
    //before you put the captchaId into the response COOKIE.
    //captcaInterfaceInstance.WriteTo(w)
 
    //set json response
    w.Header().Set("Content-Type", "application/json; charset=utf-8")
    body := map[string]interface{}{"code": 1, "data": base64blob, "captchaId": captchaId, "msg": "success"}
    json.NewEncoder(w).Encode(body)
}
// base64Captcha verify http handler
func captchaVerifyHandle(w http.ResponseWriter, r *http.Request) {
 
    //parse request parameters
    //接收客户端发送来的请求参数
    decoder := json.NewDecoder(r.Body)
    var postParameters ConfigJsonBody
    err := decoder.Decode(&postParameters)
    if err != nil {
        log.Println(err)
    }
    defer r.Body.Close()
    //verify the captcha
    //比较图像验证码
    verifyResult := base64Captcha.VerifyCaptcha(postParameters.Id, postParameters.VerifyValue)
 
    //set json response
    //设置json响应
    w.Header().Set("Content-Type", "application/json; charset=utf-8")
    body := map[string]interface{}{"code": "error", "data": "验证失败", "msg": "captcha failed"}
    if verifyResult {
        body = map[string]interface{}{"code": "success", "data": "验证通过", "msg": "captcha verified"}
    }
    json.NewEncoder(w).Encode(body)
}
 
//start a net/http server
//启动golang net/http 服务器
func main() {
 
    //serve Vuejs+ElementUI+Axios Web Application
    http.Handle("/", http.FileServer(http.Dir("./static")))
 
    //api for create captcha
    http.HandleFunc("/api/getCaptcha", generateCaptchaHandler)
 
    //api for verify captcha
    http.HandleFunc("/api/verifyCaptcha", captchaVerifyHandle)
 
    fmt.Println("Server is at localhost:3333")
    if err := http.ListenAndServe("localhost:3333", nil); err != nil {
        log.Fatal(err)
    }
}

  

  

posted on   youhui  阅读(3311)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示