• 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. }

     

  • 相关阅读:
    第一百六十一回 Sliver综合示例
    Jwt隐藏大坑,通过源码揭秘
    4.drf-版本管理
    产品经理懂点技术:几种常用的系统开发方法
    tcp状态图
    下一代工具链「GitHub 热点速览 v.22.43」
    http-response返回数据被截断,返回不完全
    .NET高级面试指南专题二十六【适配器模式介绍,用于将一个类的接口转换成客户端所期待的另一个接口】
    【Linux】契子
    LCR 159.库存管理 III
  • 原文地址:https://blog.csdn.net/TomorrowAndTuture/article/details/134459757