Ярлыки

.htaccess (4) тестирование (8) шаблоны проектирования (3) css (5) Debian (6) docker (2) Doctrine2 (6) Git (6) html (4) java (6) javascript (13) jquery (11) LFS (3) linux (23) mac os (4) mod_rewrite (2) MSSQL (4) MySQL (18) ORM Doctrine (17) patterns (3) PDO (3) perl (7) PHP (64) PHPUnit (8) Python (15) SEO (2) Silex (1) SimpleXML (1) SQL (14) ssh (4) Ubuntu (24) Yii1 (1) Zend Framework (19) ZendFramework2 (8)

пятница, 9 сентября 2011 г.

Автоматизируем распознавание капчи своими руками при помощи PHP .

Сразу оговорюсь, цель была довольна невинна, заходить под своим аккаунтом на один известный сервис, который периодически просит ввести капчу для процедуры авторизации. Описанный ниже способ подходит для распознавания очень простых картинок, без особых искажений. В моем случае он оказался достаточно эффективным. Для реализации мне понадобилась система оптического распознавания символов (OCR) для Linux.

Попробовав пару, в том числе gocr я был крайне недоволен результатом.
В итоге я остановился на tesseract

Нам будут нужны следующие утилиты:

  • convert из пакета imagemagick (преобразование форматов графических файлов)
  • djpeg - восстановление файла jpeg в bmp
  • tesseract - open source ocr от google (лучшая на данный момент из бесплатных

// recognize.sh
#!/bin/sh 

TMP=`dirname $0`/tmp

convert $1 $TMP/tmp.jpg
djpeg -greyscale -bmp $TMP/tmp.jpg > $TMP/tmp.bmp
tesseract $TMP/tmp.bmp $TMP/output -l eng
cat $TMP/output.txt && rm $TMP/tmp.bmp $TMP/tmp.jpg $TMP/output.txt

Tут конвертируем файл, имя которого передается в скрипт в качестве первого параметра, в jpeg (у меня капча была в gif), затем преобразуем в черно-белый bmp и распознаем при помощи tesseract. В финале, чистим каталог от временных файлов


class Tesseract {

    /**
     *
     * @var string
     */
    protected $scriptPath;

    /**
     *
     * @var string $path Path to shell-script
     */
    function __construct($path) {

        $this->scriptPath = $path;
    }

    /**
     *
     * Recognize CAPTCHA
     *
     * @var string $imageFile Path to image file
     * @return string|null Recognized captcha or null
     */
    function recognize($imageFile) {

        if(! is_readable($imageFile)) {

            throw new Exception ('Image file isn\'t readable.');
        }

        $output = shell_exec(sprintf('sh %s %s', $this->scriptPath, $imageFile));
        
        return preg_match('/\d{4}/', $output, $m) ? $m[0] : null; 
    }
}

$tesseract = new Tesseract('/path/to/shell/script');
$captcha = $tesseract->recognize('/path/to/image/file');

Комментариев нет:

Отправить комментарий