Go第三方包base64Captcha


Go第三方包base64Captcha生成base64验证码 支持多种样式 算术 数字 字母 混合模式 语音模式
Base64 最常见的用于传输8Bit字节代码的编码方式之一
Base64 编码 在HTTP环境下传递较长的标识信息 把base64当成是字符串方式的数据 减少了http请求

微服务APIs

base64图片 Data URIs 大部分浏览器支持 IE8后也支持
小图片使用base64响应对于RESTful服务更便捷
安装golang包
go get -u github.com/mojocn/base64Captcha
创建图像验证码
import "github.com/mojocn/base64Captcha"
func demoCodeCaptchaCreate() {
    var configD = base64Captcha.ConfigDigit{//数字验证码配置    //config struct for digits    
        Height:     80,
        Width:      240,
        MaxSkew:    0.7,
        DotCount:   80,
        CaptchaLen: 5,
    }    
    var configA = base64Captcha.ConfigAudio{//config struct for audio  //声音验证码配置
        CaptchaLen: 6,
        Language:   "zh",
    }    
    var configC = base64Captcha.ConfigCharacter{//config struct for Character //字符,公式,验证码配置
        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,
    }    
    idKeyA, capA := base64Captcha.GenerateCaptcha("", configA)//create a audio captcha.    
    base64stringA := base64Captcha.CaptchaWriteToBase64Encoding(capA)//以base64编码
   
    idKeyC, capC := base64Captcha.GenerateCaptcha("", configC) //create a characters captcha    
    base64stringC := base64Captcha.CaptchaWriteToBase64Encoding(capC)//以base64编码
   
    idKeyD, capD := base64Captcha.GenerateCaptcha("", configD) //create a digits captcha.    
    base64stringD := base64Captcha.CaptchaWriteToBase64Encoding(capD)//以base64编码
    
    fmt.Println(idKeyA, base64stringA, "\n")
    fmt.Println(idKeyC, base64stringC, "\n")
    fmt.Println(idKeyD, base64stringD, "\n")
}

图像验证码 验证

import "github.com/mojocn/base64Captcha"
func verfiyCaptcha(idkey,verifyValue string){
    verifyResult := base64Captcha.VerifyCaptcha(idkey, verifyValue)
    if verifyResult {//success
    } else {//fail
    }
}

搭建API服务

// example of HTTP server that uses the captcha package.
package main
import (
    "encoding/json"
    "fmt"
    "github.com/mojocn/base64Captcha"
    "log"
    "net/http"
)
type ConfigJsonBody struct {//ConfigJsonBody json request body.
    Id              string
    CaptchaType     string
    VerifyValue     string
    ConfigAudio     base64Captcha.ConfigAudio
    ConfigCharacter base64Captcha.ConfigCharacter
    ConfigDigit     base64Captcha.ConfigDigit
}
var configC = base64Captcha.ConfigCharacter{
    Height:             60,
    Width:              240,
    Mode:               0,
    ComplexOfNoiseText: 0,
    ComplexOfNoiseDot:  0,
    IsShowHollowLine:   false,
    IsShowNoiseDot:     false,
    IsShowNoiseText:    false,
    IsShowSlimeLine:    false,
    IsShowSineLine:     false,
    CaptchaLen:         6,
}
func generateCaptchaHandler(w http.ResponseWriter, r *http.Request) {// base64Captcha create http handler
    decoder := json.NewDecoder(r.Body)//parse request parameters  //接收客户端发送来的请求参数
    var postParameters ConfigJsonBody
    err := decoder.Decode(&postParameters)
    if err != nil {
        log.Println(err)
    }
    defer r.Body.Close()
    //create base64 encoding captcha//创建base64图像验证码
    var config interface{}
    switch postParameters.CaptchaType {
    case "audio":
        config = postParameters.ConfigAudio
    case "character":
        config = postParameters.ConfigCharacter
    default:
        config = postParameters.ConfigDigit
    }
    captchaId, digitCap := base64Captcha.GenerateCaptcha(postParameters.Id, config)
    base64Png := base64Captcha.CaptchaWriteToBase64Encoding(digitCap)

    //or you can do this  //可以用默认参数 生成图像验证码
    //base64Png := captcha.GenerateCaptchaPngBase64StringDefault(captchaId)
    //set json response  //设置json响应
    w.Header().Set("Content-Type", "application/json; charset=utf-8")
    body := map[string]interface{}{"code": 1, "data": base64Png, "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() {    
    http.Handle("/", http.FileServer(http.Dir("./static"))) //serve Vuejs+ElementUI+Axios Web Application  
    http.HandleFunc("/api/getCaptcha", generateCaptchaHandler)//api for create captcha    
    http.HandleFunc("/api/verifyCaptcha", captchaVerifyHandle)//api for verify captcha
    fmt.Println("Server is at localhost:9999")
    if err := http.ListenAndServe("localhost:9999", nil); err != nil {
        log.Fatal(err)
    }
}
cd $GOPATH/src/github.com/mojocn/captcha/examples
go run main.go
访问 http://localhost:9999