rotate.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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/v2/base/option"
  9. "github.com/wenlng/go-captcha/v2/rotate"
  10. "image"
  11. "log"
  12. "strconv"
  13. )
  14. func RotateCaptcha() {
  15. builder := rotate.NewBuilder(rotate.WithRangeAnglePos([]option.RangeVal{
  16. {Min: 20, Max: 330},
  17. }))
  18. var (
  19. imgS []image.Image
  20. err error
  21. )
  22. // background images
  23. imgS, err = images.GetImages()
  24. if err != nil {
  25. log.Fatalln(err)
  26. }
  27. // set resources
  28. builder.SetResources(
  29. rotate.WithImages(imgS),
  30. )
  31. rotateFuncS = append(rotateFuncS, builder.Make())
  32. }
  33. // GetRotateCaptchaData .
  34. func (c *GetCaptcha) GetRotateCaptchaData() (cd CaptRes, err error) {
  35. if len(rotateFuncS) == 0 {
  36. err = fmt.Errorf("get rotateFuncS generate failed")
  37. return
  38. }
  39. var (
  40. captData rotate.CaptchaData
  41. )
  42. captData, err = rotateFuncS[0].Generate()
  43. if err != nil {
  44. log.Fatalln(err)
  45. return
  46. }
  47. blockData := captData.GetData()
  48. if blockData == nil {
  49. err = fmt.Errorf("gen captcha data failed")
  50. return
  51. }
  52. var masterImageBase64, thumbImageBase64 string
  53. masterImageBase64, err = captData.GetMasterImage().ToBase64()
  54. if err != nil {
  55. err = fmt.Errorf("masterImage base64 data failed")
  56. return
  57. }
  58. thumbImageBase64, err = captData.GetThumbImage().ToBase64()
  59. if err != nil {
  60. err = fmt.Errorf("tileImage base64 data failed")
  61. return
  62. }
  63. blockByte, _ := json.Marshal(blockData)
  64. captchaKey := helper.StringToMD5(string(blockByte))
  65. cacheKey := fmt.Sprintf(ResCacheKey, captchaKey, c.Phone)
  66. err = redis.PutBytes(RedisCode, cacheKey, &blockByte, redisTtl)
  67. if err != nil {
  68. err = fmt.Errorf("cache save value failed")
  69. return
  70. }
  71. fmt.Println("rotate >>>>>", string(blockByte))
  72. cd = CaptRes{
  73. Code: 6,
  74. CaptchaKey: captchaKey,
  75. ImageBase64: masterImageBase64,
  76. ThumbBase64: thumbImageBase64,
  77. ThumbSize: blockData.Width,
  78. }
  79. redis.Put(RedisCode, fmt.Sprintf(MoldCacheKey, captchaKey, c.Phone), cd.Code, SendCodeTtl)
  80. return
  81. }
  82. // CheckRotateCaptchaData .
  83. func (c *CheckCaptcha) CheckRotateCaptchaData(cacheDataByte []byte) (err error) {
  84. var dct *rotate.Block
  85. if err = json.Unmarshal(cacheDataByte, &dct); err != nil {
  86. return
  87. }
  88. sAngle, _ := strconv.ParseFloat(fmt.Sprintf("%v", c.Point), 64)
  89. chkRet := rotate.CheckAngle(int64(sAngle), int64(dct.Angle), 2)
  90. if !chkRet {
  91. err = fmt.Errorf("check result false")
  92. return
  93. }
  94. return
  95. }