Comments 144
Ничего этим не сказано. Можно было написать на С, реализация отличалась бы только на уровне функций для работы с графикой. Автору пришлось бы скачать какой-нибудь libgif и в нем разбиратся. А зачем спрашивается?
Принципиально не использовать язык Х — просто глупо. Хороший программист должен уметь правильно выбрать инструмент.
вы сами ниже написали, что капча простая и пост овощной. хороший программист в этом посте только в вашем комментарии, да и правильных инструментов навалом. а куча программистов на похапе говорит лишь о том, что люди не хотят развиваться
Ваше пренебрежение языком программирование, показывает, что вы как программист ничтожны — вы просто кодер.
Для настоящему программиста нет особой разницы на чем писать — на php, бейсике, c/c++, python, ruby или каком-либо еще языке программирования. Он везде напишет хороший код.
В данном случае автор руководствовался принципом, где быстрее и проще реализовать алгоритм. Да, можно было данный алгоритм реализовать на c++, потратив на это в N раз больше времени — но разве оно стоило того?
> Он везде напишет хороший код
Какие красивые слова. А Вы сами-то на многих языках писали идеальный код? Так легко переключаетесь? В любой момент если надо на любом языке из списка «php, бейсике, c/c++, python, ruby» сбацаете любую задачу?

Я не защищаю теорию о том что php плох в этой задаче, это-то как раз не соответствует действительности, я ставлю под сомнение утверждение что «для настоящего программиста нет особой разницы на чем писать» — такое может сказать только человек, который никогда не работал в действительно крупных проектах. Всегда есть языки, которые знаешь лучше, и разработка на них выйдет быстрее и качественнее, чем «на любом». Ещё и про «ничтожность» других судите по своим бредовым убеждениям.
я считаю, что хороший программист в состоянии выбрать какой язык («инструмент») ему найболее лучше подойдет для решения конкретной задачи. ведь для тривиальной задачи совершенно не нужно подключать навороченный фреймворк, не так ли?
Ну это так.
Но прагматик также подумает, сколько времени займёт у него эта разработка. И если использование фреймворка существенно сократит время разработки, то почему бы и нет? Тут уже надо смотреть, какая задача стоит — достаточно или 10 капч в секунду, или надо миллионы обрабатывать.
Я что-то говорил про время?
Я говорил про составление алгоритма, его реализацию и оформление реализации.
Эту схему можно хоть блоксхемами сделать, а спроектировать на конкретный язык программирования — не очень сложная задача.

Как пример, немного утрированный, но можно увелить сложность:
умножение на 5 можно сделать двумя способами
1) a = b*5
2) a = b+b+b+b+b
Какой бы язык программирования не был — хороший программист выберет первый вариант.
В «Ассемблере, не знающем команд умноженья» — только второй :)

Или если критична скорость, а умножение для используемого процессора слишком тяжелая операция по сравнению со сложением — тоже второй.

Или же a=(b<<2)+b если оптимизировать и переменные у нас целые положительные числа.
Ага, если говорить об оптимизации, то я бы тоже сдвинул на 2 бита влево, и потом еще раз прибавил :)
Хотя, это пережитки эпохи 8086. Сейчас процессор сам в состоянии (на уровне микрокода) понять, как ему эффективнее сделать ту или иную операцию. Это вам не 86-й, где команда MUL/IMUL могла занимать больше сотни тактов.
dfi ваш запрещает вам проповедовать на чем писать ибо вы изначально не можете обладать объективностью
Про пост ничего не было. А простая или сложная капча вроде не от языка зависит.
Куча программистов на похапе говорит лишь о том, что у похапе низкий порог вхождения, поэтому среди похапистов высокая концентрация быдлокодеров. Но если конкретный человек знает пыхпых, то это еще ни о чем не говорит.
Вот если бы вы нейросеть написали, которая обучена такие капчи распознавать, то это было бы действительно круто.
А сами вы способны такое написать? Или, как всегда, критикуете всё, а сами даже такого написать не можете.
вобще-то, это была цитата из этого комментария(http://1div.habrahabr.ru/blog/63854/#comment_1774343), и ответ был вроде как не вам, но можете позащищать детей, если это так доставляет. и таки да, я могу, но мериться длинной клавиатуры у меня нет желания
Нечайно отправил. Так вот, там где вы почерпнули этот сленг как раз тонны детей, с которыми можно спорить.
Отсюда вывод: у вас «пиписька» маленькая и вы пытаетесь компенсировать недостаток длины здесь.

Вообще: мужик сказал — мужик сделал. Может лучше, докажите, если нет — тихо курите в сторонке.
ну вы посмотрите на него, словно «Борис хрен попадешь» (с) Snatch
автору +1 за статью, я до сих пор борюсь с одной каптчой, но пока не победил :(

достали с «доставляет»!
Можно посмотреть Вашу нейронную сеть? Я правильно понял, Вы её написали на каком-то другом языке?

ps: «похапе»? это наречие какое-то? ;)
а длинну клавиатуры не сказать? я уже выше ответил. похоже, тут больше писать умеют, нежели читать… и да, в камментах не работают теги
Если я правильно помню курс по нейронным сетям, распознать и классифицировать входные образы, в том числе цифры, как в примере из поста, может двуслойная нейросеть, состоящая из слоя Кохонена и слоя Гроссберга. Кстати, ничего особо сложного.
Если вы это расценили как «пост — говно, работа — тоже», то это ваши проблемы. Я вообще не понимаю почему вы сразу отнеслись к нему отрицательно, хотя сами, скорее всего, сам код даже и не глядели.
Если человек что-то написал, то это само по себе уже заслуживает оценки, и если это что-то не «чятик на дельфи», то я не вижу никакой причина ее занижать.
Вы предубеждены по отношению в Delphi? :)

Я когда-то на нем писал решение подобной задачи — распознавание образа в каком-то роде и решал ее похожими средствами :)

Кстати, кто-то выше писал про нейронную сеть — система матриц-«отпечатков», предложенная автором — это одна из реализаций нейронной сети и есть :)
> Если человек что-то написал, то это само по себе уже заслуживает оценки
почему же оценка не может быть отрицательной?
в написании самой нейросети нет ничего сложного… вся сложность как раз в конвертации исходного изображения в более простое (очищенное от шума и прочего, что и было сделано в этой статье), которое нейросеть сможет прогнать через себя. другими словами методы обработки изображения являются фундаментом для любой нс, которая работает с изображениями, причем нс целесообразно использовать для распознавания рукописного текста, а здесь достаточно того, что было сделано — быстро и относительно просто
для вас нейросеть является этолоном сложности задачи? rofl :))
При решении этой задачки я не руководствовался тем, какой инструмент лучше бы подошёл… я работал с тем, что было под рукой, что было бы проще понять читателям, и это вовсе не значит что мой любимый язык php, и я только на нём разрабатываю.
Можно было бы написать код и на Ассемблере. Но зачем?
Многие бы стали вникать в суть кода? Если здесь самое интересное — понять алгоритм.

К слову, в своё время писал системные службы на Ассемблере, под Windows. К примеру одна из сетевых служб сейчас уже N-й год работает в одном из интернет-центров города, и подсчитывает трафик.

Теперь к Windows`у придерётесь? :)

Ещё раз повторюст, что целью этого поста было показать как можно обойти типичную капчу, проанализировать алгоритм, а не показать какие-то прелести языка.
вы бы еще предложили бы каптчу на асме разбирать. на пхп быстрее и проще… и, ИМХО, нет в нем ничего настолько плохого…
UFO landed and left these words here
Я php люблю так же как и C.
Просто каждый язык использую в нужном мне месте.

«php — этим всё сказано» — с вами все ясно.
> «php — этим всё сказано» — с вами все ясно.

Так забавно =) Напомнило:

«Я так не люблю грубость и грубых людей, что готов набить им морду».
«Я так не люблю грубость и грубых людей, что готов набить им морду».

Да уж, судя по числу минусов, заработанным odinом — на хабре так поступает большинство. Добрее надо быть(
UFO landed and left these words here
А жаль, за мысль отличную от всех остальных слили чувака с хабры, а мог бы ведь еще и что-то полезное написать… Демократия это плохо, но лучше нее все равно ничего нет.
а может суть поста в том, что некоторые капчи можно «даже» на php взломать за вечер? ;)
Это конечно весьма интересно, но все же эта капча уж очень простая. Вот если бы вы нейросеть написали, которая обучена такие капчи распознавать, то это было бы действительно круто.
По секрету скажу, что настоящей целью для меня было — попасть на Хабр. :) Цель выполнил, получил инвайт :)
Т.к. тема интересна — в следующий раз напишу о взломе капчи посложнее, и на каком-нибудь другом языке.
Давно собрался поломать капчу на сайте Теле2 (там тоже простая) правда не из спортивного интереса а чтобы смски себе слать когда сервак падает. http://sms.tele2.ru/controls/ImageCode.aspx Если будет желание, можете потренероваться на ней =)
На статью меня пожалуй не хватит, но так… немножко потренировался.
Там вроде шрифт один и тот же, только наклон разный и шум мешается.

От шумов картинку можно почистить медианной фильтрацией.
Потом бинаризовать с помощью k-средних.
Выделяем объекты, чтобы определить наклон вычисляем наклон главной оси объекта, например, с наименьшим эксцентриситетом. В зависимости от угла сдвигаем строчки пикселей на сколько надо (понятно, что нецелое число, ну и фиг с ними с погрешностями округления =)
Ну и потом сравниваем с шаблонами циферок.

Если захотеть, за вечер можно наваять. Про алгоритмы обработки изображений, которые я упомянул, хорошо написано на английской википедии ;)
UFO landed and left these words here
возьмите и перепишите на своём любимом пайтоне (отдельные тру-программеры могут сделать это на рубионрейлс), там ничего phphardcore нету…

я один устал от просветленных или есть еще такие?
> я один устал от просветленных или есть еще такие?

да, блин, надо просто меньше реагировать на это =) ясно-понятно, что в подобном «просветлении» ключевую роль играет массовая агитация и пропаганда; при этом, «просветлённые», как правило, весьма поверхностно знают и Python, и Ruby (часто — на уровне мануалов «пишем блог за 15 минут»), и, рассуждают в большей мере о фреймворках, противопоставляя (зачем-то? зачем? :)) — язык.

«Просветлённым»: главное, попадая под влияние массовой мэйнстримовой идеи, иметь смелость жить своим умом. И, если уж Вы хотите, показать, рассказать об особенностях и достоинствах Python'a/Ruby'и, то и нужно писать именно об этом, а не о том, как «похапе» (блин, какое забавное наречие :)) «уныл» ;)
вы будете смеяться, но когда я писал верхний мега-комент, у меня в голове там и крутилось посоветовать автору статьи: «уважаемый автор, не надо статей, дайте им видео-каст 'пишем мега-де-капчер за 15 минут'… и не надо сорцы, надо gem install megadecapcher»
> и не надо сорцы, надо gem install megadecapcher»

Ну, вот этот момент уже спорный. Прогресс имеет направление, связанное со снижением механической работы в созидательном процессе. «Правило генерации (из одной философии): избегайте ручного ввода кода, при любом удобном случае, пишите программы, которые бы писали программы.» Поэтому кодогенерация (и как частные случае — просто автокомплит и сниппеты в редакторе) — это хорошо.

По идее, плагины (в данном случае, руби-джемы) тоже можно представить частями конструктора (уже сгенерированными за человека), из которой кто-то строит свои системы. И это тоже хорошо. Другой вопрос — качество этих плагинов и знание самого Руби (или даже РубиОнРэйлс) — если этот вопрос тоже не столь важен — это тоже хорошо, человек строит свою систему и достигает цели (а цели разные — кому-то хочется глубоко знать язык, кому-то — закрывать побольше заказов — все цели относительно хороши).
Помню, когда-то аналогичным способом ломал капчу сервиса по бесплатным отправкам смс-ок. В результате с помощью скрипта на сервере + миниопера я укладывался в 5 нетариффицируемых килобайт, отправляя смс-ку. Но потом тот сервис прикрыли (оставив возможность посылать только локальные смс-ки в пределах дальнего региона РФ).

Сейчас, наверное, самый простой и дешевый способ распознавать капчи в поток — это воспользоваться специализированными сервисами, которые позволяют распознавать 1000 капч за 1$
Угу. За 1$ семья из 10-ти индусов будет и больше капч распознавать :) Где-то пробегала статья про такой вид бизнеса. Сидят ребята, вводят капчи, получают по меркам своей страны кучу бабла.
UFO landed and left these words here
По алгоритму замечание, можно было упростить, до:

1) Режем капчу
На этом этапе отрезаем слева и справа по 12px.
Т.к. высота цифры не выше 14px, то снизу и сверху обрезаем лишнее, в зависимости от высоты всей капчи.

2) Идем по полоскам, попиксельно закрашиваячерным, если встречаем резкое (критерий надо вывести) увеличение яркости, то закрашиваем белым.
В результате останутся только цифры на черном фоне

3) дальше распознаем, наложением шаблона.

ЗЫ Так же как вариант, можно применить фильтр — четкие границы (недавно была статья на хабре).
Да, в принципе этот алгоритм получился бы проще и понятней. И вообщем-то так я и хотел реализовать.
Но! Оказалось, что в редких случаях, пиксели практически сливались с градиентом (получаем нечёткие границы). Конечно во многих случаях капча бы распознавалась успешно, но всё же был бы достаточно высокий % когда капча не распозновалась.

Поэтому и пришлось сначала чистить угловой градиент, и лишь потом обрезать саму капчу.
Вы же все равно выбираете шаблон, который в максимальном числе пикселей совпадает с данным. Потеря нескольких пикселей не существенна.
UFO landed and left these words here
Ну пара минусов заметны. Хотя, конечно, надо смотреть больше примеров.
Я что-то пропустил в деле проверки проиндексированности страниц в Яндексе? Тот же YCCY продолжает работать именно через него. Или минусующие вообще не поняли, при чём тут mail.ru? -)
Не знаю, в каких случаях ещё Яндекс показывает даннуюб CAPTCHA, но он точно показывает её при массовой проверке проиндексированности страниц (даже если поставить запрос 1 ссылки каждые 4-5 секунд). Если у вас сайт с десятками тысяч страниц и вы хотите продавать ссылки (через Сапу или что-то ещё), нужно исключить из списка страницы, не проиндексированные Яндексом. Тут вариантов 2 — или Яндекс.XML (платный) или mail.ru, использующий в качестве своего поискового движка тот же Яндекс, но не требующий ввода CAPTCA при массовых запросах. Программ для проверки много, в том числе YCCYб она как раз может использовать 2 метода провеки через mail.ru
Синусоиды идут вдоль прямой и с постоянным шагом, — по этому их распознать не сложно. Белые синусоиды потом снять сложней, ибо есть только отдельные точки, но все равно даже пары цифр достаточно. Ну а дальше распознавание самих цифр — тривиальная задача.
UFO landed and left these words here
В хорошей статье капчи «протухли».
Обновите. Очень хочется посмотреть.
А еще лучше на какой-нибудь imageshack. Обязательно буду ждать.
А можно использовать «математическую морфологию» для удаления фона. Пример на MATLAB:

I = imread('cap.png');
A = imsubtract(I, imopen(I, strel('disk', 2)));
imwrite(A, 'cap-new.png');

Результат:


Остается диагональная линия, но ее можно не убирать, она не мешает.
в данной капче можно без морфологии, в цикле пробегаются цвета пикселей, где RGB будет больше определенного значения -то место и метим. В свое время так битрикс со своими цветными циферками и буковками палился, там правдо нужно было границу «не больше» для каждого цвета подобрать :) ишрифт у них лежал, так что наготовить масок — было делом получаса.
Вобще gif это зло для капч, там качество цифр на порядки выше чем у jpg и читать такие капчи легче
Интересный подход, но скорее относится к алгоритму распознавания текста в картинке. Взлом капчи — более сложная задача и не обязательно связанная с распознаванием картинки.
Что будет если чуть-чуть изменить алгоритм формирования капчи?! — скрипт перестанет работать.
Но в целом понравилось ;)
Каждый распознаватель пишется под конкретную капчу. Универсального решения нет.
Вы аккуратнее с этим сайтом) если все ломанутся ломать (хм...) его капчу, то одним хорошим древним сайтом рунета может стать меньше)
Проверку схожести изображений корреляционным методом проходят на первом курсе универа.
Этим постом ты хотел показать, что ходишь на лекции?
Как студент, закончивший первый курс универа, заявляю, что у нас этого не было =)

зы: на лекции хожу.
На лекции не хожу — т.к. не учусь, надоело :)
Про «корреляционный метод» и «математическую морфологию» слышу впервые.

Так что по-видимому целью моего поста было — показать каким образом, таким смертным как я, не владеющими этими внеземными технологиями — просто разобрать капчу :)
Часто для того, что успешно сосчитать такую капчу без сильных искажений, достаточно сканировать только первых несколько столбцов цифры, а то и просто проверять суммы пискселей каждой цифры. Такие маски занимают куда меньше.
Здесь можно куда более дешёвый способ предложить — поставить 30 старейших компов в Либерии, посадить за них 30 местных человек (естественно компы на велотяге!) и за тарелку супа в день они каждый будет выдавать по капче в 10 секунд.

Т.е. 30 капч в 10 секунд = 3 капчи в секунду.

Причем алгоритмы пусть хоть заменяются. И можно к тому же это на поток поставить.

Правда гугл, подлец, требует подтверждения по СМСке, но здесь уже надо привлекать китайцев — их много.

А вааще, если по теме, то афтар — крайне плохой человек, ибо способствует делу спамеров гребаных. Хоть и из праздного любопытства.
> А вааще, если по теме, то афтар — крайне плохой человек, ибо способствует делу спамеров гребаных. Хоть и из праздного любопытства.

А вот это палка о двух концах. Чем больше будет взламываться простых капч, тем больше будет тех, что у Яндекса. Тем сложней будет их взламывать… до поры до времени — пока не научатся )) Закон щита и меча, одним словом.
Меня поразила как-то давно программа Universal Share Downloader с плагином разпознавания капчи на rapidshare. В то время там стола убийственная капча, в которой надо было ввести буквы, на которых нарисованы кошки, но не собаки. Я сам (глазами в смысле) не всегда мог определить, что именно за существо изображено, а вот распознавалка всё съедала и добавки просила.
AFAIK в этом случае распознавание было основано на базе уже распознаных каптч, пополняемых вручную, участниками сети.
Автору и всем, не надо выкидывать Алана Тьюринга из аббревиатуры КАПТЧА! )
UFO landed and left these words here
UFO landed and left these words here
Научитесь, пожалуйста, расшифровывать reCaptсha (http://recaptcha.ru/about-recaptcha/), помогите делу оцифровки книг для archive.org ^_^
Эту картинку и капчей-то назвать нельзя: свою основную функцию — проверку «человек/машина» она не выполняет
Топик напомнил о замечательной капче на школьном портале. habrahabr.ru/blogs/humour/42724/
степень в числителе надо было совпадающей с нижней, иначе ответ или 0 или бесконечность, которые можно угадать
UFO landed and left these words here
Здравствуйте, робот Auren. Насколько вы позитронны? Гильдия кибернетических организмов готовы вас завербовать!
UFO landed and left these words here
Меня просто заливает румянец.
Давайте лучше продолжим этот интим в личной конфиденциальной переписке? (шутка)

Кстати, как видим, работает и фильтрует интеллектуальные организмы :)
интересно, а какой есть альтернативный способ заменить капчу? Например на некоторых блогах встречал такое: «5+2= ?». Насколько этот метод спамоустойчивый, может кто его использует, поделитесь впечатлениями. Спасибо!
Этот метод настолько же спамоустойчив, как и другие методы. А при распознавании отдельных знаков (5, +, 2) машине пройти его даже проще, чем человеку, поскольку компьютер считает лучше человека
так там эти знаки не в открытом виде хранятся на странице, а примерно так: php echo $mcsp_info['operand1']. ' + '. $mcsp_info['operand2']
а какие будут мнения про reCaptcha? Или ее тоже уже научились считывать?
Там хоть книжки отцифровывать помогают, причём за чужой счёт. Гениальное решение. =)
UFO landed and left these words here
Не зря гугл перешел от каптч на отправку кода на SMS.
Похоже что нужен интернет с надежной аутентификацией пользователей, тогда и каптчи будут не нужны. На самом деле достало уже вводить их, пихают везде, а толк от них только на некотрых сайтах.
В гугле капчи всё равно остались. SMS кажется только на регистрации.
Иначе можно было бы принять смску и спамить, парсить, досить…
UFO landed and left these words here
может быть я плохо умею искать или мало кто об этом пишет, но нигде не встречал подобного.
А сам я даже и не задумывался на этим. Думал, что анализ графики — слишком сложное дело и явно не для пхп.
Большое спасибо!
Анализ графики и работа с изображениями — это довольно большая часть PHP)
Просто вы видимо самобучались этому языку?)
Так точно!

Работу с изображениями изучал, а вот анализ проспал )))
кстатии не очень сложна… заметьте линии цифр более вертикальны чем остальные, потом исправляем перспективу и проганяем через нейронную сеть… в теории реально её распознать
А можно снова скачать Ваш пример кода? К сожалению ссылка в примере уже не работает…
Only those users with full accounts are able to leave comments. Log in, please.