Как сделать капчу на python
На данный момент у нас с вами получился уже полноценный сайт, но одна страница все еще не сделана – это форма обратной связи. Давайте ее добавим. Для начала вместо функции contact пропишем следующий класс представления (в файле women/views.py):
Здесь все стандартно: определяем атрибуты form_class, template_name и success_url, а также методы: get_context_data и form_valid. Последний метод я прописал, чтобы продемонстрировать возможность обработки данных формы. Если пользователь все поля заполнил корректно, то будет вызван метод form_valid(), в консоли увидим словарь с данными формы и выполнится перенаправление на главную страницу.
Далее, в файле women/forms.py пропишем класс формы:
Здесь тоже все так, как мы делали ранее, просто определены три поля для ввода.
Создадим шаблон contact.html с содержимым:
И в файле women/urls.py свяжем маршрут contact с классом ContactFormView:
Вариантов для капчи множество и для фреймворка Django был разработан специальный модуль, который называется:
Для его установки достаточно прописать команду:
pip install django-simple-captcha
и модуль готов к использованию. Ниже в описании модуля есть ссылка на документацию:
где описывается как использовать этот пакет в своем приложении. Сделаем это. Вначале в файле settings.py пропишем этот модуль в списке установленных приложений:
Далее, по документации нам нужно выполнить миграцию:
python manage.py migrate
Затем, в корневой список маршрутов добавим строчку:
Все, привязка модуля к нашему приложению завершена и мы можем использовать ее в нашей форме. Для этого в файле women/forms.py импортируем класс для формирования поля капчи:
и в классе ContactForm пропишем его:
По идее, это все, по умолчанию наша форма теперь имеет капчу и давайте посмотрим как все это будет работать. Переходим в браузер, обновляем страницу обратной связи и видим дополнительно еще и капчу. Соответственно, она будет меняться при каждом обновлении страницы.
Если нужен другой вид капчи, оформить ее в своих стилях, то для этого используется дополнительно класс CaptchaTextInput, пример представлен в документации:
Кроме того, если требуется поменять шрифт, или его размер, цвета и прочее, то можно прописывать соответствующие переменные (приведены там же) в файле settings.py.
Вот так в самом простом варианте можно подключать капчу к своим формам.
Видео по теме
© 2022 Частичное или полное копирование информации с данного сайта для распространения на других ресурсах, в том числе и бумажных, строго запрещено. Все тексты и изображения являются собственностью сайта
Когда я разрабатывал набор скриптов для взлома, у меня не было никаких знаний об используемых алгоритмах при обработке изображений. Только спустя какое-то время я занялся изучением этого.
Когда я начинал, я предполагал примерно следующее:
- Изображение представляет собой матрицу с пикселями, расположенных в отдельных ячейках
- Цветное изображение имеет значения красного, зеленого и синего цветов для каждого пикселя (RGB). А черно-белое изображение имеет одно значение, которое варьируется от 0 до 255
- Каждый символ в captca четко определен
Итак, вот как выглядит страничка входа на университетский сайт:
Начнем с моих замечаний по поводу самой картинки капчи (именно на этом сайте):
- Расстояние между символами было везде одинаковым
- На изображении много рассеянных темных пикселей и линий, проходящих через символы на изображении
- Количество символов в капче всегда равно 6 и это изображение в градациях черного
Затем я загрузил одно такое изображение с капчи и с помощью этого инструмента визуализировал изображение в двоичном формате (0 для черного и 1 для белого пикселя).
Мои предположения подтвердились! На изображении размером 45х180 каждому символу выделено по 30 пикселей, что делает их равномерно распределенными! Таким образом, первым моим шагом стало:
- Обрезать изображение капчи на 6 равномерных частей, по 30 пикселей в ширину каждая.
Я выбрал Python в качестве языка прототипирования, так как его библиотеки проще всего использовать и реализовывать. Затем я без труда нашел подходящую библиотеку — PIL. (прим. ред.: Python Imaging Library — библиотека языка Python, предназначенная для работы с растровой графикой). Я решил использовать модуль Image, поскольку моя операция ограничивалась только обрезкой и загрузкой изображения в виде матрицы.
Итак, согласно документации, синтаксис для обрезки изображения следующий:
Изображение, которое будет получено в итоге:
Я написал простой скрипт и завернул все это дело в цикл, который извлекает 500 изображений captcha с сайта и сохраняет все обрезанные символы в папку.
- Все пиксели в символе являются черными (0). Я использовал простую логику — если пиксель не совсем черный — он белый. Следовательно, для каждого пикселя, который имеет значение больше 0, я переназначил значение до 255 (сделал белым). Изображение преобразуется в матрицу 45×180 с использованием функции load(), а затем обрабатывается.
Для проверки моего метода, я применил код к оригинальному изображению:
Как вы можете видеть, все пиксели, которые были не совсем черными, были удалены. Включая темные линии, которые проходят через все изображение. Только после того, как проект был завершен, я узнал, что вышеупомянутый метод называется порогом обработки изображений.
Теперь поговорим о следующем моем замечании,точнее о том, что на изображении много рассеянных темных пикселей и линий, проходящих через символы на изображении. Создадим специальный цикл, который будет проверять следующее: если соседний пиксель белый и пиксель, противоположный тому соседнему пикселю тоже белый, а центральный пиксель черный, то по условию цикла, центральный пиксель также станет белым!
Что получилось в итоге:
Итак, как вы видите, на изображении остались только необходимые нам символы! Хотя может показаться, что некоторые из символов потеряли несколько своих пискелей, тем не менее, они послужат отличной “базой” для их сравнения с другими изображениями. В конце концов, главная причина, по которой мы так оптимизируем изображение, состоит в том, чтобы создать наиболее точное изображения для каждого возможного символа капчи.
Я использовал несколько различных скриптов, для того чтобы отобрать наилучшие изображения среди всех изображений символов. Изображение, с наименьшим количеством темных пикселей наилучшим образом подходит для изображений нашего “скелета”. Таким образом, получилось два скрипта:
- Один для группировки изображений, отсортированных по символу (ограничения: нет темных пикселей и совпадений с уже имеющимися >= 90–95%)
- Второй для отбора лучшего изображения для каждого символа
Таким образом, у нас уже были созданы изображения библиотеки. Затем мы преобразовали их в пиксельные матрицы и сохранили в виде файла JSON.
И наконец, вот алгоритм, который решает/взламывает любое новое изображение captcha:
- Каждый символ в новом изображении captcha, я принудительно прогонял через изображения JSON, которые я сгенерировал. Сходство рассчитывается на основе расположения темных пикселей на изображении.
Сам алгоритм взлома был примерно следующим:
Например, если пиксель был черным и находился в условных позициях 4 и 8 на изображении капчи и в нашем изображении “скелета” находилось совпадение, то счет увеличивался на 1. Этот подсчет сравнения количества темных пикселей в изображении скелета используется для вычисления итогового совпадения в процентах.
Затем выбирается символ(изображение символа), который имеет наивысший процент совпадения:
На некоторых страницах своего интернет магизина где есть формы авторизации, регистрации и др. решил прикрутить django simple captcha для защиты от ботов. В этой статье я поделюсь опытом установки и настройки этого расширения для django. Сама библиотека находится здесь
Библиотеку можн скачать и закинуть в свой проект или же установить с помощью команды в консоле.
Установка django simple captcha
В файле urls.py проекта добавляем маршрут
Обязательно нужно установить библиотеку Pillow без нее капча работать не будет!
Теперь в форму где будет выводится капча добавляем поле капчи
Настройка и отображение капчи
В документации есть все основные настроки для работы капчи, которые можно менять на свое усмотрение.
Что бы капча отобразилась на сайте нужно в файле settings.py указать один обязательный параметр.
И в шаблоне вывести ее этой переменной в моем случае это так.
Так же можно вывести ошибку капчи при неправильно введем проверочном коде этой переменной.
И еще можно повесить лейбл над капчей. Для этого в поле капчи которое мы добавляли в форму нужно прописать дополнительный параметр label='Are you an human? '
И вывести в шаблоне так
Чтоб была возможность обновить капчу я сделал кнопку и применил яваскрипт из документации капчи.
Вот кнопка в которую я добавил в шаблон с классом captcha-refresh
И на эту кнопку я повеcил яваскрипт который динамически обновляет капчу
Чтоб скрипт работал нужно подгрузить jquery в ваш шаблон.
В итоге у нас должна получиться вот такая капча
И последнее в settings.py можно именять ее по своему желанию. Как писал выше в документации есть основные настройки капчи их нужно указать в вашем файле settings.py. В моем случае я сделал шесть настроек.
Подробно не буду расписывать что делает каждая настройка но в общих чертах изменил цвет, размер и количество символов в капчи. В документации там много всяких настроек это уже каждый для себя может пробовать.
Самый простой вариант это сделать вторую форму где не будет поля капчи и уже во вьюхе подсовывать именно эту форму для авторизованного пользователя.
Давайте приступим к реализации этой задачи.
Делаем вторую такую же форму только без поля капчи. Покажу на вымышленном примере.
Теперь мы должны получить во views.py наши формы. Импортируем их во вьюху и делаем примерно такую вьюху (взял вьюху из доки для прмера).
В результате кровавой войны между администраторами серверов и ботоводами, было придумано, воистину, ужасающие оружие, и имя ему — CAPTCHA. Однако, всегда есть решение.
И имя ему anti-captcha. Данный сервис отдает твою каптчу индусам, и они, решают её за копейки.
В этом уроке, мы реализуем авторизацию на ваксе.
Подготовка
Для обхода каптчи, нам потребуется аккаунт на anti-captcha, и пара долларов.
После пополнения баланса, нужно скачать плагин в zip формате, отсюда. Данный плагин закиньте в папку с будущим скриптом.
Пишем код.
Скопируйте себе следующий код:
В данном примере, мы попробуем авторизироваться на ваксе. Большую часть кода, я брал отсюда.
Далее, allow_catcha() передает api_ключ плагину, что-бы он мог работать. Разумеется в этой строке
Ключ нужно заменить на свой. Получить его можно в личном кабинете. Данный ключ лучше никому не показывать.
Ждем 10 секунд
Потом, pass_captcha_login() ждет решения каптчи, т.е. ждет появления элемента с классом ‘.antigate_solver.solved‘
Ожидания я разбирал здесь
Ждет 3 секунды, на всякий случай.
Ищет кнопку Login, и кликает по ней.
Теперь, запустите скрипт, и сразу же начните заполнять поля логина и пароля. После решения каптчи, бот сам нажмет на кнопку Login.
Заключение.
В данном примере, у нас получилось реализовать авторизацию на ваксе, с помощью анти-каптчи. Это хороший пример, но практической пользы от него мало, т.к. на ваксе можно авторизоваться и без каптчи (через гугл или реддит).
Читайте также: