1 Star 26 Fork 4

wenlng/go-captcha

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
Apache-2.0

Go Captcha

行为验证码


English | 中文

Go Captcha 是行为式验证码,支持文本/图形点选、滑动/拖拽、旋转等验证模式。

⭐️ 如果能帮助到你,请随手给点一个star

QQ交流群:178498936


Poster


设置Go代理

  • Window
$ set GO111MODULE=on
$ set GOPROXY=https://goproxy.io,direct

### The Golang 1.13+ can be executed directly
$ go env -w GO111MODULE=on
$ go env -w GOPROXY=https://goproxy.io,direct
  • Linux or Mac
$ export GO111MODULE=on
$ export GOPROXY=https://goproxy.io,direct

### or
$ echo "export GO111MODULE=on" >> ~/.profile
$ echo "export GOPROXY=https://goproxy.cn,direct" >> ~/.profile
$ source ~/.profile

安装模块

$ go get -u github.com/wenlng/go-captcha/v2@latest

引入模块

package main

import "github.com/wenlng/go-captcha/v2"

func main(){
   // ....
}

🖖点选式

快速使用

package main

import (
	"encoding/json"
	"fmt"
	"image"
	"log"
	"io/ioutil"

	"github.com/golang/freetype"
	"github.com/golang/freetype/truetype"
	"github.com/wenlng/go-captcha/v2/base/option"
	"github.com/wenlng/go-captcha/v2/click"
	"github.com/wenlng/go-captcha/v2/base/codec"
)

var textCapt click.Captcha

func init() {
	builder := click.NewBuilder(
		click.WithRangeLen(option.RangeVal{Min: 4, Max: 6}),
		click.WithRangeVerifyLen(option.RangeVal{Min: 2, Max: 4}),
	)

	// 可以使用预置的素材资源:https://github.com/wenlng/go-captcha-assets
	fontN, err := loadFont("../resources/fzshengsksjw_cu.ttf")
	if err != nil {
		log.Fatalln(err)
	}

	bgImage, err := loadPng("../resources/bg.png")
	if err != nil {
		log.Fatalln(err)
	}

	builder.SetResources(
		click.WithChars([]string{"这", "是", "随", "机", "的", "文", "本", "种", "子", "呀"}),
		click.WithFonts([]*truetype.Font{
			fontN,
		}),
		click.WithBackgrounds([]image.Image{
			bgImage,
		}),
	)

	textCapt = builder.Make()
}

func loadPng(p string) (image.Image, error) {
	imgBytes, err := ioutil.ReadFile(p)
	if err != nil {
		return nil, err
	}
	return codec.DecodeByteToPng(imgBytes)
}

func loadFont(p string) (*truetype.Font, error) {
	fontBytes, err := ioutil.ReadFile(p)
	if err != nil {
		panic(err)
	}
	return freetype.ParseFont(fontBytes)
}


func main() {
	captData, err := textCapt.Generate()
	if err != nil {
		log.Fatalln(err)
	}

	dotData := captData.GetData()
	if dotData == nil {
		log.Fatalln(">>>>> generate err")
	}

	dots, _ := json.Marshal(dotData)
	fmt.Println(">>>>> ", string(dots))

	var mBase64, tBase64 string
	mBase64, err = captData.GetMasterImage().ToBase64()
	if err != nil {
		fmt.Println(err)
	}
	tBase64, err = captData.GetThumbImage().ToBase64()
	if err != nil {
		fmt.Println(err)
	}

	fmt.Println(">>>>> ", mBase64)
	fmt.Println(">>>>> ", tBase64)
	
	//err = captData.GetMasterImage().SaveToFile("../resources/master.jpg", option.QualityNone)
	//if err != nil {
	//	fmt.Println(err)
	//}
	//err = captData.GetThumbImage().SaveToFile("../resources/thumb.png")
	//if err != nil {
	//	fmt.Println(err)
	//}
}

创建实例

  • builder.Make() 中文文本、字母数字混合点选
  • builder.MakeWithShape() 图形点选

配置选项

click.NewBuilder(click.WithXxx(), ...) 或 builder.SetOptions(click.WithXxx(), ...)

  • click.WithImageSize(option.Size) 设置主图尺寸,默认 300x220

  • click.WithRangeLen(option.RangeVal) 设置随机内容长度范围

  • click.WithRangeAnglePos([]option.RangeVal) 设置随机角度范围

  • click.WithRangeSize(option.RangeVal) 设置随机内容大小范围

  • click.WithRangeColors([]string) 设置随机颜色

  • click.WithDisplayShadow(bool) 设置是否显示阴影

  • click.WithShadowColor(string) 设置阴影颜色

  • click.WithShadowPoint(option.Point) 设置阴影偏移位置

  • click.WithImageAlpha(float32) 设置主图透明度

  • click.WithUseShapeOriginalColor(bool) 设置是否使用图形原始颜色,"图形点选"有效

  • click.WithThumbImageSize(option.Size) 设置缩略尺寸,默认 150x40

  • click.WithRangeVerifyLen(option.RangeVal) 设置校验内容的随机长度范围

  • click.WithDisabledRangeVerifyLen(bool) 禁用校验内容的随机长度,与主图内容的长度保持一致

  • click.WithRangeThumbSize(option.RangeVal) 设置随机缩略内容随机大小范围

  • click.WithRangeThumbColors([]string) 设置缩略随机颜色范围

  • click.WithRangeThumbBgColors([]string) 设置缩略随机背景颜色范围

  • click.WithIsThumbNonDeformAbility(bool) 设置缩略图内容不变形,不受背景影响

  • click.WithThumbBgDistort(int) 设置缩略图背景扭曲 option.DistortLevel1 至 option.DistortLevel5

  • click.WithThumbBgCirclesNum(int) 设置缩略图绘制小圆点数量

  • click.WithThumbBgSlimLineNum(int) 设置缩略图绘制线条数量

设置资源

builder.SetResources(click.WithXxx(), ...)

  • click.WithChars([]string) 设置文本种子
  • click.WithShapes(map[string]image.Image) 设置图形种子
  • click.WithFonts([]*truetype.Font) 设置字体
  • click.WithBackgrounds([]image.Image) 设置主图背景
  • click.WithThumbBackgrounds([]image.Image) 设置缩略图背景

验证码数据

  • GetData() map[int]*Dot 获取当前校验的信息
  • GetMasterImage() imagedata.JPEGImageData 获取主图
  • GetThumbImage() imagedata.PNGImageData 获取缩略图

🖖 滑动/拖拽式

快速使用

package main

import (
	"encoding/json"
	"fmt"
	"image"
	"log"
	"io/ioutil"

	"github.com/wenlng/go-captcha/v2/base/option"
	"github.com/wenlng/go-captcha/v2/slide"
	"github.com/wenlng/go-captcha/v2/base/codec"
)

var slideTileCapt slide.Captcha

func init() {
	builder := slide.NewBuilder()

	// 可以使用预置的素材资源:https://github.com/wenlng/go-captcha-assets
	bgImage, err := loadPng("../resources/bg.png")
	if err != nil {
		log.Fatalln(err)
	}

	bgImage1, err := loadPng("../resources/bg1.png")
	if err != nil {
		log.Fatalln(err)
	}

	graphs := getSlideTileGraphArr()

	builder.SetResources(
		slide.WithGraphImages(graphs),
		slide.WithBackgrounds([]image.Image{
			bgImage,
			bgImage1,
		}),
	)

	slideTileCapt = builder.Make()
}

func getSlideTileGraphArr() []*slide.GraphImage {
	tileImage1, err := loadPng("../resources/tile-1.png")
	if err != nil {
		log.Fatalln(err)
	}

	tileShadowImage1, err := loadPng("../resources/tile-shadow-1.png")
	if err != nil {
		log.Fatalln(err)
	}
	tileMaskImage1, err := loadPng("../resources/tile-mask-1.png")
	if err != nil {
		log.Fatalln(err)
	}

	return []*slide.GraphImage{
		{
			OverlayImage: tileImage1,
			ShadowImage:  tileShadowImage1,
			MaskImage:    tileMaskImage1,
		},
	}
}

func main() {
	captData, err := slideTileCapt.Generate()
	if err != nil {
		log.Fatalln(err)
	}

	blockData := captData.GetData()
	if blockData == nil {
		log.Fatalln(">>>>> generate err")
	}

	block, _ := json.Marshal(blockData)
	fmt.Println(">>>>>", string(block))

	var mBase64, tBase64 string
	mBase64, err = captData.GetMasterImage().ToBase64()
	if err != nil {
		fmt.Println(err)
	}
	tBase64, err = captData.GetTileImage().ToBase64()
	if err != nil {
		fmt.Println(err)
	}

	fmt.Println(">>>>> ", mBase64)
	fmt.Println(">>>>> ", tBase64)
	
	//err = captData.GetMasterImage().SaveToFile("../resources/master.jpg", option.QualityNone)
	//if err != nil {
	//	fmt.Println(err)
	//}
	//err = captData.GetTileImage().SaveToFile("../resources/thumb.png")
	//if err != nil {
	//	fmt.Println(err)
	//}
}

func loadPng(p string) (image.Image, error) {
	imgBytes, err := ioutil.ReadFile(p)
	if err != nil {
		return nil, err
	}
	return codec.DecodeByteToPng(imgBytes)
}

创建实例

  • builder.Make() 滑动式
  • builder.MakeWithRegion() 区域内拖拽式

配置选项

slide.NewBuilder(slide.WithXxx(), ...) 或 builder.SetOptions(slide.WithXxx(), ...)

  • slide.WithImageSize(*option.Size) 设置主图尺寸,默认 300x220
  • slide.WithImageAlpha(float32) 设置主图透明度
  • slide.WithRangeGraphSize(val option.RangeVal) 设置图形随机尺寸范围
  • slide.WithRangeGraphAnglePos([]option.RangeVal) 设置图形随机角度范围
  • slide.WithGenGraphNumber(val int) 设置图形个数
  • slide.WithEnableGraphVerticalRandom(val bool) 设置图形水平方向是否随机排序
  • slide.WithRangeDeadZoneDirections(val []DeadZoneDirectionType) 设置贴图盲区

设置资源

builder.SetResources(slide.WithXxx(), ...)

  • slide.WithBackgrounds([]image.Image) 设置主图背景
  • slide.WithGraphImages(images []*GraphImage) 设置贴图的图形

验证码数据

  • GetData() *Block 获取当前校验的信息
  • GetMasterImage() imagedata.JPEGImageData 获取主图
  • GetTileImage() imagedata.PNGImageData 获取缩略图

🖖 旋转式

快速使用

package main

import (
	"encoding/json"
	"fmt"
	"image"
	"log"
	"io/ioutil"

	"github.com/wenlng/go-captcha/v2/rotate"
	"github.com/wenlng/go-captcha/v2/base/codec"
)

var rotateCapt rotate.Captcha

func init() {
	builder := rotate.NewBuilder()

	// 可以使用预置的素材资源:https://github.com/wenlng/go-captcha-assets
	bgImage, err := loadPng("../resources/bg.png")
	if err != nil {
		log.Fatalln(err)
	}

	bgImage1, err := loadPng("../resources/bg1.png")
	if err != nil {
		log.Fatalln(err)
	}

	builder.SetResources(
		rotate.WithImages([]image.Image{
			bgImage,
			bgImage1,
		}),
	)

	rotateCapt = builder.Make()
}

func main() {
	captData, err := rotateCapt.Generate()
	if err != nil {
		log.Fatalln(err)
	}

	blockData := captData.GetData()
	if blockData == nil {
		log.Fatalln(">>>>> generate err")
	}

	block, _ := json.Marshal(blockData)
	fmt.Println(">>>>>", string(block))

	var mBase64, tBase64 string
	mBase64, err = captData.GetMasterImage().ToBase64()
	if err != nil {
		fmt.Println(err)
	}
	tBase64, err = captData.GetThumbImage().ToBase64()
	if err != nil {
		fmt.Println(err)
	}

	fmt.Println(">>>>> ", mBase64)
	fmt.Println(">>>>> ", tBase64)
	
	//err = captData.GetMasterImage().SaveToFile("../resources/master.png")
	//if err != nil {
	//	fmt.Println(err)
	//}
	//err = captData.GetThumbImage().SaveToFile("../resources/thumb.png")
	//if err != nil {
	//	fmt.Println(err)
	//}
}

func loadPng(p string) (image.Image, error) {
	imgBytes, err := ioutil.ReadFile(p)
	if err != nil {
		return nil, err
	}
	return codec.DecodeByteToPng(imgBytes)
}

创建实例

  • builder.Make() 旋转式

配置选项

rotate.NewBuilder(rotate.WithXxx(), ...) 或 builder.SetOptions(rotate.WithXxx(), ...)

  • rotate.WithImageSquareSize(val int) 设置主图大小
  • rotate.WithRangeAnglePos(vals []option.RangeVal) 设置校验随机角度范围
  • rotate.WithRangeThumbImageSquareSize(val []int) 设置缩略图大小
  • rotate.WithThumbImageAlpha(val float32) 设置缩略图透明度

设置资源

builder.SetResources(rotate.WithXxx(), ...)

  • rotate.WithBackgrounds([]image.Image) 设置主图图片

验证码数据

  • GetData() *Block 获取当前校验的信息
  • GetMasterImage() imagedata.PNGImageData 获取主图
  • GetThumbImage() imagedata.PNGImageData 获取缩略图

验证码图像

JPEGImageData

  • Get() image.Image 获取原图像
  • ToBytes() ([]byte, error) 转为字节数组
  • ToBytesWithQuality(imageQuality int) ([]byte, error) 指定清晰度转为字节数组
  • ToBase64() (string, error) 转为 Base64 字符串,带 "data:image/jpeg;base64," 前缀
  • ToBase64Data() (string, error) 转为 Base64 字符串
  • ToBase64WithQuality(imageQuality int) (string, error) 指定清晰度转为 Base64 字符串,带 "data:image/jpeg;base64," 前缀
  • ToBase64DataWithQuality(imageQuality int) (string, error) 指定清晰度转为 Base64 字符串
  • SaveToFile(filepath string, quality int) error 保存 JPEG 到文件

PNGImageData

  • Get() image.Image 获取原图像
  • ToBytes() ([]byte, error) 转为字节数组
  • ToBase64() (string, error) 转为 Base64 字符串,带 "data:image/png;base64," 前缀
  • ToBase64Data() (string, error) 转为 Base64 字符串
  • SaveToFile(filepath string) error 保存 到文件

验证模式

  • 文字点选
  • 图形点选
  • 滑动
  • 拖拽
  • 旋转
  • 抛物线
  • 物品辨认
  • ...

扩展&增强

  • 基本验证
  • 行为轨迹验证增强
  • 其他因素增强
  • 多任务生成模式
  • ...

语言支持

  • Golang
  • NodeJs
  • Rust
  • ...

前端安装包

  • JavaScript
  • Vue
  • React
  • Angular
  • Svelte
  • Solid
  • UniApp
  • WX-Applet
  • React Native App
  • Flutter App
  • Android App
  • IOS App
  • ...

👍赞助一下

如果觉得项目有帮助,可以请作者喝杯咖啡 🍹

Buy Me A Coffee Buy Me A Coffee

LICENSE

Go Captcha source code is licensed under the Apache Licence, Version 2.0 http://www.apache.org/licenses/LICENSE-2.0.html

Apache License Copyright (c) 2021 Awen <wengaolng@gmail.com> Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

简介

🖖 Go Captcha 是行为式验证码,支持文本/图形点选、滑动/拖拽、旋转等验证模式,前端提供 JavaScript / Vue / React / Angular / Solid / Svelte / UniApp 等安装包。Github地址 https://github.com/wenlng/go-captcha 展开 收起
README
Apache-2.0
取消

发行版 (5)

全部
3个月前

贡献者

全部

语言

近期动态

不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/wenlng/go-captcha.git
git@gitee.com:wenlng/go-captcha.git
wenlng
go-captcha
go-captcha
master

搜索帮助