Как обойти капчу на примере самого используемого в мире плагина для WordPress Really Simple Captcha. Обход капчи на python довольно тривиальная задача, но получится ли это сделать за 15 минут?
Капча (CAPTCHA) — надоедливая картинка с текстом, которую надо ввести, чтобы попасть на сайт. Капчу придумали чтобы роботы не могли автоматически заполнять формы, и чтобы владельцы сайта были уверены, что пользователь — человек. С развитием машинного обучения и нейронных сетей, ее зачастую стало довольно просто обойти.
Я прочел отличную книгу: Deep Learning for Computer Vision with Python, которую написал Adrian Rosebrock. В этой книге Адриан описывает способ, которым он взломал капчу на сайте E-ZPass New York используя машинное обучение:
У Адриана не было доступа к исходному коду, генерирующему капчу. Чтобы обучить модель, ему пришлось скачать тысячи картинок и вручную разметить все надписи.
Как сделать чат-бот с капчей
Но предположим, что мы хотим обойти капчу, к исходному коду которой у нас есть доступ.
Я зашел на WordPress.org Plugin Registry и ввел в поиске “captcha”. Первый результат назывался “Really Simple CAPTCHA” и установлен более миллиона раз.
И самое крутое — он с открытыми исходниками! Раз у нас есть алгоритм, генерирующий картинку, его, должно быть, не сложно обойти. Чтобы было сложнее, ограничим себе время. Можно ли уложиться в 15 минут? Давайте попробуем!
Важное замечание: Это ни в коем случае не критика плагина “Really Simple CAPTCHA” или его автора. Сам автор указал, что плагин более не является надежным и рекомендует использовать что-нибудь другое. Это просто небольшой интересный челлендж. Если вы один из того миллиона пользователей, установивших его, то возможно вам стоит сменить данный плагин на что-нибудь другое
Челлендж: обход капчи на Python
Для начала посмотрим на изображения, создаваемые Really Simple CAPTCHA. На демке видим это:
Итак, капча состоит из четырех букв. Убедимся в этом, посмотрев исходники:
public function __construct() < /* Characters available in images */ $this->chars = ‘ABCDEFGHJKLMNPQRSTUVWXYZ23456789’; /* Length of a word in an image */ $this->char_length = 4; /* Array of fonts. Randomly picked up per character */ $this->fonts = array( dirname( __FILE__ ) . ‘/gentium/GenBkBasR.ttf’, dirname( __FILE__ ) . ‘/gentium/GenBkBasI.ttf’, dirname( __FILE__ ) . ‘/gentium/GenBkBasBI.ttf’, dirname( __FILE__ ) . ‘/gentium/GenBkBasB.ttf’, );
Да, действительно капча создается случайным образом из четырех букв или цифр с разными шрифтами. Символы “O”, “0”, “I”, “1” не используются, чтобы пользователь не путался. Остается 32 символа, которые нужно распознать. Не проблема!
Прошло: 2 минуты
Набор инструментов для решения капчи
Перед тем, как решать задачу, перечислим инструменты, которыми мы будем пользоваться:
Python 3
Python — простой и мощный язык программирования с отличными библиотеками для машинного обучения и машинного зрения.
OpenCV
Популярная библиотека для обработки изображений с поддержкой алгоритмов машинного зрения. Мы будем использовать ее для предварительной обработки капчи. OpenCV написана на C++, но все ее функции вызываются из питона, чем мы и будем пользоваться.
Keras
Фреймворк для машинного обучения, написанный на питоне. С его помощью легко строить, обучать и использовать нейронные сети. Требует минимального количества кода.
TensorFlow
Гугловская библиотека для машинного обучения. Мы будем пользоваться только Keras, но сам Keras в качестве бэкенда использует TensorFlow, поэтому его тоже придется установить.
Итак, обратно к задаче!
Создаем датасет
Чтобы собрать любую модель машинного обучения, требуются обучающие данные. Нам понадобятся данные, выглядящие следующим образом:
Так как у нас есть исходный код плагина, создающего капчу, мы можем его использовать, чтобы нагенерировать 10,000 изображений, и для каждого будет известна расшифровка.
Пару минут повозившись с кодом и добавив в него простой цикл ‘for’, я получил папку с обучающими данными — 10,000 PNG файлов, в названии которых указан правильный ответ:
В этом и только в этом месте я не дам вам рабочий пример кода. Мы делаем это в образовательных целях, и мне не хочется, чтобы вы заспамили реальные сайты, работающие на WordPress. Вместо этого, я дам ссылку на 10,000 изображений, сделанных мной, чтобы вы могли повторить мой результат.
Обход капчи на python: упрощаем задачу
Теперь, когда есть обучающие данные, мы могли бы их использовать напрямую, обучив по ним нейросеть:
С достаточным количеством данных, этот подход мог бы даже сработать. Но можно сделать решение капчи на python проще. Чем проще задача, тем меньше нам понадобится обучающих данных и вычислительных ресурсов, чтобы ее решить. У нас ведь всего лишь 15 минут!
К счастью, капча состоит всего из четырех символов. Если как-нибудь разделить ее так, чтобы каждая буква была отдельным изображением, то можно будет обучить нейросеть распознавать по одному символу за раз:
У меня нет времени разрезать каждую из 10,000 картинок в фотошопе. Это бы заняло несколько дней, а у меня осталось всего 10 минут. И нельзя просто автоматически разделить все картинки на 4 одинаковых куска. Потому что алгоритм задает символам случайное горизонтальное положение:
Символы сдвинуты случайным образом, чтобы изображение было сложнее разделить.
К счастью, это всё же можно автоматизировать. При обработке изображений часто приходится находить связные области из пикселей одного цвета. Границы таких областей называют контурами. В OpenCV есть встроенная функция findContours(), которую мы используем, чтобы найти связные области.
Итак, начнем с изображения капчи:
Преобразуем изображение в бинарное (это называется thresholding), чтобы было легче найти связные области:
Далее, используем функцию findContours(), чтобы выделить связные группы пикселей, состоящие из одного цвета:
Теперь, нужно просто сохранить каждый прямоугольник как отдельное изображение. И, так как мы знаем последовательность символов в каждом изображении, можно подписать каждый прямоугольник своим символом при сохранении.
Погодите-ка! Тут есть проблемка! Буквы в капче иногда накладываются друг на друга:
И наш алгоритм отмечает их как одну:
Если проблему не решить, то у нас будут плохие обучающие данные. Это нужно исправить, потому что с такими данными мы обучим модель распознавать эти две слившиеся буквы как одну.
Простой выход из этой ситуации сказать, что если какой-то прямоугольник в ширину сильно больше, чем в высоту, то это нужно считать двумя буквами. В этом случае, прямоугольник можно просто разрезать посередине и считать, что это два прямоугольника:
Капча на чат в телеграмме
Будь в курсе последних новостей из мира гаджетов и технологий
iGuides для смартфонов Apple
Как использовать ChatGPT в Telegram? Подборка удобных чат-ботов
Александр Кузнецов — 22 марта 2023, 21:40
Компания OpenAI недавно предоставила сторонним разработчикам доступ к API ChatGPT, благодаря чему они начали встраивать этот нейросетевой бот в свои проекты. Для телеграм-ботов такая возможность пришлась как нельзя кстати, ведь гораздо проще общаться с искусственным интеллектом не на сайте, а в привычном мессенджере.
OpenAI взимает плату с тех, кто использует API ChatGPT, поэтому телеграм-боты с этой нейросетью обычно монетизируются за счёт своих пользователей. Впрочем, есть бесплатные лимиты, и хотя они невелики, можно использовать несколько ботов, и этого будет вполне достаточно для ежедневной обработки десятков сложных запросов.
Телеграм-боты используют доступную разработчикам инфраструктуру ChatGPT, поэтому общение с ними ничем не отличается от переписки с нейросетью на официальном сайте ChatGPT. Поддерживаются различные языки, в том числе русский, но наиболее точные и подробные результаты обычно получаются на английском. Стоит понимать, что ChatGPT иногда выдаёт непроверенные и недостоверные, поэтому не стоит полагаться на него без более тщательной проверки, особенно если речь идёт об ответах на какие-то важные вопросы.
Лучшие чат-боты с ChatGPT в Telegram:
- ChatGPTBot: 20 000 токенов в день бесплатно, можно докупать примерно по 50 копеек за 1 000 токенов
- ChatGPT : 10 000 токенов в день бесплатно, подписка без ограничений стоит 299 рублей в месяц
- GPT Chat bot | Нейросеть: 20 000 токенов в неделю бесплатно, подписка без ограничений стоит 95 рублей в месяц
- ChatGPT Bot: 50 000 токенов в неделю бесплатно, подписка без ограничений стоит 499 рублей в месяц
- ChatGPT |На русском : полностью бесплатно, разработчик принимает добровольные пожертвования
- ChatGPT 3.5 | Telegram Bot: 20 запросов в день бесплатно, за 5 долларов в месяц лимит увеличивается до 100 запросов в день
У некоторых телеграм-ботов есть дополнительные возможности. К примеру, ChatGPT |На русском умеет озвучивать тексты, в том числе на русском языке, а ChatGPTBot может рисовать изображения по текстовым описаниям.
Источник: www.iguides.ru