Как сделать каптчу на golang?

Пользователь

от kiel , в категории: Общие вопросы , год назад

Как сделать каптчу на golang?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp Pocket

2 ответа

Пользователь

от brandyn , год назад

@kiel 

Пользователь

от terrance , год назад

@kiel 

Вот пример реализации простой капчи на Go:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package main

import (
	"fmt"
	"image"
	"image/color"
	"image/draw"
	"image/png"
	"log"
	"math/rand"
	"net/http"
	"strconv"
	"time"
)

func main() {
	http.HandleFunc("/captcha", captchaHandler)
	log.Fatal(http.ListenAndServe(":8080", nil))
}

func captchaHandler(w http.ResponseWriter, r *http.Request) {
	// Генерируем случайное число
	rand.Seed(time.Now().UnixNano())
	num1 := rand.Intn(10)
	num2 := rand.Intn(10)

	// Конвертируем числа в строку
	captcha := strconv.Itoa(num1) + " + " + strconv.Itoa(num2) + " = "

	// Создаем изображение для капчи
	img := image.NewRGBA(image.Rect(0, 0, 200, 80))
	draw.Draw(img, img.Bounds(), &image.Uniform{color.White}, image.ZP, draw.Src)

	// Рисуем текст капчи
	captchaOffsetX := 20
	captchaOffsetY := 40
	draw.Draw(img, image.Rect(captchaOffsetX, captchaOffsetY-20, captchaOffsetX+120, captchaOffsetY), &image.Uniform{color.RGBA{0, 0, 0, 255}}, image.ZP, draw.Src)
	draw.Draw(img, image.Rect(captchaOffsetX+120, captchaOffsetY-20, captchaOffsetX+121, captchaOffsetY), &image.Uniform{color.RGBA{255, 0, 0, 255}}, image.ZP, draw.Src)
	draw.Draw(img, image.Rect(captchaOffsetX+130, captchaOffsetY-20, captchaOffsetX+210, captchaOffsetY), &image.Uniform{color.RGBA{0, 0, 0, 255}}, image.ZP, draw.Src)
	draw.Draw(img, image.Rect(captchaOffsetX, captchaOffsetY, captchaOffsetX+210, captchaOffsetY+60), &image.Uniform{color.White}, image.ZP, draw.Src)
	draw.Draw(img, image.Rect(captchaOffsetX, captchaOffsetY+60, captchaOffsetX+210, captchaOffsetY+61), &image.Uniform{color.RGBA{0, 0, 0, 255}}, image.ZP, draw.Src)
	draw.Draw(img, image.Rect(captchaOffsetX+45, captchaOffsetY, captchaOffsetX+46, captchaOffsetY+60), &image.Uniform{color.RGBA{0, 0, 0, 255}}, image.ZP, draw.Src)
	draw.Draw(img, image.Rect(captchaOffsetX+65, captchaOffsetY, captchaOffsetX+66, captchaOffsetY+60), &image.Uniform{color.RGBA{0, 0, 0, 255}}, image.ZP, draw.Src)
	draw.Draw(img, image.Rect(captchaOffsetX+85, captchaOffsetY, captchaOffsetX+86, captchaOffsetY+60), &image.Uniform{color.RGBA{0, 0, 0, 255}}, image.ZP, draw.Src)
	draw.Draw(img, image.Rect(captchaOffsetX+105, captchaOffsetY, captchaOffsetX+106, captchaOffsetY+60), &image.Uniform{color.RGBA{0, 0, 0, 255}}, image.ZP, draw.Src)
	draw.Draw(img, image.Rect(captchaOffsetX+125, captchaOffsetY, captchaOffsetX+126, captchaOffsetY+60), &image.Uniform{color.RGBA{0, 0, 0, 255}}, image.ZP, draw.Src)

	// Отправляем изображение капчи
	w.Header().Set("Content-Type", "image/png")
	png.Encode(w, img)

	// Выводим капчу в консоли (для проверки)
	fmt.Println(captcha)
}


В этом примере создается простое изображение на основе случайно сгенерированных чисел, а затем отображается на веб-странице в формате PNG. Вывод капчи также происходит в консоли для проверки.


Для запуска сервера и отображения капчи нужно выполнить:

1
go run main.go


После этого можно открыть браузер и перейти по адресу "http://localhost:8080/captcha" для получения капчи.