Pull to refresh

Ребус captcha

Reading time 4 min
Views 3.5K

После прочтения предыдуших топиков про капчу, мне пришла идея сделать ребус капчу. Конечно, использовать её в реальных проектах не очень правильно, так как пользователь будет тратить время на решение ребуса, а вы наверное знаете, как иногда раздражает даже обычные буквы с капчи ввести.


Ребус


Ребус включает в себя всего лишь одну методику, когда часть слова представлена в виде изображения с опреденным количеством обрезаных букв в начале или в конце. Для того, что бы одно изображение имело несколько варинтов, используется следующая структура файловой системы:
 images/
        |                    
        +--+[image_name]/+
        |                +-+[image_type_1]   
        |                |
        |                +-+[image_type_2]   
        |                |
        |                +-+...
        |                |
        |                +-+[image_type_n]   
        |
        |
        |
        |   
        +--+[image_name]/+
                         +-+[image_type_1]
                         |
                         +-+[image_type_2]
                         |
                         +-+...
                         |
                         +-+[image_type_n]

Например при составлении ребуса из слова «stream», программа нашла совпадение букв (частей слова) с изображением «heart», то используемое изображение будет выбрано случайным образом из папки "/images/heart/".

Поиск совпадений


Поиск совпадений работает следующим образом: перебор частей загаданного слово, и поиск на совпдение со словами, которые представлены изображениями. Загаданное слово, например habrahabr, делиться на части следующим образом:
habrahabr
habrahab
abrahabr
habraha
abrahab
brahabr
habrah
abraha
brahab
rahabr
habra
abrah
braha
rahab
ahabr
habr
abra
brah
raha
ahab
habr
hab
abr
bra
rah
aha
hab
abr
ha

Поиск происходит до первого совпадения, после чего выделяются левая и правая часть слова от совпавшей, для которых так же применяется поиск.

Использование


$rebus = new rebus('path/to/image/folder');

Передаваемый параметр — путь к папке с изображениями, структура которой должна быть как описывалось выше.
Настройки:
  • captchaWordsArray — массив слов, для составления ребуса
  • backgroundColor — Array(r,g,b). По умолчанию — черный
  • textColor — Array(r,g,b). По умолчанию — черный
  • fontSize — размер шрифта. По умолчанию — 60px
  • width — ширина ребуса. По умолчанию — 300px
  • padding — внутренний отступ. По умолчанию — 10px
  • font — используемый шрифт
  • imagesHeight — высота копируемого изображения в ребус
  • imagesWidth — ширина копируемого изображения в ребус
  • cache — кеширование. По умолчанию — false
  • rebusCacheFolder — папка для хранения кеша.


Генерация изображения:

$rebus->getImage($flag);

  • $flag — усли установлен — то происходит вывод изобрежения. Если нет — функция возвращает GD ресурс. По умолчанию — true;


Полный код:

<?php 

session_start();

include 'rebus.class.php';

$rebus = new rebus('images');

$rebus->captchaWordsArray = Array(
	'tar',
	'swap',
	'sic',
	'threat',
	'bow',
	'stream',
	'steam',
	'google',
	'comet',
	'comet',
	'hot',
	'wool',
	'hell',
	'twitter',
	'chat',
	'habrahabr',
	'warlock',
	'fold',
	'soft',
	'ripper',
	'apple'
	);


$rebus->getImage();


Предыдущие топики про капчу:

Для написания топика использовал: Редактор таблиц данных из ASCII-графики

Исходник можно скачать тут.
Пример можно посмотреть тут.
Tags:
Hubs:
+34
Comments 122
Comments Comments 122

Articles