Golang 圖像驗證碼


https://github.com/mojocn/base64Captcha

小圖片使用base64響應對於RESTful服務來說更便捷

 

安裝golang包

go get -u github.com/mojocn/base64Captcha

 

對於國內用戶 go get golang.org/x/image 失敗的情況下:

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

 

創建 圖像驗證碼  

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()
}

  

驗證 圖像驗證碼  

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

使用golang搭建API服務  

// 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)
	}
}

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM