@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" для получения капчи.