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