123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- package captcha
- import (
- "app.yhyue.com/moapp/jybase/captcha/helper"
- "app.yhyue.com/moapp/jybase/redis"
- "encoding/json"
- "fmt"
- "github.com/wenlng/go-captcha-assets/resources/images"
- "github.com/wenlng/go-captcha-assets/resources/tiles"
- "github.com/wenlng/go-captcha/v2/slide"
- "image"
- "log"
- "strconv"
- "strings"
- )
- // SlideCaptcha slide 滑动 Basic=1 || 拖拽 Region=2
- func SlideCaptcha() {
- var builder = slide.NewBuilder(
- slide.WithGenGraphNumber(1),
- )
- // background images
- var (
- imgS []image.Image
- err error
- )
- imgS, err = images.GetImages()
- if err != nil {
- log.Fatalln(err)
- return
- }
- var graphs []*tiles.GraphImage
- graphs, err = tiles.GetTiles()
- if err != nil {
- log.Fatalln(err)
- return
- }
- var newGraphs = make([]*slide.GraphImage, 0, len(graphs))
- for i := 0; i < len(graphs); i++ {
- graph := graphs[i]
- newGraphs = append(newGraphs, &slide.GraphImage{
- OverlayImage: graph.OverlayImage,
- MaskImage: graph.MaskImage,
- ShadowImage: graph.ShadowImage,
- })
- }
- // set resources
- builder.SetResources(
- slide.WithGraphImages(newGraphs),
- slide.WithBackgrounds(imgS),
- )
- slideFuncS = append(slideFuncS, builder.Make(), builder.MakeWithRegion())
- }
- // GetSlideCaptchaData .
- func (c *GetCaptcha) GetSlideCaptchaData() (cd CaptRes, err error) {
- if len(slideFuncS) == 0 {
- err = fmt.Errorf("get slideFuncS generate failed")
- return
- }
- var (
- randIndex = 0 //rd.Intn(len(slideFuncS))
- captData slide.CaptchaData
- )
- captData, err = slideFuncS[randIndex].Generate()
- if err != nil {
- log.Fatalln(err)
- return
- }
- blockData := captData.GetData()
- if blockData == nil {
- err = fmt.Errorf("gen captcha data failed")
- return
- }
- var masterImageBase64, tileImageBase64 string
- masterImageBase64, err = captData.GetMasterImage().ToBase64()
- if err != nil {
- err = fmt.Errorf("masterImage base64 data failed")
- return
- }
- tileImageBase64, err = captData.GetTileImage().ToBase64()
- if err != nil {
- err = fmt.Errorf("tileImage base64 data failed")
- return
- }
- dotsByte, _ := json.Marshal(blockData)
- captchaKey := helper.StringToMD5(string(dotsByte))
- cacheKey := fmt.Sprintf(ResCacheKey, captchaKey, c.Phone)
- err = redis.PutBytes(RedisCode, cacheKey, &dotsByte, redisTtl)
- if err != nil {
- err = fmt.Errorf("cache save value failed")
- return
- }
- fmt.Println("slid >>>>>", string(dotsByte))
- cd = CaptRes{
- Code: randIndex + 1,
- CaptchaKey: captchaKey,
- ImageBase64: masterImageBase64,
- TileBase64: tileImageBase64,
- TileWidth: blockData.Width,
- TileHeight: blockData.Height,
- TileX: blockData.TileX,
- TileY: blockData.TileY,
- }
- redis.Put(RedisCode, fmt.Sprintf(MoldCacheKey, captchaKey, c.Phone), cd.Code, SendCodeTtl)
- return
- }
- // CheckSlideCaptchaData .
- func (c *CheckCaptcha) CheckSlideCaptchaData(cacheDataByte []byte) (err error) {
- src := strings.Split(c.Point, ",")
- var dct *slide.Block
- if err = json.Unmarshal(cacheDataByte, &dct); err != nil {
- return
- }
- chkRet := false
- if 2 == len(src) {
- sx, _ := strconv.ParseFloat(fmt.Sprintf("%v", src[0]), 64)
- sy, _ := strconv.ParseFloat(fmt.Sprintf("%v", src[1]), 64)
- chkRet = slide.CheckPoint(int64(sx), int64(sy), int64(dct.X), int64(dct.Y), Padding)
- }
- if !chkRet {
- err = fmt.Errorf("check result false")
- return
- }
- return nil
- }
|