![]() |
Распознавание каптчи (PHP + GD)
INTRO Здравствуйте! Здесь я постараюсь рассказать о том, как с помощью PHP и GD распознавать обычные каптчи на примере 000webhost.com (http://www.000webhost.com/includes/php_captcha.php). Сразу хочу сказать, что на основе этого способа можно распознавать только простые каптчи. Долго я искал статьи, подобные этой, но не нашёл. И мне в голову пришла идея, которую мне получилось успешно реализовать. Именно ею я и хочу поделиться с вами! Термины Итак, для начала хочу объяснить некоторые термины (© WikiPedia):
Распознавание Для начала надо создать изображение. Для этого воспользуемся функцией imagecreatefrompng, которая создает изображение из указанного файла. Синтаксис: PHP код:
PHP код:
Далее создадим новое изображение с шириной 7px, высотой 10px. Каждый символ каптчи имеет именно такие размеры. PHP код:
PHP код:
PHP код:
X: 9 * $i Y: 13 с шириной 7 и высотой 10. Эта часть и будет скопирована в $im. Наверное непонятно, почему X = 9 * $i, Y - 13. $i - переменная, которая при каждом выполнении цикла увеличивается на единицу. Возьмем первое повторение, когда $i - равно нулю. Таким образом X = 0, Y = 13. Если открыть изображение любым из редакторов, то можно увидеть, что именно эти координаты и будут началом первого символа. При втором выполнении, в $im скопируется второй символ, т.к. X = 9, Y = 13, и т.д... Это изображение - $im выглядит так: Теперь создаем еще один цикл, в теле которого по очереди будет перебирать каждый пиксель первого столбца, и засовывать в массив 1 или 0, в зависимости от того, закрашен этот пиксель, или нет... Воспользуемся функцией imagecolorat, которая возвращает индекс цвета пикселя. PHP код:
PHP код:
Код:
ArrayКод:
1111111Код:
1111111Код:
0 0111110Код:
0 0000011PHP код:
PHP код:
В первом цикле перебираются все массивы номеров. Дальше в цикле идет цикл, в котором - если массив $gd с индексом $key равно $value, то переменная $k увеличивается на еденицу. Тобишь если все пары индекс => цвет верны, то $k будет равно текущему числу а если это так, то оно дописывается в переменную $cp. После всего этого остается вывести переменную с каптчей: PHP код:
PHP код:
Постскриптум Это моя первая статья по PHP, так что прошу не судить строго :) Оценивайте, отписывайтесь, критикуйте, спрашивайте ;) Копипаст разрешен только с согласия автора, тоесть меня! Стучите в асю 674542 с просьбой об копировании на свой форум. |
С тех пор, как появились “сервисы” anti-captcha.com и ей подобные я думал, что все забросят это дело и начнут повсеместно использовать быдлотруд ишачащих там школьников ( что в принципе и случилось ). Не может не радовать тот факт, что есть люди, которые продолжают работать в направлении автоматического распознавания капчи. mailbrush, большой плюс.
Цитата:
То, что нашел сходу http://forum.antichat.net/showthread.php?p=1131976 Так же рекомендую ознакомиться с этим https://docs.google.com/fileview?id=0B-xpafMYi--7M2U4OGY3MWEtYzNjYi00OTkyLTg0ZDYtZjQzZTVkMmJhYWEz& hl=ru Эх было б здорово чтобы какой-нибудь кодер реализовал приведенные там методы и алгоритмы =) |
Цитата:
Цитата:
|
Очень даже прикольно, зачетная статья, риспект. Осталось добавить только немного AI для распознавания чуть других капч, не таких именно. Но все равно классно
|
https://forum.antichat.ru/threadnav62896-1-10.html
ыот тоже про капчи. имхо беспонтовая статья. именно из за простоты. надоели однообразные. в тысячу раз интереснее почитать как на php распознать капчу e-gold'a или еще какие сложные..а тут ниче интересного |
Что бы распознать сложную каптчу,даже без мусора,просто с помехами, нужно очень много ресурсов и времени.
Пока что я смог собрать небольшую базу символов,только в 18к символов,то есть - обучил своего дешифровщика распознавать 18к сиволов в такой каптче.Пока что результат неплохой,в среднем 3 варианта на 1 каптчу,где1 в всегда верный.Но мучений конечно слишком много,непонятно как делить на символы,приходиться тпо руками обучать :) Простой перевод картинки в байтовое представление. Вот тута Пока что на основе этого,могу распознать каптчу от дле как я говорил,с 33% удачи.Давно этим не занимался =) То есть, я смог полностью очистить каптчу от ненужных мне вещей,и оставить только буквы.Можно обучить построчно искать буквы,можно по рядам. |
Цитата:
|
+еще 5 копеек от себя,так как, какое то время пытался распознать искаженные каптчи(только в одну сторону).
Есть алгоритм,в приведенной выше ссылки на пдф он есть,так вот он работат по методу слоев.В докладе выше есть подробное описание.Слой сниметься за слоем.Так вот, php предоставляет простое средство для такое реализации.это фильтры,достаточно перевести изображение в черно-белый режим,далее применить фильтр "яркость",и далее эксперементировать с четкостью.Я подобрал оптимальный параметр для своей каптчи -150.В таком режиме,буквы максимально тонкие,если гнуть и дальше,можно добиться тонкости букв в 1px, что очень существенно упрощает декрипт "байтов" => symbols => Каптча. После того как мы получили максимально тонкие буквы с помощью фильтров,было бы хорошо заюзать алгоритм "углы",я хз как его назвать.В докладе выше он тоже есть.По принципу "углов" убираеться что,что не соответствует приведенным там шаблонам,читайте там,тут описывать долго.В идеале,если буквы искажены не очень сильно - получаем почти чистые быквы.конечно у них не будет хватать некоторых углов,искаженны,их отрежет фильт,но то только упрощает задачу.Далее,все отрезанные углы(они запоминаються в виде 2-х мерных матриц),заполняються линиями,прямыми,от X-px до Y-px, после этого у нас готовые буквы,прямые и ровные,но всегда разного размера. |
http://www.captcha.ru/captcha/
Вот такая не очень сложная в плане помех каптча.Что бы получить максимаьно тонкие символы, в 0-1 представлении,как у mailbrush, можно использовать такой скрипт.Эффекты подбирались руками,и последний эффект(колоризация),нужна для того,что бы плохо прорисованные пиксели темного цвета,после "черно-белого" фильтра,стали другого цвета,таким образом мы еще утоньшаем наши буквы.А вот и скрипт "за 5 минут на каленке", поставил на хост его,заменив старый,тут буквы чотче :) PHP код:
|
Цитата:
|
| Время: 00:33 |