我们用GO玩一下验证码

我们用GO玩一下验证码

嗨,我是小魔童哪吒,咱们上次分享的GO 中 defer 的实现原理,再来回顾一下吧

  • 分享了defer是什么
  • 简单示意了栈和队列
  • defer的数据结构和实现原理,具体的源码展示
  • GO 中defer3 条规则

要是对 GO 中 defer 实现原理还有点兴趣的话,欢迎查看文章 GO 中 defer的实现原理

今天我们来分享一些使用 GO 实现小案例,咱们边玩边成长

GO 的验证码介绍

我们平时使用到的验证码大致分为这几种,咱们梳理一下:

  • 传统输入的形式

输入图片上的数字,文字,字母等等

  • 输入类型的图形验证码

这个主要是来打广告的

  • 纯行为验证码

例如,按照提示滑动等等

  • 图标选择与行为辅助的验证码

例如咱们买火车票的时候验证码,各种图标让你选

  • 点击式的图文验证与行为辅助

例如某宝的验证码

  • 智能验证码

例如,点触智能验证码

GO 验证码案例

我们今天就来玩一玩第一种,使用最多的一种验证码吧

会使用 GO 的这个验证码库来完成,github.com/dchest/captcha

若我们向C/C++一样,将很多的底层处理都是我们自己来封装来实现的话,那还是挺累人的,GO 这一点确实蛮好,有很多使用的包,咱们在使用之余,也可以站在巨人的肩膀人,学习源码中的实现方式,学习大佬们的设计思想。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lC6WxucK-1625666538870)(https://i.loli.net/2021/06/19/q1joYsKZCSmT7Ep.gif)]

安装captcha

大家使用如下命令就可以下载下来使用

go get github.com/dchest/captcha

当我们在GOLAND 中用到 captcha库的时候,咱们可以看看源码目录

源码目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lAmTlVq9-1625666538873)(https://i.loli.net/2021/06/18/na2EQkyJZtxi1Pw.png)]

  • 有源码的具体使用案例
  • 具体的示例图片
  • 相关音频处理的实现
  • 验证码处理的实现
  • 图片处理的实现
  • 随机数处理的实现方式
  • 等等…

支持的语言

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jiT2gDwt-1625666538877)(https://i.loli.net/2021/06/18/3svjDucamYOJp8n.png)]

这个库目前支持的音频有 4 种语言:

  • 英文
  • 中文
  • 俄文
  • 日文

验证码默认参数

库中验证码的大小默认是 宽 240 px,高 80 px

在源码中的 image.go

const (
   // Standard width and height of a captcha image.
   StdWidth  = 240
   StdHeight = 80
   // Maximum absolute skew factor of a single digit.
   maxSkew = 0.7
   // Number of background circles.
   circleCount = 20
)

type Image struct {
   
   *image.Paletted
   numWidth  int
   numHeight int
   dotSize   int
   rng       siprng
}

随机数包含的字符

如下是验证码id中允许的字符 ,可以在源码中看到

源码包中的 random.go

// idChars are characters allowed in captcha id.
var idChars = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")

关于音频的处理

在源码的 sounds.go文件

目前对于音频只支持 4 种语言,"en", "ja", "ru", "zh".

/ NewAudio returns a new audio captcha with the given digits, where each digit
// must be in range 0-9. Digits are pronounced in the given language. If there
// are no sounds for the given language, English is used.
//
// Possible values for lang are "en", "ja", "ru", "zh".
func NewAudio(id string, digits []byte, lang string) *Audio {
   
   a := new(Audio)

   // Initialize PRNG.
   a.rng.Seed(deriveSeed(audioSeedPurpose, id, digits))

   if sounds, ok := digitSounds[lang]; ok {
   
      a.digitSounds = sounds
   } else {
   
      a.digitSounds = digitSounds["en"]
   }
   numsnd := make([][]byte, len(digits))
   nsdur := 0
   for i, n := range digits {
   
      snd := a.randomizedDigitSound(n)
      nsdur += len(snd)
      numsnd[i] = snd
   }
   // Random intervals between digits (including beginning).
   intervals := make([]int, len(digits)+1)
   intdur := 0
   for i := range intervals {
   
      dur := a.rng.Int(sampleRate, sampleRate*3) // 1 to 3 seconds
      intdur += dur
      intervals[i] = dur
   }
   // Generate background sound.
   bg := a.makeBackgroundSound(a.longestDigitSndL
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
要编写一个验证码识别工具,您需要对图像处理和机器学习有一定的了解。以下是一个基本的验证码识别程序的Golang实现,它使用了SVM机器学习算法和OpenCV库来处理和识别验证码。 ```go package main import ( "fmt" "image" "image/color" "image/draw" "image/jpeg" "log" "math/rand" "os" "path/filepath" "time" "github.com/otiai10/gosseract" "gocv.io/x/gocv" ) const ( letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" width, height = 200, 80 ) func main() { rand.Seed(time.Now().UnixNano()) // 生成随机验证码 img := generateCaptcha() // 保存验证码 captchaFile, _ := os.Create("captcha.jpg") jpeg.Encode(captchaFile, img, nil) captchaFile.Close() // 识别验证码 result := recognizeCaptcha("captcha.jpg") fmt.Println(result) } // 生成随机验证码 func generateCaptcha() *image.RGBA { // 创建一个黑色背景的图像 img := image.NewRGBA(image.Rect(0, 0, width, height)) draw.Draw(img, img.Bounds(), &image.Uniform{color.Black}, image.ZP, draw.Src) // 随机生成4个字符 var lettersRunes = []rune(letters) str := make([]rune, 4) for i := range str { str[i] = lettersRunes[rand.Intn(len(lettersRunes))] } // 在图像上绘制字符 for i, r := range str { face := gocv.FontHersheyPlain size := 2.0 + rand.Float64()*4.0 thickness := 1.0 + rand.Float64()*3.0 pt := gocv.Point{X: rand.Intn(width/4) + i*50 + 20, Y: rand.Intn(height/2) + 20} gocv.PutText(img, string(r), pt, face, size, color.RGBA{R: uint8(rand.Intn(256)), G: uint8(rand.Intn(256)), B: uint8(rand.Intn(256)), A: uint8(rand.Intn(256))}, int(thickness)) } // 添加噪点 for i := 0; i < 1000; i++ { pt := gocv.Point{X: rand.Intn(width), Y: rand.Intn(height)} gocv.Circle(img, pt, 1, color.RGBA{R: uint8(rand.Intn(256)), G: uint8(rand.Intn(256)), B: uint8(rand.Intn(256)), A: uint8(rand.Intn(256))}, -1) } return img } // 识别验证码 func recognizeCaptcha(captchaFile string) string { // 读取验证码图像 img := gocv.IMRead(captchaFile, gocv.IMReadColor) defer img.Close() // 灰度化 gray := gocv.NewMat() gocv.CvtColor(img, &gray, gocv.ColorBGRToGray) // 二值化 thresh := gocv.NewMat() gocv.AdaptiveThreshold(gray, &thresh, 255, gocv.AdaptiveThresholdGaussian, gocv.ThresholdBinary, 11, 2) // 轮廓检测 contours := gocv.FindContours(thresh, gocv.RetrievalExternal, gocv.ChainApproxSimple) captcha := gocv.NewMat() defer captcha.Close() // 识别每个字符 var result string for _, cnt := range contours { // 包围盒 x, y, w, h := gocv.BoundingRect(cnt) if w < 10 || h < 10 { continue } // 提取字符图像 roi := thresh.Region(image.Rectangle{Min: image.Point{X: x, Y: y}, Max: image.Point{X: x + w, Y: y + h}}) gocv.Resize(roi, &captcha, image.Point{X: 40, Y: 40}, 0, 0, gocv.InterpolationCubic) // OCR识别 captchaFile, _ := filepath.Abs("captcha_roi.jpg") gocv.IMWrite(captchaFile, captcha) client := gosseract.NewClient() client.SetImage(captchaFile) text, _ := client.Text() result += text } return result } ``` 上面的程序使用了随机生成的字符来生成验证码图像,然后使用OpenCV库和SVM机器学习算法来识别每个字符。在识别每个字符时,它使用了Tesseract OCR引擎来提高识别准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值