最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于go語(yǔ)言實(shí)現(xiàn)圖片驗(yàn)證碼的代碼示例

 更新時(shí)間:2023年10月06日 08:36:31   作者:勿忘33  
這篇文章主要為大家詳細(xì)介紹了基于go語(yǔ)言實(shí)現(xiàn)圖片驗(yàn)證碼的代碼示例,文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

1 驗(yàn)證碼虛線的作用以及虛線是如何實(shí)現(xiàn)的

驗(yàn)證碼的虛線的作用

  • 驗(yàn)證碼的虛線的作用:防止AI掃描識(shí)別
  • 虛線是如何實(shí)現(xiàn)的: 調(diào)用了數(shù)學(xué)包里面的sin,cos

2 使用方法

2.1 安裝依賴(lài)

go get -u github.com/mojocn/base64Captcha

2.2設(shè)置默認(rèn)內(nèi)存儲(chǔ)存器

// 庫(kù)中提供的默認(rèn)內(nèi)存存儲(chǔ)器。內(nèi)存存儲(chǔ)器用于存儲(chǔ)和驗(yàn)證生成的驗(yàn)證碼信息。它將驗(yàn)證碼的標(biāo)識(shí)符、驗(yàn)證碼圖片和相關(guān)的驗(yàn)證數(shù)據(jù)存儲(chǔ)在內(nèi)存中。
var stores = base64Captcha.DefaultMemStore

2.3生成驗(yàn)證碼方法以及配置文件解析

    var driver base64Captcha.Driver
    var driverString base64Captcha.DriverString
?
    // 配置驗(yàn)證碼信息
    captchaConfig := base64Captcha.DriverString{
         // 驗(yàn)證碼圖片的高度,以像素為單位。
        Height: ? ? ? ? ?60, ?
         //驗(yàn)證碼圖片的寬度,以像素為單位。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
        Width: ? ? ? ? ? 200, 
         //驗(yàn)證碼圖片中隨機(jī)噪點(diǎn)的數(shù)量。在這個(gè)例子中,值為0表示沒(méi)有噪點(diǎn)。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
        NoiseCount: ? ? ?0, 
         // 控制顯示在驗(yàn)證碼圖片中的線條的選項(xiàng)。在這個(gè)例子中,1: 直線  2: 曲線4: 點(diǎn)線8: 虛線16: 中空直線32: 中空曲線 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
        ShowLineOptions: 2 | 4,
        //驗(yàn)證碼的長(zhǎng)度,即驗(yàn)證碼中字符的數(shù)量。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 
        Length: ? ? ? ? ?4, ? ? ?
        //驗(yàn)證碼的字符源,用于生成驗(yàn)證碼的字符。在這個(gè)例子中,使用數(shù)字和小寫(xiě)字母作為字符源。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
        Source: ? ? ? ? ?"1234567890qwertyuioplkjhgfdsazxcvbnm", 
        BgColor: &color.RGBA{
        //驗(yàn)證碼圖片的背景顏色。在這個(gè)例子中,使用RGBA顏色模型,R表示紅色分量,G表示綠色分量,B表示藍(lán)色分量,A表示透明度。
            R: 3,
            G: 102,
            B: 214,
            A: 125,
        },
        //用于繪制驗(yàn)證碼文本的字體文件。在這個(gè)例子中,使用名為"wqy-microhei.ttc"的字體文件。
        Fonts: []string{"wqy-microhei.ttc"}, 
    }
?
    driverString = captchaConfig
    //將driverString中指定的字體文件轉(zhuǎn)換為驅(qū)動(dòng)程序所需的字體格式,并將結(jié)果賦值給driver變量。這個(gè)步驟是為了將字體文件轉(zhuǎn)換為正確的格式,以便在生成驗(yàn)證碼時(shí)使用正確的字體。
    driver = driverString.ConvertFonts()
    //使用driver和stores參數(shù)創(chuàng)建一個(gè)新的驗(yàn)證碼實(shí)例,并將其賦值給captcha變量。這里的stores參數(shù)表示驗(yàn)證碼存儲(chǔ)器,用于存儲(chǔ)和驗(yàn)證驗(yàn)證碼。
    captcha := base64Captcha.NewCaptcha(driver, stores)
    //調(diào)用captcha實(shí)例的Generate方法生成驗(yàn)證碼。lid是生成的驗(yàn)證碼的唯一標(biāo)識(shí)符,lb64s是生成的驗(yàn)證碼圖片的Base64編碼字符串,lerr是生成過(guò)程中的任何錯(cuò)誤。
    lid, lb64s, lerr := captcha.Generate()
    // 從驗(yàn)證碼存儲(chǔ)器中獲取驗(yàn)證碼的值
    code = stores.Get(lid, true)
    return lid, lb64s, code, lerr

3 內(nèi)容解析

3.1 聲明驅(qū)動(dòng)的含義

var driver base64Captcha.Driver點(diǎn)進(jìn)源碼里面只有兩個(gè)主要部分

  • func (d Driver) DrawCaptcha(content string) (item Item, err error)
  • DrawCaptcha 繪制二進(jìn)制驗(yàn)證碼,接收一個(gè) content 參數(shù),用于生成并繪制驗(yàn)證碼。它返回一個(gè) Item 結(jié)構(gòu)體和可能的錯(cuò)誤。Item 結(jié)構(gòu)體包含了繪制的驗(yàn)證碼圖像或其他相關(guān)信息。
//item結(jié)構(gòu)體源碼如下
type Item interface {
    //WriteTo writes to a writer
    WriteTo(w io.Writer) (n int64, err error)
    //EncodeB64string encodes as base64 string
    EncodeB64string() string
}
  • GenerateIdQuestionAnswer 生成隨機(jī)的id、問(wèn)題和答案
  • 問(wèn)題字符串 q 是指用于展示給用戶的驗(yàn)證碼問(wèn)題或提示,通常是一個(gè)文字描述或短語(yǔ),要求用戶根據(jù)該問(wèn)題來(lái)完成驗(yàn)證碼的驗(yàn)證。
  • 答案字符串 a 是用戶對(duì)于驗(yàn)證碼問(wèn)題的回答或響應(yīng)。用戶需要根據(jù)展示給他們的問(wèn)題,在輸入框中填寫(xiě)或選擇正確的答案。 -func (d Driver) GenerateIdQuestionAnswer() (id, q, a string)

3.2配置使用以及源碼解析

  • driverString = captchaConfig這個(gè)只是將上述的配置信息傳賦值給聲明的配置信息
  • driver = driverString.ConvertFonts()這個(gè)在上面已經(jīng)說(shuō)過(guò)他的簡(jiǎn)單介紹,源碼如下
func (d *DriverString) ConvertFonts() *DriverString {
    //是否為 nil。如果是,它將 DefaultEmbeddedFonts 賦值給 d.fontsStorage。否則返回一個(gè)使用其默認(rèn)字體
    if d.fontsStorage == nil {
        d.fontsStorage = DefaultEmbeddedFonts
    }
    //代碼創(chuàng)建了一個(gè)空的切片 tfs,用于存儲(chǔ)字體文件。然后它遍歷 d.Fonts 切片中的每個(gè)元素,并通過(guò)
    // d.fontsStorage.LoadFontByName 方法加載對(duì)應(yīng)的字體文件。加載的字體文件會(huì)被追加到 tfs 切片中。
    tfs := []*truetype.Font{}
    for _, fff := range d.Fonts {
        tf := d.fontsStorage.LoadFontByName("fonts/" + fff)
        tfs = append(tfs, tf)
    }
    //代碼創(chuàng)建了一個(gè)空的切片 tfs,用于存儲(chǔ)字體文件。然后它遍歷 d.Fonts 切片中的每個(gè)元素,
    //并通過(guò) d.fontsStorage.LoadFontByName 方法加載對(duì)應(yīng)的字體文件。加載的字體文件會(huì)被追加到 tfs 切片中。這意味著如果沒(méi)有加載任何字體文件,它將使用 fontsAll 中的默認(rèn)字體。
    if len(tfs) == 0 {
        tfs = fontsAll
    }
    //這行代碼將剛剛生成的字體切片 tfs 賦值給 d.fontsArray,將其存儲(chǔ)在 DriverString 結(jié)構(gòu)體中。
    d.fontsArray = tfs
?
    return d
}
  • captcha := base64Captcha.NewCaptcha(driver, stores)
func NewCaptcha(driver Driver, store Store) *Captcha {
    //這行代碼創(chuàng)建了一個(gè) Captcha 結(jié)構(gòu)體的實(shí)例,并使用傳入的 driver 和 store 參數(shù)初始化了 Driver 和 Store 字段。
    return &Captcha{Driver: driver, Store: store}
}
  • lid, lb64s, lerr := captcha.Generate()
func (c *Captcha) Generate() (id, b64s string, err error) {
    id, content, answer := c.Driver.GenerateIdQuestionAnswer()
    //這里調(diào)用的就是上面介紹第一個(gè)聲明的驗(yàn)證碼的生成方法
    item, err := c.Driver.DrawCaptcha(content)
    //根據(jù)驗(yàn)證碼的內(nèi)容 content 生成驗(yàn)證碼圖像,并返回生成的圖像,也是上面介紹的第一個(gè)聲明的一部分
    if err != nil {
        return "", "", err
    }
    err = c.Store.Set(id, answer)
    //將驗(yàn)證碼的標(biāo)識(shí)符 id 和正確答案 answer 存儲(chǔ)在聲明的默認(rèn)內(nèi)存存儲(chǔ)器中。
    if err != nil {
        return "", "", err
    }
    b64s = item.EncodeB64string()
    // item 的 EncodeB64string 方法,將生成的驗(yàn)證碼圖像轉(zhuǎn)換為 Base64 字符串表示。(個(gè)人理解圖片在傳遞過(guò)程中是以二進(jìn)制的形式傳遞的,通過(guò)這個(gè)方法將其轉(zhuǎn)化為Base64編碼的形式)
    //Base64 是一種常用的編碼方式,用于將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成可打印的 ASCII 字符串。Base64 編碼通常用于在文本協(xié)議中傳輸二進(jìn)制數(shù)據(jù),或者在需要將二進(jìn)制數(shù)據(jù)表示為字符串時(shí)使用。
    return
}
  • code = stores.Get(lid, flase)涉及到默認(rèn)內(nèi)存存儲(chǔ)器直接就在這里簡(jiǎn)單說(shuō)明了
type Store interface {
    //這個(gè)方法就是上面生成驗(yàn)證碼時(shí),向默認(rèn)內(nèi)存存儲(chǔ)器儲(chǔ)存數(shù)據(jù)
    Set(id string, value string) error
    //獲取通過(guò)生成驗(yàn)證碼的id獲取默認(rèn)內(nèi)存存儲(chǔ)器中存儲(chǔ)的數(shù)據(jù)
    //第二個(gè)參數(shù):true會(huì)返回與指定的驗(yàn)證碼數(shù)據(jù)項(xiàng)相關(guān)的其他信息。這些信息可能包括驗(yàn)證碼生成時(shí)間、過(guò)期時(shí)間、元數(shù)據(jù)或其他屬性。false返回指定驗(yàn)證碼數(shù)據(jù)項(xiàng)本身,而不包含與其相關(guān)的其他信息
    Get(id string, clear bool) string
    //第一個(gè)參數(shù)是驗(yàn)證碼的唯一表示即判斷是否是當(dāng)前驗(yàn)證碼 ? 第二個(gè)參數(shù)是用戶輸入的驗(yàn)證碼  第三個(gè)參數(shù)是是否開(kāi)啟大小寫(xiě)映射,即驗(yàn)證時(shí)是否忽略大小寫(xiě),這個(gè)包直接就給我們封裝了校驗(yàn)驗(yàn)證碼
    Verify(id, answer string, clear bool) bool
}

4 代碼實(shí)例

import (
    "fmt"
    "github.com/mojocn/base64Captcha"
    "image/color"
)
var stores = base64Captcha.DefaultMemStore
func CaptMake() (id, b64s string, code string, err error) {
    var driver base64Captcha.Driver
    var driverString base64Captcha.DriverString
?
    // 配置驗(yàn)證碼信息
    captchaConfig := base64Captcha.DriverString{
        Height: ? ? ? ? ?60, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
        Width: ? ? ? ? ? 200, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
        NoiseCount: ? ? ?0, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
        ShowLineOptions: 2 | 4, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 
        Length: ? ? ? ? ?4, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
        Source: ? ? ? ? ?"1234567890qwertyuioplkjhgfdsazxcvbnm",
        BgColor: &color.RGBA{
            R: 3,
            G: 102,
            B: 214,
            A: 125,
        },
        Fonts: []string{"wqy-microhei.ttc"},
    }
?
    driverString = captchaConfig
    driver = driverString.ConvertFonts()
    captcha := base64Captcha.NewCaptcha(driver, stores)
    lid, lb64s, lerr := captcha.Generate()
    code = stores.Get(lid, true)
    fmt.Println(code)
    return lid, lb64s, code, lerr
}
//這個(gè)解析方式只是上面介紹的內(nèi)存存儲(chǔ)器的方法調(diào)用,使用起來(lái)看情況是否使用
func CaptVerify(id string, capt string) bool {
    if stores.Verify(id, capt, false) {
        return true
    } else {
        return false
    }
}

到此這篇關(guān)于基于go語(yǔ)言實(shí)現(xiàn)圖片驗(yàn)證碼的代碼示例的文章就介紹到這了,更多相關(guān)go實(shí)現(xiàn)圖片驗(yàn)證碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang中urlencode與urldecode編碼解碼詳解

    Golang中urlencode與urldecode編碼解碼詳解

    這篇文章主要給大家介紹了關(guān)于Golang中urlencode與urldecode編碼解碼的相關(guān)資料,在Go語(yǔ)言中轉(zhuǎn)碼操作非常方便,可以使用內(nèi)置的encoding包來(lái)快速完成轉(zhuǎn)碼操作,Go語(yǔ)言中的encoding包提供了許多常用的編碼解碼方式,需要的朋友可以參考下
    2023-09-09
  • Go語(yǔ)言掃描目錄并獲取相關(guān)信息的方法

    Go語(yǔ)言掃描目錄并獲取相關(guān)信息的方法

    這篇文章主要介紹了Go語(yǔ)言掃描目錄并獲取相關(guān)信息的方法,實(shí)例分析了Go語(yǔ)言操作目錄及文件的技巧,需要的朋友可以參考下
    2015-03-03
  • Go語(yǔ)言標(biāo)準(zhǔn)輸入輸出庫(kù)的基本使用教程

    Go語(yǔ)言標(biāo)準(zhǔn)輸入輸出庫(kù)的基本使用教程

    輸入輸出在任何一門(mén)語(yǔ)言中都必須提供的一個(gè)功能,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言標(biāo)準(zhǔn)輸入輸出庫(kù)的基本使用,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02
  • Windows環(huán)境下vscode-go安裝筆記(不支持32位)

    Windows環(huán)境下vscode-go安裝筆記(不支持32位)

    這篇文章主要介紹了Windows環(huán)境下vscode-go安裝筆記(不支持32位),需要的朋友可以參考下
    2017-02-02
  • golang中context的作用詳解

    golang中context的作用詳解

    這篇文章主要介紹了golang中context的作用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 基于Golang實(shí)現(xiàn)統(tǒng)一加載資源的入口

    基于Golang實(shí)現(xiàn)統(tǒng)一加載資源的入口

    當(dāng)我們需要在?main?函數(shù)中做一些初始化的工作,比如初始化日志,初始化配置文件,都需要統(tǒng)一初始化入口函數(shù),所以本文就來(lái)編寫(xiě)一個(gè)統(tǒng)一加載資源的入口吧
    2023-05-05
  • golang實(shí)現(xiàn)通過(guò)smtp發(fā)送電子郵件的方法

    golang實(shí)現(xiàn)通過(guò)smtp發(fā)送電子郵件的方法

    這篇文章主要介紹了golang實(shí)現(xiàn)通過(guò)smtp發(fā)送電子郵件的方法,實(shí)例分析了Go語(yǔ)言基于SMTP協(xié)議發(fā)送郵件的相關(guān)技巧,需要的朋友可以參考下
    2016-07-07
  • golang?struct?json?tag的使用以及深入講解

    golang?struct?json?tag的使用以及深入講解

    這篇文章主要給大家介紹了關(guān)于golang?struct?json?tag的使用以及深入講解,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-02-02
  • 使用Go語(yǔ)言開(kāi)發(fā)一個(gè)命令行文件管理工具

    使用Go語(yǔ)言開(kāi)發(fā)一個(gè)命令行文件管理工具

    這篇文章主要為大家詳細(xì)介紹了如何使用Go語(yǔ)言開(kāi)發(fā)一款命令行文件管理工具,支持批量重命名,刪除,創(chuàng)建,移動(dòng)文件,需要的小伙伴可以了解下
    2025-02-02
  • Golang泛型的使用方法詳解

    Golang泛型的使用方法詳解

    這篇文章主要介紹了Golang中泛型的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06

最新評(píng)論

乐至县| 乌兰浩特市| 余干县| 喀喇沁旗| 饶阳县| 丹阳市| 右玉县| 绥德县| 宜黄县| 石屏县| 庆云县| 纳雍县| 黑山县| 泌阳县| 泸西县| 霍城县| 罗山县| 宝丰县| 饶河县| 开封市| 上犹县| 兴业县| 那曲县| 鸡泽县| 马边| 廊坊市| 墨玉县| 天柱县| 娱乐| 深泽县| 香港 | 邵阳市| 黔西县| 祁东县| 怀宁县| 吴江市| 晴隆县| 邯郸县| 钟祥市| 邢台县| 宁波市|