123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- 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
- }
|