golang包快速生成base64驗(yàn)證碼

base64Captcha快速生成base64編碼圖片驗(yàn)證碼字符串

支持多種樣式,算術(shù),數(shù)字,字母,混合模式,語音模式.

Base64是網(wǎng)絡(luò)上最常見的用于傳輸8Bit字節(jié)代碼的編碼方式之一拂檩。Base64編碼可用于在HTTP環(huán)境下傳遞較長(zhǎng)的標(biāo)識(shí)信息, 直接把base64當(dāng)成是字符串方式的數(shù)據(jù)就好了
減少了http請(qǐng)求睹逃;數(shù)據(jù)就是圖片;
為APIs微服務(wù)而設(shè)計(jì)

為什么base64圖片 for RESTful 服務(wù)

  Data URIs 支持大部分瀏覽器,IE8之后也支持.
  小圖片使用base64響應(yīng)對(duì)于RESTful服務(wù)來說更便捷

godoc文檔

在線Demo Playground Powered by Vuejs+elementUI+Axios


28+58=?.png

ACNRfd.png

rW4npZ.png

wav file

安裝golang包

go get -u github.com/mojocn/base64Captcha

創(chuàng)建圖像驗(yàn)證碼

import "github.com/mojocn/base64Captcha"
func demoCodeCaptchaCreate() {
    //config struct for digits
    //數(shù)字驗(yàn)證碼配置
    var configD = base64Captcha.ConfigDigit{
        Height:     80,
        Width:      240,
        MaxSkew:    0.7,
        DotCount:   80,
        CaptchaLen: 5,
    }
    //config struct for audio
    //聲音驗(yàn)證碼配置
    var configA = base64Captcha.ConfigAudio{
        CaptchaLen: 6,
        Language:   "zh",
    }
    //config struct for Character
    //字符,公式,驗(yàn)證碼配置
    var configC = base64Captcha.ConfigCharacter{
        Height:             60,
        Width:              240,
        //const CaptchaModeNumber:數(shù)字,CaptchaModeAlphabet:字母,CaptchaModeArithmetic:算術(shù),CaptchaModeNumberAlphabet:數(shù)字字母混合.
        Mode:               base64Captcha.CaptchaModeNumber,
        ComplexOfNoiseText: base64Captcha.CaptchaComplexLower,
        ComplexOfNoiseDot:  base64Captcha.CaptchaComplexLower,
        IsShowHollowLine:   false,
        IsShowNoiseDot:     false,
        IsShowNoiseText:    false,
        IsShowSlimeLine:    false,
        IsShowSineLine:     false,
        CaptchaLen:         6,
    }
    //create a audio captcha.
    idKeyA, capA := base64Captcha.GenerateCaptcha("", configA)
    //以base64編碼
    base64stringA := base64Captcha.CaptchaWriteToBase64Encoding(capA)
    //create a characters captcha.
    idKeyC, capC := base64Captcha.GenerateCaptcha("", configC)
    //以base64編碼
    base64stringC := base64Captcha.CaptchaWriteToBase64Encoding(capC)
    //create a digits captcha.
    idKeyD, capD := base64Captcha.GenerateCaptcha("", configD)
    //以base64編碼
    base64stringD := base64Captcha.CaptchaWriteToBase64Encoding(capD)
    
    fmt.Println(idKeyA, base64stringA, "\n")
    fmt.Println(idKeyC, base64stringC, "\n")
    fmt.Println(idKeyD, base64stringD, "\n")
}

驗(yàn)證圖像驗(yàn)證碼

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

使用golang搭建API服務(wù)

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

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,
}


// base64Captcha create http handler
func generateCaptchaHandler(w http.ResponseWriter, r *http.Request) {
    //parse request parameters
    //接收客戶端發(fā)送來的請(qǐng)求參數(shù)
    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
    //創(chuàng)建base64圖像驗(yàn)證碼

    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
    //你也可以是用默認(rèn)參數(shù) 生成圖像驗(yàn)證碼
    //base64Png := captcha.GenerateCaptchaPngBase64StringDefault(captchaId)

    //set json response
    //設(shè)置json響應(yīng)

    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
    //接收客戶端發(fā)送來的請(qǐng)求參數(shù)
    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
    //比較圖像驗(yàn)證碼
    verifyResult := base64Captcha.VerifyCaptcha(postParameters.Id, postParameters.VerifyValue)

    //set json response
    //設(shè)置json響應(yīng)
    w.Header().Set("Content-Type", "application/json; charset=utf-8")
    body := map[string]interface{}{"code": "error", "data": "驗(yàn)證失敗", "msg": "captcha failed"}
    if verifyResult {
        body = map[string]interface{}{"code": "success", "data": "驗(yàn)證通過", "msg": "captcha verified"}
    }
    json.NewEncoder(w).Encode(body)
}

//start a net/http server
//啟動(dòng)golang net/http 服務(wù)器
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)
    }
}

運(yùn)行demo代碼

cd $GOPATH/src/github.com/mojocn/captcha/examples
go run main.go

訪問 http://localhost:777

如果喜歡,請(qǐng)star 非常感謝.

License

base64Captcha source code is licensed under the Apache Licence, Version 2.0
(http://www.apache.org/licenses/LICENSE-2.0.html).

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末懈息,一起剝皮案震驚了整個(gè)濱河市罕扎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌庆锦,老刑警劉巖捅位,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡艇搀,警方通過查閱死者的電腦和手機(jī)尿扯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焰雕,“玉大人衷笋,你說我怎么就攤上這事【仄ǎ” “怎么了辟宗?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)吝秕。 經(jīng)常有香客問我泊脐,道長(zhǎng),這世上最難降的妖魔是什么烁峭? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任容客,我火速辦了婚禮,結(jié)果婚禮上则剃,老公的妹妹穿的比我還像新娘耘柱。我一直安慰自己,他們只是感情好棍现,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布调煎。 她就那樣靜靜地躺著,像睡著了一般己肮。 火紅的嫁衣襯著肌膚如雪士袄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天谎僻,我揣著相機(jī)與錄音娄柳,去河邊找鬼。 笑死艘绍,一個(gè)胖子當(dāng)著我的面吹牛赤拒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诱鞠,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼挎挖,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了航夺?” 一聲冷哼從身側(cè)響起蕉朵,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎阳掐,沒想到半個(gè)月后始衅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冷蚂,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年汛闸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蝙茶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛉拙,死狀恐怖尸闸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情孕锄,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布苞尝,位于F島的核電站畸肆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏宙址。R本人自食惡果不足惜轴脐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抡砂。 院中可真熱鬧大咱,春花似錦、人聲如沸注益。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽法梯。三九已至,卻和暖如春溉旋,著一層夾襖步出監(jiān)牢的瞬間啤月,已是汗流浹背煮仇。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谎仲,地道東北人浙垫。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像郑诺,于是被迫代替她去往敵國(guó)和親夹姥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容