package captcha import ( "app.yhyue.com/moapp/jybase/captcha/helper" "app.yhyue.com/moapp/jybase/redis" "encoding/json" "fmt" "github.com/golang/freetype/truetype" "github.com/wenlng/go-captcha-assets/bindata/chars" "github.com/wenlng/go-captcha-assets/resources/fonts/fzshengsksjw" "github.com/wenlng/go-captcha-assets/resources/images" "github.com/wenlng/go-captcha-assets/resources/shapes" "github.com/wenlng/go-captcha/v2/base/option" "github.com/wenlng/go-captcha/v2/click" "image" "log" "strconv" "strings" ) // ClickBasicCaptcha click 文本 Basic=1 || 图形 Shape=2 func ClickBasicCaptcha() { builder := click.NewBuilder( click.WithRangeLen(option.RangeVal{Min: 4, Max: 6}), click.WithRangeVerifyLen(option.RangeVal{Min: 3, Max: 4}), click.WithDisabledRangeVerifyLen(true), click.WithRangeThumbColors([]string{ "#1f55c4", "#780592", "#2f6b00", "#910000", "#864401", "#675901", "#016e5c", }), click.WithRangeColors([]string{ "#fde98e", "#60c1ff", "#fcb08e", "#fb88ff", "#b4fed4", "#cbfaa9", "#78d6f8", }), ) var ( fonts *truetype.Font imgS []image.Image err error ) // fonts fonts, err = fzshengsksjw.GetFont() if err != nil { log.Fatalln(err) } // background images imgS, err = images.GetImages() if err != nil { log.Fatalln(err) } // set resources builder.SetResources( click.WithChars(chars.GetChineseChars()), //click.WithChars([]string{ // "1A", // "5E", // "3d", // "0p", // "78", // "DL", // "CB", // "9M", //}), //click.WithChars(chars.GetAlphaChars()), click.WithFonts([]*truetype.Font{fonts}), click.WithBackgrounds(imgS), //click.WithThumbBackgrounds(thumbImages), ) clickFuncS = append(clickFuncS, builder.Make()) // ============================ builder.Clear() builder.SetOptions( click.WithRangeLen(option.RangeVal{Min: 4, Max: 6}), click.WithRangeVerifyLen(option.RangeVal{Min: 3, Max: 4}), click.WithRangeThumbColors([]string{ "#4a85fb", "#d93ffb", "#56be01", "#ee2b2b", "#cd6904", "#b49b03", "#01ad90", }), ) builder.SetResources( click.WithChars(chars.GetChineseChars()), click.WithFonts([]*truetype.Font{fonts}), click.WithBackgrounds(imgS), ) clickFuncS = append(clickFuncS, builder.Make()) } // ClickShapeCaptcha . func ClickShapeCaptcha() { builder := click.NewBuilder( click.WithRangeLen(option.RangeVal{Min: 4, Max: 6}), click.WithRangeVerifyLen(option.RangeVal{Min: 2, Max: 3}), click.WithRangeThumbBgDistort(1), click.WithIsThumbNonDeformAbility(true), ) var ( shapeMaps map[string]image.Image imgS []image.Image err error ) // shape // click.WithUseShapeOriginalColor(false) -> Random rewriting of graphic colors shapeMaps, err = shapes.GetShapes() if err != nil { log.Fatalln(err) } // background images imgS, err = images.GetImages() if err != nil { log.Fatalln(err) } // set resources builder.SetResources( click.WithShapes(shapeMaps), click.WithBackgrounds(imgS), ) clickFuncS = append(clickFuncS, builder.MakeWithShape()) } // GetClickCaptchaData . func (c *GetCaptcha) GetClickCaptchaData() (cd CaptRes, err error) { if len(clickFuncS) == 0 { err = fmt.Errorf("get clickFuncS generate failed") return } var ( randIndex = rd.Intn(len(clickFuncS)) captData click.CaptchaData ) captData, err = clickFuncS[randIndex].Generate() if err != nil { log.Fatalln(err) return } dotData := captData.GetData() if dotData == 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 } dotsByte, _ := json.Marshal(dotData) 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("click >>>>>", string(dotsByte)) cd = CaptRes{ Code: randIndex + 3, CaptchaKey: captchaKey, ImageBase64: masterImageBase64, ThumbBase64: thumbImageBase64, } redis.Put(RedisCode, fmt.Sprintf(MoldCacheKey, captchaKey, c.Phone), cd.Code, SendCodeTtl) return } // CheckClickCaptchaData . func (c *CheckCaptcha) CheckClickCaptchaData(cacheDataByte []byte) (err error) { var dct map[int]*click.Dot if err = json.Unmarshal(cacheDataByte, &dct); err != nil { return } src := strings.Split(c.Point, ",") chkRet := false if (len(dct) * 2) == len(src) { for i := 0; i < len(dct); i++ { dot := dct[i] j := i * 2 k := i*2 + 1 sx, _ := strconv.ParseFloat(fmt.Sprintf("%v", src[j]), 64) sy, _ := strconv.ParseFloat(fmt.Sprintf("%v", src[k]), 64) chkRet = click.CheckPoint(int64(sx), int64(sy), int64(dot.X), int64(dot.Y), int64(dot.Width), int64(dot.Height), 0) if !chkRet { break } } } if !chkRet { err = fmt.Errorf("check result false") return } return }