golang生成滑塊驗證碼
最近公司要求做一個滑塊驗證碼,但是因為項目是孵化階段,暫時不考慮使用第三方驗證,于是只能自己寫了,于是各種百度,幾乎百度不到。
于是我參考了一下網易易盾的滑塊驗證碼,我發現他的北京圖片都是480*240的 于是我找了一堆480*240的背景圖
準備了10張背景圖
我的思路是這樣的,找了一張100*100半透明png圖
然后隨機取一個坐標把這個半透明圖蓋在背景圖上合成一張驗證圖
在把透明圖蓋住的地方截取出來 效果如下
剩下的就移交給前端大佬了
上代碼 這里我們需要用到一個庫 "
github.com/disintegration/imaging" 使用 go mod的形式安裝
首先創建一個隨機數函數
func GetRandInt(max int) int {
num, _ := rand.Int(rand.Reader, big.NewInt(int64(max-1)))
return int(num.Int64())
}
創建驗證碼
func CreateCode() (string, int, int) {
//生成隨機數
nums := tool.GetRandInt(10)
imageId := tool.GetUuid()
f, _ := os.Open("./captcha/bg/" + strconv.Itoa(nums) + ".png")
//獲取隨機x坐標
imageRandX := tool.GetRandInt(480 - 100)
if imageRandX < 200 {
imageRandX += 200
}
//獲取隨機y坐標
imageRandY := tool.GetRandInt(240 - 100)
if imageRandY < 100 {
imageRandY += 100
}
//轉化為image對象
m, err := png.Decode(f)
if err != nil {
panic(err)
}
//設置截取的最大坐標值和最小坐標值
maxPotion := image.Point{
X: imageRandX,
Y: imageRandY,
}
minPotion := image.Point{
X: imageRandX - 100,
Y: imageRandY - 100,
}
subimg := image.Rectangle{
Max: maxPotion,
Min: minPotion,
}
f, err = os.Create("./captcha/code/" + imageId + "screenshot.jpeg")
defer f.Close()
//截取圖像
data := imaging.Crop(m, subimg)
jpeg.Encode(f, data, nil)
//設置遮罩
createCodeImg("./captcha/bg/"+strconv.Itoa(nums)+".png", minPotion, imageId)
return imageId, imageRandX, imageRandY
}
func createCodeImg(path string, minPotion image.Point, imageId string) {
bg, err := os.Open(path)
if err != nil {
panic(err)
}
maskFile, err := os.Open("./captcha/mask.png")
if err != nil {
panic(err)
}
bgimg, err := png.Decode(bg)
maskimg, err := png.Decode(maskFile)
data := imaging.Overlay(bgimg, maskimg, minPotion, 1.0)
f, err := os.Create("./captcha/code/" + imageId + ".jpeg")
defer f.Close()
jpeg.Encode(f, data, nil)
}
可以看到我創建了以后我會返回一個圖片的id 圖片的截圖的x坐標和y坐標 把y坐標傳給前端,吧圖片id記錄到cookie,后端把x坐標存到redis里面 前端根據用戶傳滑動的操作吧x坐標傳給后端 后端取出cookie里面的圖片id拿到redis里面對比 這個坐標在誤差值范圍內則驗證通過