Click

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 шрифта .

Написано на правах пам'ятки для себе, але раптом кому стане в нагоді :)

Ще на схожі теми:

Category Рубрики: Інтернет , Кодинг | Tag Мітки: , , , , | Comments 10 коментарів

Comments

10 коментарів to "CAPTCHA Perl. Генерація за допомогою ImageMagick "

  1. mike пише:

    Щось не працює!
    Малюнок - просто білий прямокутник, без тексту, а потім
    вивалюється на
    print $ query-> em (""),
    $ Query-> textfield (
    -Name => 'cap_value',
    -Size => 2,
    -Maxlength => 2,
    );

    з повідомленням
    Can't call method "em" on an undefined value at / home / .......

    • dimio пише:

      У прикладі зазначено так:

      print $ query-> em (" "),

      , А ви передаєте порожню рядок.
      Модуль CGI підключений до речі?

      Що стосується малюнка - по-перше - шрифт вказаний правильно? По-друге - можна покрутити параметри генерації. У мене виходила нормальна картинка з капчі при зазначених у прикладі параметрах.

    • dimio пише:

      Зрозуміло, це движок ріже код ...

  2. mike пише:

    Зробив так:
    $ Query = new CGI;
    print $ query-> em (""),
    $ Query-> textfield (
    -Name => 'cap_value',
    -Size => 10,
    -Maxlength => 5,
    );
    все запрацювало, але картинка порожня : (

  3. bash пише:

    ось зробив капчу ... все працює.
    а як правильно перевіряти її і введення юзера?

    • dimio пише:

      Я б обчислював хеш згенерованого слова для капчі і хеш користувальницького введення, а потім порівнював їх. Модуль Digest :: MD5 в допомогу.

  4. bash пише:

    ну хеш користувача введення обчислити без проблем ... а ось хеш капчі як?? він же вже забутий, тому що скрипт відпрацювали на виведенні капчі). та й вобще це різні скрипти можуть бути - один виводить капчу, а інший приймає введення ... от і заморочка в мене тут (

    • dimio пише:

      Хеш капчі класти в файл чи іншу БД (в файл логічніше і простіше, але якщо вже є БД для движка - чому б не створити там таблицю), відпрацьовані (і при бажанні - протухлі) хеши капч видаляти. Для зручності можна капча ідентифікатори привласнювати якісь.

Leave a Reply