前几天网站遭受垃圾信息攻击,于是就想添加一个图形验证码来玩玩。
网站使用 Python3 来写,但是图像验证我想写成一个服务,所以就用 Golang 来写了。
我们使用的库是 https://github.com/mojocn/base64Captcha
这个库有一个预览网站 ,看预览网站好酷炫有没有,但世纪用起来啊,真的是一言难尽。
对了,作者的官方博客上还是有很多了的,大家不妨去看看 https://mojotv.cn/
废话不多说了,我的用在生产环境的 图形验证码的代码如下 (正式环境有所变更,但核心都一样)
package main import ( "encoding/json" "fmt" captcha "github.com/mojocn/base64Captcha" "log" "net/http" ) var store = captcha.DefaultMemStore func NewDriver() *captcha.DriverString { driver := new(captcha.DriverString) driver.Height = 44 driver.Width = 120 driver.NoiseCount = 5 driver.ShowLineOptions = captcha.OptionShowSineLine | captcha.OptionShowSlimeLine | captcha.OptionShowHollowLine driver.Length = 6 driver.Source = "1234567890qwertyuipkjhgfdsazxcvbnm" driver.Fonts = []string{"wqy-microhei.ttc"} return driver } // 生成图形验证码 func generateCaptchaHandler(w http.ResponseWriter, r *http.Request) { var driver = NewDriver().ConvertFonts() c := captcha.NewCaptcha(driver, store) _, content, answer := c.Driver.GenerateIdQuestionAnswer() id := "captcha:yufei" item, _ := c.Driver.DrawCaptcha(content) c.Store.Set(id, answer) item.WriteTo(w) } // 验证 func captchaVerifyHandle(w http.ResponseWriter, r *http.Request) { id := "captcha:yufei" code := r.FormValue("code") body := map[string]interface{}{"code": 1000, "msg": "failed"} if store.Verify(id, code, true) { body = map[string]interface{}{"code": 1001, "msg": "ok"} } w.Header().Set("Content-Type", "application/json; charset=utf-8") json.NewEncoder(w).Encode(body) } func main() { http.HandleFunc("/captcha", generateCaptchaHandler) http.HandleFunc("/captcha/verify", captchaVerifyHandle) fmt.Println("Server is at :8080") if err := http.ListenAndServe(":8080", nil); err != nil { log.Fatal(err) } }
所以,如果要做一个服务是不是也很简单的事情? 改天有机会把图形验证服务也公布出来给大家
运行
go run main.go
然后访问 http://localhost:8080/captcha
获取图形验证码
访问 http://localhost:8080/captcha/verify?code=xxxx
来验证
目前尚无回复