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 }