• Go 之 captcha 生成图像验证码


    目前 chptcha 好像只可以生成纯数字的图像验证码,不过对于普通简单应用来说也足够了。captcha默认将store封装到内部,未提供对外操作的接口,因此使用自己显式生成的store,可以通过store自定义要生成的验证码。

    1. package main
    2. import (
    3. "bytes"
    4. "fmt"
    5. "github.com/dchest/captcha"
    6. "log"
    7. "os"
    8. )
    9. // Captcha 方便后期扩展
    10. type Captcha struct{}
    11. // 单例
    12. var captchaInstance *Captcha
    13. func Instance() *Captcha {
    14. if captchaInstance == nil {
    15. captchaInstance = &Captcha{}
    16. }
    17. return captchaInstance
    18. }
    19. // CreateImage 创建图片验证码
    20. func (this *Captcha) CreateImage() string {
    21. length := captcha.DefaultLen
    22. captchaId := captcha.NewLen(length)
    23. return captchaId
    24. }
    25. // Reload 重载
    26. func (this *Captcha) Reload(captchaId string) bool {
    27. return captcha.Reload(captchaId)
    28. }
    29. // Verify 验证
    30. func (this *Captcha) VerifyString(captchaId, val string) bool {
    31. return captcha.VerifyString(captchaId, val)
    32. }
    33. func (this *Captcha) Verify(captchaId string, digits []byte) bool {
    34. return captcha.Verify(captchaId, digits)
    35. }
    36. // GetImageByte 获取图片二进制流
    37. func (this *Captcha) GetImageByte(captchaId string) []byte {
    38. var content bytes.Buffer
    39. err := captcha.WriteImage(&content, captchaId, captcha.StdWidth, captcha.StdHeight)
    40. if err != nil {
    41. log.Println(err)
    42. return nil
    43. }
    44. return content.Bytes()
    45. }
    46. // WriteImageFile 写图片文件
    47. func (this *Captcha) WriteImageFile(b []byte, file string) {
    48. f, err := os.OpenFile(file, os.O_CREATE | os.O_RDWR, os.ModePerm)
    49. defer f.Close()
    50. if err != nil {
    51. log.Println(err)
    52. }
    53. f.Write(b)
    54. }
    55. func main() {
    56. // capt := Instance()
    57. // captId := capt.CreateImage()
    58. // capt.WriteImageFile(capt.GetImageByte(captId), "test.png")
    59. // captcha默认将store封装到内部,未提供对外操作的接口
    60. // 使用自己显式生成的store,可以通过store自定义要生成的图形验证码
    61. store := captcha.NewMemoryStore(captcha.CollectNum, captcha.Expiration)
    62. captcha.SetCustomStore(store)
    63. capt := Instance()
    64. captId := capt.CreateImage()
    65. b := []byte{6, 6, 6, 8, 8, 8}
    66. store.Set(captId, b)
    67. // store.Set(captId, captcha.RandomDigits(6))
    68. fmt.Println(store.Get(captId, false))
    69. capt.WriteImageFile(capt.GetImageByte(captId), "test.png")
    70. // vs := capt.VerifyString(captId, "666888")
    71. v := capt.Verify(captId, b)
    72. if v {
    73. fmt.Println("verify succeed")
    74. } else {
    75. fmt.Println("verify failed")
    76. }
    77. }

     

  • 相关阅读:
    RabbitMQ详解(上)
    v-decorator和v-model的使用对比
    Llama 3.1用了1.6万个英伟达H100 GPU,耗费......
    ubuntu搭建opencv开发环境
    NH2-PEG-MAL 氨基PEG马来酰亚胺
    后端搜索条件
    Python企业面试题2 —— 基础篇
    安全先行,合规的内外网文件摆渡要重点关注什么?
    Spark简介
    京东 java 研发岗二面:Tomcat 是如何做到热加载和热部署的?
  • 原文地址:https://blog.csdn.net/TomorrowAndTuture/article/details/134459757