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/v2/base/option" "github.com/wenlng/go-captcha/v2/rotate" "image" "log" "strconv" ) func RotateCaptcha() { builder := rotate.NewBuilder(rotate.WithRangeAnglePos([]option.RangeVal{ {Min: 20, Max: 330}, })) var ( imgS []image.Image err error ) // background images imgS, err = images.GetImages() if err != nil { log.Fatalln(err) } // set resources builder.SetResources( rotate.WithImages(imgS), ) rotateFuncS = append(rotateFuncS, builder.Make()) } // GetRotateCaptchaData . func (c *GetCaptcha) GetRotateCaptchaData() (cd CaptRes, err error) { if len(rotateFuncS) == 0 { err = fmt.Errorf("get rotateFuncS generate failed") return } var ( captData rotate.CaptchaData ) captData, err = rotateFuncS[0].Generate() if err != nil { log.Fatalln(err) return } blockData := captData.GetData() if blockData == nil { err = fmt.Errorf("gen captcha data failed") return } var masterImageBase64, thumbImageBase64 string masterImageBase64, err = captData.GetMasterImage().ToBase64() if err != nil { err = fmt.Errorf("masterImage base64 data failed") return } thumbImageBase64, err = captData.GetThumbImage().ToBase64() if err != nil { err = fmt.Errorf("tileImage base64 data failed") return } blockByte, _ := json.Marshal(blockData) captchaKey := helper.StringToMD5(string(blockByte)) cacheKey := fmt.Sprintf(ResCacheKey, captchaKey, c.Phone) err = redis.PutBytes(RedisCode, cacheKey, &blockByte, redisTtl) if err != nil { err = fmt.Errorf("cache save value failed") return } fmt.Println("rotate >>>>>", string(blockByte)) cd = CaptRes{ Code: 6, CaptchaKey: captchaKey, ImageBase64: masterImageBase64, ThumbBase64: thumbImageBase64, ThumbSize: blockData.Width, } redis.Put(RedisCode, fmt.Sprintf(MoldCacheKey, captchaKey, c.Phone), cd.Code, SendCodeTtl) return } // CheckRotateCaptchaData . func (c *CheckCaptcha) CheckRotateCaptchaData(cacheDataByte []byte) (err error) { var dct *rotate.Block if err = json.Unmarshal(cacheDataByte, &dct); err != nil { return } sAngle, _ := strconv.ParseFloat(fmt.Sprintf("%v", c.Point), 64) chkRet := rotate.CheckAngle(int64(sAngle), int64(dct.Angle), 2) if !chkRet { err = fmt.Errorf("check result false") return } return }