
После прочтения предыдуших топиков про капчу, мне пришла идея сделать ребус капчу. Конечно, использовать её в реальных проектах не очень правильно, так как пользователь будет тратить время на решение ребуса, а вы наверное знаете, как иногда раздражает даже обычные буквы с капчи ввести.
Ребус
Ребус включает в себя всего лишь одну методику, когда часть слова представлена в виде изображения с опреденным количеством обрезаных букв в начале или в конце. Для того, что бы одно изображение имело несколько варинтов, используется следующая структура файловой системы:
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();
Предыдущие топики про капчу:
- Кана-капча на PHP — это просто!
- Матановая капча на PHP — это просто!
- Разработка CAPTCHA своими руками
Для написания топика использовал: Редактор таблиц данных из ASCII-графики
Исходник можно скачать тут.
Пример можно посмотреть тут.
