日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

golang生成滑塊驗證碼

最近公司要求做一個滑塊驗證碼,但是因為項目是孵化階段,暫時不考慮使用第三方驗證,于是只能自己寫了,于是各種百度,幾乎百度不到。

于是我參考了一下網易易盾的滑塊驗證碼,我發現他的北京圖片都是480*240的 于是我找了一堆480*240的背景圖

使用golang寫一個滑塊驗證碼的庫

 

準備了10張背景圖

我的思路是這樣的,找了一張100*100半透明png圖

然后隨機取一個坐標把這個半透明圖蓋在背景圖上合成一張驗證圖

在把透明圖蓋住的地方截取出來 效果如下

使用golang寫一個滑塊驗證碼的庫

 


使用golang寫一個滑塊驗證碼的庫

 

剩下的就移交給前端大佬了

上代碼 這里我們需要用到一個庫 "
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里面對比 這個坐標在誤差值范圍內則驗證通過

分享到:
標簽:golang
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定