Как сделать свою капчу в PHP

Как сделать свою капчу в PHP

А как сделать капчу своими руками?
Вот и я не знаю…

Инструкция

Уровень сложности: Несложно

Что вам понадобится:

  • Место, где вам понадобится увиденное.

1 шаг

Сначала определимся, что пользователь должен будет вводить при проверке на бота (цифры, символы, математические действия).
В нашем случае пусть это будут цифры.

2 шаг

Эти цифры мы будем получать функцией rand.
Вот простой пример:
for ($k = 1; $k<=5 ; $k++)
{
$text.= rand(1, 9);
}
Этот цикл создаёт переменную $text и присваивает ей значение из 5 цифр(от 1 до 9). Количество цифр вы можете выбрать своё, изменив конченое значение $k в условии цикла for.

3 шаг

Теперь займёмся графикой.
$img = imagecreatetruecolor(110, 30); //Создаём изображение шириной 110 px, высотой 30px.
$white = imagecolorallocate($img, 255, 255, 255); // Присваиваем переменной $white белый цвет
$red = imagecolorallocate($img, 255, 0, 0);// Присваиваем переменной $red красный цвет
$black = imagecolorallocate($img, 0, 0, 0);// Присваиваем переменной $black чёрный цвет
imagesetthickness($img, 2); // Устанавливаем ширину линий
imagefill($img, 0, 0, $white); //Заливаем изображение белым цветом

4 шаг

Теперь переходим к процессу рисования цифр.
Но для начала уменьшим читабельность капчи проведя пару линий на картинке

imageline($img, 20, 0, 80, 13, $black); //Линия чёрного цвета
imageellipse ($img, 0, 0, 70, 40, $black); //Эллипс чёрного цвета

Рисуем цифры:
Т.к кол-во цифр на рисунке будет 5 то запускаем цикл со счётчиком.

for ($i = 1; $i<=5; $i++)
{
$r = $i*15; //Нужно, чтобы соблюдалась ширина между цифрами и они не лепились друг на друга.
if ($i % 2 == 0) // Условие, для выбора высоты цифры.
{
$sok=1.3;// Если $i делиться на 2 без остатка, то высота цифры увеличивается в 1.3 раза.
}
else
{
$sok= 1.5; // Иначе высота увеличивается в 1.5 раза.
}
if ($text{$i-1} == “1”)//Если цифра равна 1, то рисуем её
{
imageline($img, 7+$r, 5*$sok, 7+$r, 15*$sok, $black);
imageline($img, 7+$r, 5*$sok, 5+$r, 9*$sok, $black);
}
if ($text{$i-1} == “2”) {//Цифра 2
imageline($img, 5+$r, 6*$sok, 7+$r, 3*$sok, $green);
imageline($img, 7+$r, 3*$sok, 10+$r, 6*$sok, $green);
imageline($img, 10+$r, 6*$sok, 6+$r, 14*$sok, $green);
imageline($img, 6+$r, 14*$sok, 10+$r, 14*$sok, $green);
}
if ($text{$i-1} == “3”) {//Цифра 3
imageline($img, 5+$r, 5*$sok, 10+$r, 5*$sok, $green);
imageline($img, 10+$r, 5*$sok, 10+$r, 10*$sok, $green);
imageline($img, 10+$r, 10*$sok, 5+$r, 10*$sok, $green);
imageline($img, 10+$r, 10*$sok, 10+$r, 15*$sok, $green);
imageline($img, 10+$r, 15*$sok, 5+$r, 15*$sok, $green);
}
if ($text{$i-1} == “4”) {//Цифра 4
imageline($img, 5+$r, 4*$sok, 5+$r, 10*$sok, $green);
imageline($img, 5+$r, 10*$sok, 10+$r, 10*$sok, $green);
imageline($img, 10+$r, 10*$sok, 10+$r, 4*$sok, $green);
imageline($img, 10+$r, 10*$sok, 10+$r, 15*$sok, $green);
}
if ($text{$i-1} == “5”) {//Цифра 5
imageline($img, 5+$r, 4*$sok, 11+$r, 4*$sok, $green);
imageline($img, 5+$r, 4*$sok, 5+$r, 10*$sok, $green);
imageline($img, 5+$r, 10*$sok, 11+$r, 10*$sok, $green);
imageline($img, 11+$r, 11*$sok, 11+$r, 15*$sok, $green);
imageline($img, 11+$r, 15*$sok, 5+$r, 15*$sok, $green);
}
if ($text{$i-1} == “6”) {//Цифра 6
imageline($img, 10+$r, 4*$sok, 5+$r, 4*$sok, $green);
imageline($img, 5+$r, 4*$sok, 5+$r, 15*$sok, $green);
imageline($img, 5+$r, 15*$sok, 10+$r, 15*$sok, $green);
imageline($img, 10+$r, 15*$sok, 10+$r, 10*$sok, $green);
imageline($img, 10+$r, 10*$sok, 5+$r, 10*$sok, $green);
}
if ($text{$i-1} == “7”) {//Цифра 7
imageline($img, 5+$r, 5*$sok, 11+$r, 5*$sok, $green);
imageline($img, 11+$r, 5*$sok, 7+$r, 15*$sok, $green);
}
if ($text{$i-1} == “8”) {//Цифра 8
imageline($img, 5+$r, 5*$sok, 10+$r, 5*$sok, $green);
imageline($img, 5+$r, 5*$sok, 5+$r, 10*$sok, $green);
imageline($img, 5+$r, 10*$sok, 10+$r, 10*$sok, $green);
imageline($img, 10+$r,10*$sok, 10+$r, 5*$sok, $green);
imageline($img, 5+$r, 10*$sok, 5+$r, 15*$sok, $green);
imageline($img, 10+$r,10*$sok, 10+$r, 15*$sok, $green);
imageline($img, 5+$r, 15*$sok, 10+$r, 15*$sok, $green);
}
if ($text{$i-1} == “9”) {//Цифра 9
imageline($img, 5+$r, 5*$sok, 10+$r, 5*$sok, $green);
imageline($img, 5+$r, 5*$sok, 5+$r, 10*$sok, $green);
imageline($img, 5+$r, 10*$sok, 10+$r, 10*$sok, $green);
imageline($img, 10+$r, 10*$sok, 10+$r, 5*$sok, $green);
imageline($img, 10+$r, 10*$sok, 10+$r, 15*$sok, $green);
imageline($img, 10+$r, 15*$sok, 5+$r, 15*$sok, $green);
}
}
header(“Cache-control: private”);
header(“Content-type: image/png”);
imagepng($img);//Выводим изображение
imagedestroy($img);//Освобождаем память

5 шаг

И так если вы запустите ваш php файл с этим кодом, то вы увидите изображение.
Как теперь вложить это изображение, на страницу регистрации вашего сайта?
Очень просто:
<img src="captha.php"/> //captha.php – ваш файл с созданием картинки
Вот пример капчи:
http://your-dreams.ru/reg.php
Вот получившийся код:
http://your-dreams.ru/kode.txt

Обсуждение

Avatar_micro
Рейтинг
  1. +
  2. 2
kovalsky (02:45 19.03.2011)

я совершенно ничего не понял,начиная с заголовка.

687_micro
Рейтинг
  1. +
  2. 2
woopyq (06:43 19.03.2011)

Потому что Вам – это не надо.

Avatar_micro
Рейтинг
  1. +
  2. 1
del12345677777 (06:46 19.03.2011)

Нда…. Как много лишнего кода… Например, куда проще смотрится <?php $text=rand(11111, 99999); ?>, либо вообще генерировать обычный массив вместо string и прогонять его не for’ом, а foreach…. И т.п.
Единственное, чего не увидел в коде – традиционного для капчи сохранения md5-суммы нарисованной строки в куки. Какой понт от картинки, если мы не помним, что на ней написали? )

Но с прорисовки цифр долго смеялся – извращенцы не вымерли…) Интересно, если будешь делать капчу из большего набора символов, тоже будешь каждый рисовать? )

687_micro
Рейтинг
  1. +
  2. 1
woopyq (09:15 19.03.2011)

Мой папа – индус.
Сначала хотел символьную сделать, но папа сказал, что imagettftext не в моде. Поэтом пришлось рисовать :D

Avatar_micro
Рейтинг
  1. +
  2. 1
kovalsky (13:36 19.03.2011)

поставлю плюс за старания…так как по-моему это очень трудно сделать…:)

511_micro
Рейтинг
  1. +
  2. 1
Роман Давыдов (22:12 19.03.2011)

Нда…. Как много лишнего кода… Например, куда проще смотрится <?php $text=rand(11111, 99999); ?>, либо вообще генерировать обычный массив вместо string и прогонять его не for’ом, а foreach…. И т.п.
Единственное, чего не увидел в коде – традиционного для капчи сохранения md5-суммы нарисованной строки в куки. Какой понт от картинки, если мы не помним, что на ней написали? )

Но с прорисовки цифр долго смеялся – извращенцы не вымерли…) Интересно, если будешь делать капчу из большего набора символов, тоже будешь каждый рисовать? )

Ну конешо, пиашпи удобнее ! Недаром его создали, dtml можно же было занести картинку в бд и присвоить ей значение… а потом проверять условие на if или else…
Но всёравно +

138_micro
Рейтинг
  1. +
  2. 1
Roben (02:41 20.03.2011)

Да можно было и покороче. Но автор старался за это ему +. Вот думаю все таки пчп тяжелый язык что для одной капчи нужно столько написать.

028_micro
Рейтинг
  1. +
  2. 2
SeasonedMan (15:51 20.03.2011)

Инструкция автора вызывает уважение. Занесу её в закладки. Лично для меня инструкция полезна и из неё многое подчерпнул. CAPTCHA зачастую вызывает негативные эмоции, особенно, когда предлагаемые символы позволяют толковать их в 3-4-х вариациях.
Как-то читал, что определенными ботами капча проходится без проблем. Весь вопрос упирается в число попыток, которые затрачивает на это бот. Так что, владельцы сайтов, старайтесь не тратить свое время на эту как оказалось зряшную работу.

066_micro
Рейтинг
  1. +
  2. 1
white_bars (16:52 22.03.2011)

инструкция хорошая,но немного всё запутано

441_micro
Рейтинг
  1. +
  2. 1
bochkovoi-daniil (11:49 23.03.2011)

а проще можно?

687_micro
Рейтинг
  1. +
  2. 0
woopyq (17:14 23.03.2011)

Взять готовое решение.

Avatar_micro
Рейтинг
  1. +
  2. 0
Acidburn (00:01 01.04.2011)

А смысл тогда делать капччу, если там GET’ом передается код?
http://your-dreams.ru/captha.php?a=99999
Зайдите, посмотрите, какой там код =)

717_micro
Рейтинг
  1. +
  2. 1
Vir (10:32 08.04.2011)


мой вариант мне больше нравится.
минусы вашего:
1. убираем все чёрные пикселы, получаем красно-белую картинку, которую прочитать автоматом будет несложно. такая защита от спама – не вариант.
2. цифры находятся на одних и тех же местах. всегда. пример:
http://your-dreams.ru/captha.php?a=12345
http://your-dreams.ru/captha.php?a=12346
5 и 6 – должны быть на разных позициях. так же, как и единички на первой и второй картинке, и т.д.
3. трёхцветная капча выглядит немного уныло, могли бы хотя бы сделать разные цвета для разных символов.
4. может, после второго и третьего пункта зря пишу этот, и так уже понятно. нужно больше РЭНДОМа, больше случайностей, искажения какие-нибудь вносить и т.д.

почитайте

только, пожалуйста, без обид

687_micro
Рейтинг
  1. +
  2. 0
woopyq (11:12 03.05.2011)

Acidburn, в md5 зашифровать и всё.

793_micro
Рейтинг
  1. +
  2. 1
koZZ (21:21 04.05.2011)

+

Ваш комментарий

Запросить инструкцию

Не нашли нужную пошаговую инструкцию?
Возможно, что кто-то из посетителей сайта сможет помочь. Оставьте запрос прямо сейчас, если Вы уверены, что эта тема ещё не освещена на нашем проекте!

Рейтинг
  1. +
  2. 9
15
2777