Введение

Сайт Digg.com предоставляет довольно мощный API, который позволяет выполнять многие вещи: комментировать, голосовать за новость, поиск и т.д… Но он не позволяет главного — публиковать свою новость. В принципе нас ни что не ограничивает написать скрипт для автоматического добавления новостей со своего источника. Единственно препятствие — это Captсha, ей мы и займемся.
Структура каптчи
![]() |
![]() |
![]() |
- Наклоненные буквы, на разной высоте.
- Перечеркнутый задний фон.
- По экспериментам Captha не чувствительна к регистру букв.
- Буквы английского алфавита a-z, кроме o,i,z.
- Цифры 2,3,4,6,8
И тут мы остановимся… На хабре уже пробегали способы распознавания символов на картинках с помошью python, OCR и нейронных сетей. Наиболее полно эта тема освещена в статье уважаемого Indalo. Но такой способ не давал 100% вероятности распознавания и относительно сложен в реализации. Зная, что всегда ещё способ решить задачу проще, я случайно увидел интересную фразу: «Can't read the text? Listen it».
Прослушав, я заметил что все буквы озвучивает один диктор и всегда одинаково, без помех и посторонних звуков. И действительно озвучивание призвано помочь людям, которые не в состоянии разглядеть все буквы, ввести правильные символы. Если такой способ легче для восприятия человеком, то он соответственно должен быть проще и для бота.
При заполенении форм сайт отдает нам такого вида картинку (Внимание требует cookies!):
http://digg.com/captcha/2c7ea3845d5ddfc5a7461c5429b6a7e5.jpg

Звуковой файл будет выглядеть так (Внимание требует cookies!):
http://digg.com/captcha/2c7ea3845d5ddfc5a7461c5429b6a7e5.mp3

После проведенных экспериментов удалось выяснить, что фрагмент каждой буквы равен ~2000 байт. На заднем плане присутствуют шумы, но они не сгенирированны случайным образом, и одна и та же буква на разных каптчах абсолютна идентична. Поэтому наши mp3 файлы следует рассматривать как простой массив символов для поиска таких фрагментов.
Распознавание символов
Далее приведен процесс распознавания. В этой работе я использовал python, но ничто не мешает перенести проект на другие языки.
- Вручную создаем базу с готовыми капчами (примерно 100 штук).
- Для каждого символа пару звуковых капч, в которых он встречается только один раз, и все остальные символы уникальны, т.е. в разных каптчах не повторяется. Например для цифры — 2, берем такие: AS2DE, 2ZTKJ.
- В выбранных каптчах, обычным перебором ищем одинаковую максимально совпадающую последовательность. На выходе получим примерно 2000 символов.
- Контролируем, чтобы нам не попался фрагмент 'паузы'.
- Добавляем полученный результат в базу.
Пример простого перебора для двух каптч:
- def compare(letter, filename1, filename2):
- tfile1 = filename1 + '.mp3'
- tfile2 = filename2 + '.mp3'
- f = open(tfile1, "r")
- test1 = f.read()
- f2 = open(tfile2, "r")
- test2 = f2.read()
- cnt = i = j =-1
- k = 3000
- for item in test1[:-k]:
- i = i + 1
- j = i + k
- cnt = test2.find(test1[i:j])
- if cnt > 0:
- res = test2[cnt:cnt+k]
- f3 = open('sources/'+letter, 'w')
- f3.write(res)
- return
- return
На этом все, результат распознавания 100%. Теперь когда робот отправляет нашу новость на digg.com, он на странице находит адрес картинки Captcha, заменяет на mp3, запрашивает озвучку используя cookies, находит искомых 6 символов, сравнивая с собственной базой данных, и отправляет результат. Все новости с вашего сайта будут публиковаться на digg.com за считанные секунды.
Если на вашем сайте есть звуковые каптчи, рекомендую отказаться от них, либо обезопасить следующими рекомендациями:
- Использовать разных людей, с различными акцентами и интонациями.
- Варьировать уровень звука, особенно на заднем плане.
- Добавлять шумы, сгенерированные случайным образом.
Для взлома более защищенных звуковых Catcha, простой метод сравнения кусков mp3 файлов может не дать положительных результатов. В этом случае рекомендуется использовать специальные фильтры для обработки аудио дорожки и удаления шумов. После чего, как вариант, можно применить нейронные сети для анализа последовательностей. Конечно результат будет меньше 100%, но зато будет оставаться на уровне. Кроме того можно попробовать сервисы распознавания речи. Лучший который я встречал — это Google Voice, надо только отправить голосовую почту с нашей mp3 и через некоторое время получить транскрипцию (интересно было бы посмотреть на результаты).
Выводы
Многие сайты в интернете настолько увлеклись усложнением своей защиты от ботов, что в результате только отдалились от реальных пользователей. И пытаясь наладить обратный контакт с ними, сами создают слабые места, которыми обязательно кто-нибудь воспользуется. Из особо крупных вебсайтов, подверженных такой уязвимости могу отметить GoDaddy.com, точно такая же аудио Captcha в их сервисе whois при проверке доменов.
Все скрипты выполнены с использованием языка Python и доступны тут.
Upd: Перенес в блог Информационная безопасность.