基于go語言實現(xiàn)圖片驗證碼的代碼示例
更新時間:2023年10月06日 08:36:31 作者:勿忘33
這篇文章主要為大家詳細介紹了基于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設置默認內(nèi)存儲存器
// 庫中提供的默認內(nèi)存存儲器。內(nèi)存存儲器用于存儲和驗證生成的驗證碼信息。它將驗證碼的標識符、驗證碼圖片和相關的驗證數(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, lerr3 內(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)體包含了繪制的驗證碼圖像或其他相關信息。
//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ù)項相關的其他信息。這些信息可能包括驗證碼生成時間、過期時間、元數(shù)據(jù)或其他屬性。false返回指定驗證碼數(shù)據(jù)項本身,而不包含與其相關的其他信息
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
}
}到此這篇關于基于go語言實現(xiàn)圖片驗證碼的代碼示例的文章就介紹到這了,更多相關go實現(xiàn)圖片驗證碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Golang創(chuàng)建構(gòu)造函數(shù)的方法超詳細講解
構(gòu)造器一般面向?qū)ο笳Z言的典型特性,用于初始化變量。Go語言沒有任何具體構(gòu)造器,但我們能使用該特性去初始化變量。本文介紹不同類型構(gòu)造器的差異及其應用場景2023-01-01
golang使用 gomodule 在公共測試環(huán)境管理go的依賴的實例詳解
這篇文章主要介紹了golang使用 gomodule 在公共測試環(huán)境管理go的依賴,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11
詳解golang函數(shù)多返回值錯誤處理與error類型
這篇文章主要為大家詳細介紹了golang中函數(shù)多返回值錯誤處理與error類型的相關知識,文中的示例代碼簡潔易懂,感興趣的小伙伴快跟隨小編一起學習吧2023-10-10
go類型轉(zhuǎn)換及與C的類型轉(zhuǎn)換方式
這篇文章主要介紹了go類型轉(zhuǎn)換及與C的類型轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05
Golang實現(xiàn)多存儲驅(qū)動設計SDK案例
這篇文章主要介紹了Golang實現(xiàn)多存儲驅(qū)動設計SDK案例,Gocache是一個基于Go語言編寫的多存儲驅(qū)動的緩存擴展組件,更多具體內(nèi)容感興趣的小伙伴可以參考一下2022-09-09
go使用SQLX操作MySQL數(shù)據(jù)庫的教程詳解
sqlx 是 Go 語言中一個流行的操作數(shù)據(jù)庫的第三方包,它提供了對 Go 標準庫 database/sql 的擴展,簡化了操作數(shù)據(jù)庫的步驟,下面我們就來學習一下go如何使用SQLX實現(xiàn)MySQL數(shù)據(jù)庫的一些基本操作吧2023-11-11

