CAPTCHA Perl. Генерація за допомогою ImageMagick
Невелика функція генерації капчі для perl за допомогою виклику imagemagick через бібліотеку Image :: Magick.
Може стати в нагоді в тому випадку, коли хостер не дозволяє встановлювати свої модулі для perl (наприклад GD :: SecurityImage або Auchten :: Captcha). Модуль для роботи з ImageMagick не варто за замовчуванням хіба що у самого недбайливого хостера.
Функцію можна використовувати як бібліотечний виклик, виклик передавати ім'я файлу і рядок для генерації капчі.
#! / Usr / bin / perl # Генератор капчі. Ідея і параметри виклику Convert взяті з captcha.ru (http://captcha.ru/captchas/multiswirl/). # Реалізація під бібліотеку Image :: Magick для perl - dimio (www.dimio.org). # 27.09.2009 use Image :: Magick; sub CreateCapImage ($ $) {my ($ cap_string, $ filename) = @ _; my $ font = 'times.ttf'; my $ pointsize = 70; my $ path = ' . / '; my $ image = new Image :: Magick; # 1. Створюємо поле 300x100 білого кольору. $ Image-> Set (size => '300x100 '); $ image-> ReadImage (' xc: white '); # 2. Друкуємо чорним з антиалиасинг $ image-> Set (type => 'TrueColor', antialias => 'True', fill => 'black', # рядок STRING шрифтом $ font розміром $ pointsize font => $ font, pointsize => $ pointsize,); $ image-> Draw (primitive => 'text', points => '20, 70 ', # орієнтація рядки тексту всередині картинки text => $ cap_string, # що друкуємо); # 3. Посунути центр вліво на 100 точок + випадкова флуктуація $ image-> Extent (geometry => '400x120 ', # міняємо розмір картинки); $ image-> Roll (x => 101 + int (rand (4)),); # 4. Перший swirl на випадковий кут (від 37 до 51) $ image-> Swirl (degrees => int (rand (14)) +37,); # 5. Посунути центр вправо на 200 точок, теж з випадковою флуктуацією $ image-> Extent (geometry => '600x140 ', # міняємо розмір картинки); $ image-> Roll (x => 3-int (rand (4)),) ; # 6. Другий поворот (від 20 до 35) $ image-> Swirl (degrees => int (rand (15)) +20,,); # 7. Остаточна обробка і виведення $ image-> Crop ('300x100 +100 +17'); $ image-> Resize ('150x50 '); $ filename = $ path. $ Filename; $ filename. = '. Png'; open (IMAGE, '>', $ filename) or die $!; $ Image-> Write (file => \ * IMAGE, filename => $ filename); close ( IMAGE); return $ filename;} 1;
# Виклик капчі з скрипта my $ num1 = int (rand (11)) + int (rand (3)); my $ num2 = int (rand (8)) + int (rand (4)); my $ sum = $ num1 + $ num2; my $ cap_string = $ num1. '+'. $ num2. '='; my $ cap_digest = md5_hex ($ sum + rand (100) + rand (50)); my $ cap_url = & CreateCapImage ($ cap_string, $ cap_digest); $ Cap_url = ~ s | / home / dimioorg / public_html / dimioorg | |; $ Cap_url = 'http://www.dimio.org'. $ Cap_url; print $ query-> em ("<img src=\"$cap_url\">"), $ Query-> textfield ( -Name => 'cap_value', -Size => 2, -Maxlength => 2, );
В результаті на сторінці буде виведена картинка з символами виду "12 +7 =". Рядок у принципі може бути якою завгодно.
Кому лінь копіпаст - може скачати функцію captcha.pl і три ttf шрифта .
Написано на правах пам'ятки для себе, але раптом кому стане в нагоді ![]()
Ще на схожі теми:
Рубрики: Інтернет , Кодинг |
Мітки: captcha , how-to , imagemagick , perl , програмінг |
10 коментарів 

Щось не працює!
Малюнок - просто білий прямокутник, без тексту, а потім
вивалюється на
print $ query-> em (""),
$ Query-> textfield (
-Name => 'cap_value',
-Size => 2,
-Maxlength => 2,
);
з повідомленням
Can't call method "em" on an undefined value at / home / .......
У прикладі зазначено так:
, А ви передаєте порожню рядок.
Модуль CGI підключений до речі?
Що стосується малюнка - по-перше - шрифт вказаний правильно? По-друге - можна покрутити параметри генерації. У мене виходила нормальна картинка з капчі при зазначених у прикладі параметрах.
Зрозуміло, це движок ріже код ...
Зробив так:
$ Query = new CGI;
print $ query-> em (""),
$ Query-> textfield (
-Name => 'cap_value',
-Size => 10,
-Maxlength => 5,
);
все запрацювало, але картинка порожня
img src = \ "$ cap_url \" border = \ "2 \"
Запустив для перевірки на сервері в себе: - .
Perl v5.8.8
ImageMagick 6.5.9-9 2010-02-25 Q16
Image :: Magick (6.005009)
ось зробив капчу ... все працює.
а як правильно перевіряти її і введення юзера?
Я б обчислював хеш згенерованого слова для капчі і хеш користувальницького введення, а потім порівнював їх. Модуль Digest :: MD5 в допомогу.
ну хеш користувача введення обчислити без проблем ... а ось хеш капчі як?? він же вже забутий, тому що скрипт відпрацювали на виведенні капчі). та й вобще це різні скрипти можуть бути - один виводить капчу, а інший приймає введення ... от і заморочка в мене тут (
Хеш капчі класти в файл чи іншу БД (в файл логічніше і простіше, але якщо вже є БД для движка - чому б не створити там таблицю), відпрацьовані (і при бажанні - протухлі) хеши капч видаляти. Для зручності можна капча ідентифікатори привласнювати якісь.