Slide/Drag-Drop CAPTCHA requires users to move a puzzle piece to the correct position in a main image. It supports two modes:
- Basic Mode: The puzzle piece slides along a fixed Y-axis. Use
builder.Make() to create this. - Drag-Drop Mode: The puzzle piece can move freely within a larger area. Use
builder.MakeDragDrop() to create this.
Workflow
- Generate Master Image (
masterImage): Contains the gap and shadow effects (usually JPEG). - Generate Tile Image (
tileImage): The piece the user slides (usually PNG). - User Interaction: The frontend captures the final coordinates (
TileX, TileY). - Verification: The backend compares the user's position with the target position.
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()
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)
}
func loadPng(p string) (image.Image, error) {
imgBytes, err := ioutil.ReadFile(p)
if err != nil {
return nil, err
}
return codec.DecodeByteToPng(imgBytes)
}