欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于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 安裝依賴

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ù)字和小寫字母作為字符源。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
        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)題,在輸入框中填寫或選擇正確的答案。 -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)啟大小寫映射,即驗(yàn)證時(shí)是否忽略大小寫,這個(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創(chuàng)建構(gòu)造函數(shù)的方法超詳細(xì)講解

    Golang創(chuàng)建構(gòu)造函數(shù)的方法超詳細(xì)講解

    構(gòu)造器一般面向?qū)ο笳Z(yǔ)言的典型特性,用于初始化變量。Go語(yǔ)言沒(méi)有任何具體構(gòu)造器,但我們能使用該特性去初始化變量。本文介紹不同類型構(gòu)造器的差異及其應(yīng)用場(chǎng)景
    2023-01-01
  • Go?語(yǔ)言使用goroutine運(yùn)行閉包踩坑分析

    Go?語(yǔ)言使用goroutine運(yùn)行閉包踩坑分析

    這篇文章主要介紹了Go?語(yǔ)言使用goroutine運(yùn)行閉包踩坑解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Go語(yǔ)言實(shí)現(xiàn)分布式鎖

    Go語(yǔ)言實(shí)現(xiàn)分布式鎖

    分布式鎖是控制分布式系統(tǒng)之間同步訪問(wèn)共享資源的一種方式。如果不同的系統(tǒng)或是同一個(gè)系統(tǒng)的不同主機(jī)之間共享了一個(gè)或一組資源,那么訪問(wèn)這些資源時(shí),需要通過(guò)一些互斥手段來(lái)防止彼此之間的干擾以保證一致性,在這種情況下,就需要使用分布式鎖了
    2023-01-01
  • golang使用 gomodule 在公共測(cè)試環(huán)境管理go的依賴的實(shí)例詳解

    golang使用 gomodule 在公共測(cè)試環(huán)境管理go的依賴的實(shí)例詳解

    這篇文章主要介紹了golang使用 gomodule 在公共測(cè)試環(huán)境管理go的依賴,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 詳解golang函數(shù)多返回值錯(cuò)誤處理與error類型

    詳解golang函數(shù)多返回值錯(cuò)誤處理與error類型

    這篇文章主要為大家詳細(xì)介紹了golang中函數(shù)多返回值錯(cuò)誤處理與error類型的相關(guān)知識(shí),文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)吧
    2023-10-10
  • go類型轉(zhuǎn)換及與C的類型轉(zhuǎn)換方式

    go類型轉(zhuǎn)換及與C的類型轉(zhuǎn)換方式

    這篇文章主要介紹了go類型轉(zhuǎn)換及與C的類型轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • golang新手不注意可能會(huì)出現(xiàn)的一些小問(wèn)題

    golang新手不注意可能會(huì)出現(xiàn)的一些小問(wèn)題

    最近在學(xué)習(xí)golang,發(fā)現(xiàn)了一些新手們需要注意的小問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于golang新手不注意可能會(huì)出現(xiàn)的一些小問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-12-12
  • go語(yǔ)言結(jié)構(gòu)體指針操作示例詳解

    go語(yǔ)言結(jié)構(gòu)體指針操作示例詳解

    這篇文章主要為大家介紹了go語(yǔ)言結(jié)構(gòu)體指針操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Golang實(shí)現(xiàn)多存儲(chǔ)驅(qū)動(dòng)設(shè)計(jì)SDK案例

    Golang實(shí)現(xiàn)多存儲(chǔ)驅(qū)動(dòng)設(shè)計(jì)SDK案例

    這篇文章主要介紹了Golang實(shí)現(xiàn)多存儲(chǔ)驅(qū)動(dòng)設(shè)計(jì)SDK案例,Gocache是一個(gè)基于Go語(yǔ)言編寫的多存儲(chǔ)驅(qū)動(dòng)的緩存擴(kuò)展組件,更多具體內(nèi)容感興趣的小伙伴可以參考一下
    2022-09-09
  • go使用SQLX操作MySQL數(shù)據(jù)庫(kù)的教程詳解

    go使用SQLX操作MySQL數(shù)據(jù)庫(kù)的教程詳解

    sqlx 是 Go 語(yǔ)言中一個(gè)流行的操作數(shù)據(jù)庫(kù)的第三方包,它提供了對(duì) Go 標(biāo)準(zhǔn)庫(kù) database/sql 的擴(kuò)展,簡(jiǎn)化了操作數(shù)據(jù)庫(kù)的步驟,下面我們就來(lái)學(xué)習(xí)一下go如何使用SQLX實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)的一些基本操作吧
    2023-11-11

最新評(píng)論