click.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  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/golang/freetype/truetype"
  8. "github.com/wenlng/go-captcha-assets/bindata/chars"
  9. "github.com/wenlng/go-captcha-assets/resources/fonts/fzshengsksjw"
  10. "github.com/wenlng/go-captcha-assets/resources/images"
  11. "github.com/wenlng/go-captcha-assets/resources/shapes"
  12. "github.com/wenlng/go-captcha/v2/base/option"
  13. "github.com/wenlng/go-captcha/v2/click"
  14. "image"
  15. "log"
  16. "strconv"
  17. "strings"
  18. )
  19. // ClickBasicCaptcha click 文本 Basic=1 || 图形 Shape=2
  20. func ClickBasicCaptcha() {
  21. builder := click.NewBuilder(
  22. click.WithRangeLen(option.RangeVal{Min: 4, Max: 6}),
  23. click.WithRangeVerifyLen(option.RangeVal{Min: 3, Max: 4}),
  24. click.WithDisabledRangeVerifyLen(true),
  25. click.WithRangeThumbColors([]string{
  26. "#1f55c4",
  27. "#780592",
  28. "#2f6b00",
  29. "#910000",
  30. "#864401",
  31. "#675901",
  32. "#016e5c",
  33. }),
  34. click.WithRangeColors([]string{
  35. "#fde98e",
  36. "#60c1ff",
  37. "#fcb08e",
  38. "#fb88ff",
  39. "#b4fed4",
  40. "#cbfaa9",
  41. "#78d6f8",
  42. }),
  43. )
  44. var (
  45. fonts *truetype.Font
  46. imgS []image.Image
  47. err error
  48. )
  49. // fonts
  50. fonts, err = fzshengsksjw.GetFont()
  51. if err != nil {
  52. log.Fatalln(err)
  53. }
  54. // background images
  55. imgS, err = images.GetImages()
  56. if err != nil {
  57. log.Fatalln(err)
  58. }
  59. // set resources
  60. builder.SetResources(
  61. click.WithChars(chars.GetChineseChars()),
  62. //click.WithChars([]string{
  63. // "1A",
  64. // "5E",
  65. // "3d",
  66. // "0p",
  67. // "78",
  68. // "DL",
  69. // "CB",
  70. // "9M",
  71. //}),
  72. //click.WithChars(chars.GetAlphaChars()),
  73. click.WithFonts([]*truetype.Font{fonts}),
  74. click.WithBackgrounds(imgS),
  75. //click.WithThumbBackgrounds(thumbImages),
  76. )
  77. clickFuncS = append(clickFuncS, builder.Make())
  78. // ============================
  79. builder.Clear()
  80. builder.SetOptions(
  81. click.WithRangeLen(option.RangeVal{Min: 4, Max: 6}),
  82. click.WithRangeVerifyLen(option.RangeVal{Min: 3, Max: 4}),
  83. click.WithRangeThumbColors([]string{
  84. "#4a85fb",
  85. "#d93ffb",
  86. "#56be01",
  87. "#ee2b2b",
  88. "#cd6904",
  89. "#b49b03",
  90. "#01ad90",
  91. }),
  92. )
  93. builder.SetResources(
  94. click.WithChars(chars.GetChineseChars()),
  95. click.WithFonts([]*truetype.Font{fonts}),
  96. click.WithBackgrounds(imgS),
  97. )
  98. clickFuncS = append(clickFuncS, builder.Make())
  99. }
  100. // ClickShapeCaptcha .
  101. func ClickShapeCaptcha() {
  102. builder := click.NewBuilder(
  103. click.WithRangeLen(option.RangeVal{Min: 4, Max: 6}),
  104. click.WithRangeVerifyLen(option.RangeVal{Min: 2, Max: 3}),
  105. click.WithRangeThumbBgDistort(1),
  106. click.WithIsThumbNonDeformAbility(true),
  107. )
  108. var (
  109. shapeMaps map[string]image.Image
  110. imgS []image.Image
  111. err error
  112. )
  113. // shape
  114. // click.WithUseShapeOriginalColor(false) -> Random rewriting of graphic colors
  115. shapeMaps, err = shapes.GetShapes()
  116. if err != nil {
  117. log.Fatalln(err)
  118. }
  119. // background images
  120. imgS, err = images.GetImages()
  121. if err != nil {
  122. log.Fatalln(err)
  123. }
  124. // set resources
  125. builder.SetResources(
  126. click.WithShapes(shapeMaps),
  127. click.WithBackgrounds(imgS),
  128. )
  129. clickFuncS = append(clickFuncS, builder.MakeWithShape())
  130. }
  131. // GetClickCaptchaData .
  132. func (c *GetCaptcha) GetClickCaptchaData() (cd CaptRes, err error) {
  133. if len(clickFuncS) == 0 {
  134. err = fmt.Errorf("get clickFuncS generate failed")
  135. return
  136. }
  137. var (
  138. randIndex = rd.Intn(len(clickFuncS))
  139. captData click.CaptchaData
  140. )
  141. captData, err = clickFuncS[randIndex].Generate()
  142. if err != nil {
  143. log.Fatalln(err)
  144. return
  145. }
  146. dotData := captData.GetData()
  147. if dotData == nil {
  148. err = fmt.Errorf("gen captcha data failed")
  149. return
  150. }
  151. var masterImageBase64, thumbImageBase64 string
  152. masterImageBase64, err = captData.GetMasterImage().ToBase64()
  153. if err != nil {
  154. err = fmt.Errorf("masterImage base64 data failed")
  155. return
  156. }
  157. thumbImageBase64, err = captData.GetThumbImage().ToBase64()
  158. if err != nil {
  159. err = fmt.Errorf("tileImage base64 data failed")
  160. return
  161. }
  162. dotsByte, _ := json.Marshal(dotData)
  163. captchaKey := helper.StringToMD5(string(dotsByte))
  164. cacheKey := fmt.Sprintf(ResCacheKey, captchaKey, c.Phone)
  165. err = redis.PutBytes(RedisCode, cacheKey, &dotsByte, redisTtl)
  166. if err != nil {
  167. err = fmt.Errorf("cache save value failed")
  168. return
  169. }
  170. fmt.Println("click >>>>>", string(dotsByte))
  171. cd = CaptRes{
  172. Code: randIndex + 3,
  173. CaptchaKey: captchaKey,
  174. ImageBase64: masterImageBase64,
  175. ThumbBase64: thumbImageBase64,
  176. }
  177. redis.Put(RedisCode, fmt.Sprintf(MoldCacheKey, captchaKey, c.Phone), cd.Code, SendCodeTtl)
  178. return
  179. }
  180. // CheckClickCaptchaData .
  181. func (c *CheckCaptcha) CheckClickCaptchaData(cacheDataByte []byte) (err error) {
  182. var dct map[int]*click.Dot
  183. if err = json.Unmarshal(cacheDataByte, &dct); err != nil {
  184. return
  185. }
  186. src := strings.Split(c.Point, ",")
  187. chkRet := false
  188. if (len(dct) * 2) == len(src) {
  189. for i := 0; i < len(dct); i++ {
  190. dot := dct[i]
  191. j := i * 2
  192. k := i*2 + 1
  193. sx, _ := strconv.ParseFloat(fmt.Sprintf("%v", src[j]), 64)
  194. sy, _ := strconv.ParseFloat(fmt.Sprintf("%v", src[k]), 64)
  195. chkRet = click.CheckPoint(int64(sx), int64(sy), int64(dot.X), int64(dot.Y), int64(dot.Width), int64(dot.Height), 0)
  196. if !chkRet {
  197. break
  198. }
  199. }
  200. }
  201. if !chkRet {
  202. err = fmt.Errorf("check result false")
  203. return
  204. }
  205. return
  206. }