基于go語言實現(xiàn)圖片驗證碼的代碼示例
1 驗證碼虛線的作用以及虛線是如何實現(xiàn)的
驗證碼的虛線的作用
- 驗證碼的虛線的作用:防止AI掃描識別
- 虛線是如何實現(xiàn)的: 調(diào)用了數(shù)學包里面的sin,cos
2 使用方法
2.1 安裝依賴
go get -u github.com/mojocn/base64Captcha
2.2設(shè)置默認內(nèi)存儲存器
// 庫中提供的默認內(nèi)存存儲器。內(nèi)存存儲器用于存儲和驗證生成的驗證碼信息。它將驗證碼的標識符、驗證碼圖片和相關(guān)的驗證數(shù)據(jù)存儲在內(nèi)存中。 var stores = base64Captcha.DefaultMemStore
2.3生成驗證碼方法以及配置文件解析
var driver base64Captcha.Driver var driverString base64Captcha.DriverString ? // 配置驗證碼信息 captchaConfig := base64Captcha.DriverString{ // 驗證碼圖片的高度,以像素為單位。 Height: ? ? ? ? ?60, ? //驗證碼圖片的寬度,以像素為單位。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Width: ? ? ? ? ? 200, //驗證碼圖片中隨機噪點的數(shù)量。在這個例子中,值為0表示沒有噪點。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NoiseCount: ? ? ?0, // 控制顯示在驗證碼圖片中的線條的選項。在這個例子中,1: 直線 2: 曲線4: 點線8: 虛線16: 中空直線32: 中空曲線 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ShowLineOptions: 2 | 4, //驗證碼的長度,即驗證碼中字符的數(shù)量。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Length: ? ? ? ? ?4, ? ? ? //驗證碼的字符源,用于生成驗證碼的字符。在這個例子中,使用數(shù)字和小寫字母作為字符源。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Source: ? ? ? ? ?"1234567890qwertyuioplkjhgfdsazxcvbnm", BgColor: &color.RGBA{ //驗證碼圖片的背景顏色。在這個例子中,使用RGBA顏色模型,R表示紅色分量,G表示綠色分量,B表示藍色分量,A表示透明度。 R: 3, G: 102, B: 214, A: 125, }, //用于繪制驗證碼文本的字體文件。在這個例子中,使用名為"wqy-microhei.ttc"的字體文件。 Fonts: []string{"wqy-microhei.ttc"}, } ? driverString = captchaConfig //將driverString中指定的字體文件轉(zhuǎn)換為驅(qū)動程序所需的字體格式,并將結(jié)果賦值給driver變量。這個步驟是為了將字體文件轉(zhuǎn)換為正確的格式,以便在生成驗證碼時使用正確的字體。 driver = driverString.ConvertFonts() //使用driver和stores參數(shù)創(chuàng)建一個新的驗證碼實例,并將其賦值給captcha變量。這里的stores參數(shù)表示驗證碼存儲器,用于存儲和驗證驗證碼。 captcha := base64Captcha.NewCaptcha(driver, stores) //調(diào)用captcha實例的Generate方法生成驗證碼。lid是生成的驗證碼的唯一標識符,lb64s是生成的驗證碼圖片的Base64編碼字符串,lerr是生成過程中的任何錯誤。 lid, lb64s, lerr := captcha.Generate() // 從驗證碼存儲器中獲取驗證碼的值 code = stores.Get(lid, true) return lid, lb64s, code, lerr
3 內(nèi)容解析
3.1 聲明驅(qū)動的含義
var driver base64Captcha.Driver點進源碼里面只有兩個主要部分
- func (d Driver) DrawCaptcha(content string) (item Item, err error)
- DrawCaptcha 繪制二進制驗證碼,接收一個 content 參數(shù),用于生成并繪制驗證碼。它返回一個 Item 結(jié)構(gòu)體和可能的錯誤。Item 結(jié)構(gòu)體包含了繪制的驗證碼圖像或其他相關(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 生成隨機的id、問題和答案
- 問題字符串 q 是指用于展示給用戶的驗證碼問題或提示,通常是一個文字描述或短語,要求用戶根據(jù)該問題來完成驗證碼的驗證。
- 答案字符串 a 是用戶對于驗證碼問題的回答或響應。用戶需要根據(jù)展示給他們的問題,在輸入框中填寫或選擇正確的答案。 -func (d Driver) GenerateIdQuestionAnswer() (id, q, a string)
3.2配置使用以及源碼解析
- driverString = captchaConfig這個只是將上述的配置信息傳賦值給聲明的配置信息
- driver = driverString.ConvertFonts()這個在上面已經(jīng)說過他的簡單介紹,源碼如下
func (d *DriverString) ConvertFonts() *DriverString { //是否為 nil。如果是,它將 DefaultEmbeddedFonts 賦值給 d.fontsStorage。否則返回一個使用其默認字體 if d.fontsStorage == nil { d.fontsStorage = DefaultEmbeddedFonts } //代碼創(chuàng)建了一個空的切片 tfs,用于存儲字體文件。然后它遍歷 d.Fonts 切片中的每個元素,并通過 // d.fontsStorage.LoadFontByName 方法加載對應的字體文件。加載的字體文件會被追加到 tfs 切片中。 tfs := []*truetype.Font{} for _, fff := range d.Fonts { tf := d.fontsStorage.LoadFontByName("fonts/" + fff) tfs = append(tfs, tf) } //代碼創(chuàng)建了一個空的切片 tfs,用于存儲字體文件。然后它遍歷 d.Fonts 切片中的每個元素, //并通過 d.fontsStorage.LoadFontByName 方法加載對應的字體文件。加載的字體文件會被追加到 tfs 切片中。這意味著如果沒有加載任何字體文件,它將使用 fontsAll 中的默認字體。 if len(tfs) == 0 { tfs = fontsAll } //這行代碼將剛剛生成的字體切片 tfs 賦值給 d.fontsArray,將其存儲在 DriverString 結(jié)構(gòu)體中。 d.fontsArray = tfs ? return d }
- captcha := base64Captcha.NewCaptcha(driver, stores)
func NewCaptcha(driver Driver, store Store) *Captcha { //這行代碼創(chuàng)建了一個 Captcha 結(jié)構(gòu)體的實例,并使用傳入的 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)用的就是上面介紹第一個聲明的驗證碼的生成方法 item, err := c.Driver.DrawCaptcha(content) //根據(jù)驗證碼的內(nèi)容 content 生成驗證碼圖像,并返回生成的圖像,也是上面介紹的第一個聲明的一部分 if err != nil { return "", "", err } err = c.Store.Set(id, answer) //將驗證碼的標識符 id 和正確答案 answer 存儲在聲明的默認內(nèi)存存儲器中。 if err != nil { return "", "", err } b64s = item.EncodeB64string() // item 的 EncodeB64string 方法,將生成的驗證碼圖像轉(zhuǎn)換為 Base64 字符串表示。(個人理解圖片在傳遞過程中是以二進制的形式傳遞的,通過這個方法將其轉(zhuǎn)化為Base64編碼的形式) //Base64 是一種常用的編碼方式,用于將二進制數(shù)據(jù)轉(zhuǎn)換成可打印的 ASCII 字符串。Base64 編碼通常用于在文本協(xié)議中傳輸二進制數(shù)據(jù),或者在需要將二進制數(shù)據(jù)表示為字符串時使用。 return }
- code = stores.Get(lid, flase)涉及到默認內(nèi)存存儲器直接就在這里簡單說明了
type Store interface { //這個方法就是上面生成驗證碼時,向默認內(nèi)存存儲器儲存數(shù)據(jù) Set(id string, value string) error //獲取通過生成驗證碼的id獲取默認內(nèi)存存儲器中存儲的數(shù)據(jù) //第二個參數(shù):true會返回與指定的驗證碼數(shù)據(jù)項相關(guān)的其他信息。這些信息可能包括驗證碼生成時間、過期時間、元數(shù)據(jù)或其他屬性。false返回指定驗證碼數(shù)據(jù)項本身,而不包含與其相關(guān)的其他信息 Get(id string, clear bool) string //第一個參數(shù)是驗證碼的唯一表示即判斷是否是當前驗證碼 ? 第二個參數(shù)是用戶輸入的驗證碼 第三個參數(shù)是是否開啟大小寫映射,即驗證時是否忽略大小寫,這個包直接就給我們封裝了校驗驗證碼 Verify(id, answer string, clear bool) bool }
4 代碼實例
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 ? // 配置驗證碼信息 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 } //這個解析方式只是上面介紹的內(nèi)存存儲器的方法調(diào)用,使用起來看情況是否使用 func CaptVerify(id string, capt string) bool { if stores.Verify(id, capt, false) { return true } else { return false } }
到此這篇關(guān)于基于go語言實現(xiàn)圖片驗證碼的代碼示例的文章就介紹到這了,更多相關(guān)go實現(xiàn)圖片驗證碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang創(chuàng)建構(gòu)造函數(shù)的方法超詳細講解
構(gòu)造器一般面向?qū)ο笳Z言的典型特性,用于初始化變量。Go語言沒有任何具體構(gòu)造器,但我們能使用該特性去初始化變量。本文介紹不同類型構(gòu)造器的差異及其應用場景2023-01-01golang使用 gomodule 在公共測試環(huán)境管理go的依賴的實例詳解
這篇文章主要介紹了golang使用 gomodule 在公共測試環(huán)境管理go的依賴,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11詳解golang函數(shù)多返回值錯誤處理與error類型
這篇文章主要為大家詳細介紹了golang中函數(shù)多返回值錯誤處理與error類型的相關(guān)知識,文中的示例代碼簡潔易懂,感興趣的小伙伴快跟隨小編一起學習吧2023-10-10go類型轉(zhuǎn)換及與C的類型轉(zhuǎn)換方式
這篇文章主要介紹了go類型轉(zhuǎn)換及與C的類型轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05Golang實現(xiàn)多存儲驅(qū)動設(shè)計SDK案例
這篇文章主要介紹了Golang實現(xiàn)多存儲驅(qū)動設(shè)計SDK案例,Gocache是一個基于Go語言編寫的多存儲驅(qū)動的緩存擴展組件,更多具體內(nèi)容感興趣的小伙伴可以參考一下2022-09-09go使用SQLX操作MySQL數(shù)據(jù)庫的教程詳解
sqlx 是 Go 語言中一個流行的操作數(shù)據(jù)庫的第三方包,它提供了對 Go 標準庫 database/sql 的擴展,簡化了操作數(shù)據(jù)庫的步驟,下面我們就來學習一下go如何使用SQLX實現(xiàn)MySQL數(shù)據(jù)庫的一些基本操作吧2023-11-11