slide.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package captcha
  2. import (
  3. "app.yhyue.com/moapp/jybase/captcha/helper"
  4. "app.yhyue.com/moapp/jybase/redis"
  5. "encoding/json"
  6. "fmt"
  7. "github.com/wenlng/go-captcha-assets/resources/images"
  8. "github.com/wenlng/go-captcha-assets/resources/tiles"
  9. "github.com/wenlng/go-captcha/v2/slide"
  10. "image"
  11. "log"
  12. "strconv"
  13. "strings"
  14. )
  15. // SlideCaptcha slide 滑动 Basic=1 || 拖拽 Region=2
  16. func SlideCaptcha() {
  17. var builder = slide.NewBuilder(
  18. slide.WithGenGraphNumber(1),
  19. )
  20. // background images
  21. var (
  22. imgS []image.Image
  23. err error
  24. )
  25. imgS, err = images.GetImages()
  26. if err != nil {
  27. log.Fatalln(err)
  28. return
  29. }
  30. var graphs []*tiles.GraphImage
  31. graphs, err = tiles.GetTiles()
  32. if err != nil {
  33. log.Fatalln(err)
  34. return
  35. }
  36. var newGraphs = make([]*slide.GraphImage, 0, len(graphs))
  37. for i := 0; i < len(graphs); i++ {
  38. graph := graphs[i]
  39. newGraphs = append(newGraphs, &slide.GraphImage{
  40. OverlayImage: graph.OverlayImage,
  41. MaskImage: graph.MaskImage,
  42. ShadowImage: graph.ShadowImage,
  43. })
  44. }
  45. // set resources
  46. builder.SetResources(
  47. slide.WithGraphImages(newGraphs),
  48. slide.WithBackgrounds(imgS),
  49. )
  50. slideFuncS = append(slideFuncS, builder.Make(), builder.MakeWithRegion())
  51. }
  52. // GetSlideCaptchaData .
  53. func (c *GetCaptcha) GetSlideCaptchaData() (cd CaptRes, err error) {
  54. if len(slideFuncS) == 0 {
  55. err = fmt.Errorf("get slideFuncS generate failed")
  56. return
  57. }
  58. var (
  59. randIndex = 0 //rd.Intn(len(slideFuncS))
  60. captData slide.CaptchaData
  61. )
  62. captData, err = slideFuncS[randIndex].Generate()
  63. if err != nil {
  64. log.Fatalln(err)
  65. return
  66. }
  67. blockData := captData.GetData()
  68. if blockData == nil {
  69. err = fmt.Errorf("gen captcha data failed")
  70. return
  71. }
  72. var masterImageBase64, tileImageBase64 string
  73. masterImageBase64, err = captData.GetMasterImage().ToBase64()
  74. if err != nil {
  75. err = fmt.Errorf("masterImage base64 data failed")
  76. return
  77. }
  78. tileImageBase64, err = captData.GetTileImage().ToBase64()
  79. if err != nil {
  80. err = fmt.Errorf("tileImage base64 data failed")
  81. return
  82. }
  83. dotsByte, _ := json.Marshal(blockData)
  84. captchaKey := helper.StringToMD5(string(dotsByte))
  85. cacheKey := fmt.Sprintf(ResCacheKey, captchaKey, c.Phone)
  86. err = redis.PutBytes(RedisCode, cacheKey, &dotsByte, redisTtl)
  87. if err != nil {
  88. err = fmt.Errorf("cache save value failed")
  89. return
  90. }
  91. fmt.Println("slid >>>>>", string(dotsByte))
  92. cd = CaptRes{
  93. Code: randIndex + 1,
  94. CaptchaKey: captchaKey,
  95. ImageBase64: masterImageBase64,
  96. TileBase64: tileImageBase64,
  97. TileWidth: blockData.Width,
  98. TileHeight: blockData.Height,
  99. TileX: blockData.TileX,
  100. TileY: blockData.TileY,
  101. }
  102. redis.Put(RedisCode, fmt.Sprintf(MoldCacheKey, captchaKey, c.Phone), cd.Code, SendCodeTtl)
  103. return
  104. }
  105. // CheckSlideCaptchaData .
  106. func (c *CheckCaptcha) CheckSlideCaptchaData(cacheDataByte []byte) (err error) {
  107. src := strings.Split(c.Point, ",")
  108. var dct *slide.Block
  109. if err = json.Unmarshal(cacheDataByte, &dct); err != nil {
  110. return
  111. }
  112. chkRet := false
  113. if 2 == len(src) {
  114. sx, _ := strconv.ParseFloat(fmt.Sprintf("%v", src[0]), 64)
  115. sy, _ := strconv.ParseFloat(fmt.Sprintf("%v", src[1]), 64)
  116. chkRet = slide.CheckPoint(int64(sx), int64(sy), int64(dct.X), int64(dct.Y), Padding)
  117. }
  118. if !chkRet {
  119. err = fmt.Errorf("check result false")
  120. return
  121. }
  122. return nil
  123. }