Рекапча 2: Установка и настройка reCAPTCHA 2.0 от Google

Содержание

Как подключить Google reCAPTCHA v2 в PHP

Автор статьи: admin

Метки: PHP / Как сделать

В этой статье будем подключать Google reCAPTCHA v2 на PHP, эта система нужна для того, что бы на вашем сайте не было спама, поэтому обязательно её установите.

Получение API ключей:

Первым делом нужно получить ключ, для этого заходим на сайт Google reCAPTCHA, и там сверху нажимаем на кнопку «Admin console».

Создаём google recaptchaСоздаём google recaptcha

У вас должно открыться в окне с настройками капчи, настраиваем всё как из скриншота.

Пример настройкиПример настройки

Как видите, я назвал капчу «Тест», и выбрал reCAPTCHA v2, то есть капча версии два, также выбрал там под пункт флажок «я не робот», это значит на сайте у меня будет отображаться специальный флажок, который при нажатие будет проверять все данные браузера, например, cookie, и если всё в порядке, то я не робот.

Дальше в строчке домен, вводите доменное имя своего сайта, со всем соглашаетесь и нажимаете кнопку «отправить», у вас должно появится на экране два ключа.

Ключи для капчиКлючи для капчи

Если у вас всё примерно так, то значит создание ключа прошло успешно, верхний ключ используйте на клиенте, а нижний на сервере.

HTML:

Теперь займёмся нашем HTML файлом, тут всё просто, сделаем не большую форму и в строем туда Google капчу.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<!DOCTYPE html>

<html lang=»en»>

<head>

    <meta charset=»UTF-8″>

    <title>Google reCAPTCHA</title>

    <script src=»https://www.google.com/recaptcha/api.js» async defer></script>

</head>

<body>

    <form action=»http://example.com/form.php» method=»POST»>

        <p>Логин: <input type=»text» name=»login»></p>

        <p>EMail: <input type=»email» name=»email»></p>

        <div data-sitekey=»В пишем ваш клиентский ключ»></div>

        <hr/>

        <input type=»submit» value=»Submit»>

    </form>

</body>

</html>

Как видите всё очень просто, вы подключаете скрипт с API в header и добавляете в форму специальный div элемент с классом g-recaptcha, также имеет атрибут data-sitekey, который хранит в себе ключ для клиентской части сайта.

Форма для работы с google recaptcha Форма для работы с google recaptcha

Как видите она совершенно нормально отображается у нас.

PHP:

Теперь пришло время сделать работу на стороне сервера, это очень просто, так как, результат проверки капчи, будет отправляться вместе с данными из формы, когда будем отправлять данные формы.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

// Проверка того, что есть данные из капчи

if (!$_POST[«g-recaptcha-response»]) {

    // Если данных нет, то программа останавливается и выводит ошибку

    exit(«Произошла ошибка»);

} else { // Иначе создаём запрос для проверки капчи

    // URL куда отправлять запрос для проверки

    $url = «https://www.google.com/recaptcha/api/siteverify»;

    // Ключ для сервера

    $key = «Тут ключ для сервера»;

    // Данные для запроса

    $query = array(

        «secret» => $key, // Ключ для сервера

        «response» => $_POST[«g-recaptcha-response»], // Данные от капчи

        «remoteip» => $_SERVER[‘REMOTE_ADDR’] // Адрес сервера

    );

 

    // Создаём запрос для отправки

    $ch = curl_init();

    // Настраиваем запрос

    curl_setopt($ch, CURLOPT_URL, $url);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    curl_setopt($ch, CURLOPT_POST, true);

    curl_setopt($ch, CURLOPT_POSTFIELDS, $query);

    // отправляет и возвращает данные

    $data = json_decode(curl_exec($ch), $assoc=true);

    // Закрытие соединения

    curl_close($ch);

 

    // Если нет success то

    if (!$data[‘success’]) {

        // Останавливает программу и выводит «ВЫ РОБОТ»

        exit(«ВЫ РОБОТ»);

    } else {

        // Иначе выводим логин и Email

        echo $_POST[‘login’] . «<br/>».

             $_POST[’email’];

    }

}

Конечно, я написал комментарии, но всё же надо разобрать код, тем более, он тут не такой уж сложный и большой.

Сначала мы проверяем, существует ли переменная в массиве g-recaptcha-response, которая хранит в себе ключ то Google, если вы оказались не робот, если её нет, то программа выводит на экран «Произошла ошибка» и перестают работать.

Иначе он создаёт запрос для полной проверки на робота, но перед этим мы объявляем две переменные, первая, это переменная с URL, куда отправлять проверку, вторая, хранит ключ, который используется для обмена данными между сайтом и сервисом reCAPTCHA, также создаётся массив для отправки данных на сервер.

Теперь наконец делаем запрос на сервер для полной проверки, я не буду тут объяснять какая команда для чего нужна, лучше посмотрите по этой ссылке.

Можете заметить, что когда мы возвращаем данные, используем функцию json_decode(), она нужна потому что, сервер возвращает JSON данные, а PHP не умеет читать такой тип данных, первым параметром он принимает JSON, а второй, в нашем случае это $assoc=true, значение true нужен, что бы он превращал не в объект, а в массив.

Ну и в конце проверяем, если в массиве нет переменной success, то программа останавливается и выводит надпись «ВЫ РОБОТ» иначе, выводит логин и email, который вы вводили в начале, вот результат.

Результат работы google recaptcha в phpРезультат работы google recaptcha в php

Как видите всё работает.

Вывод:

В этой статье вы узнали как подключить Google reCAPTCHA v2 на PHP, и можете заметить, что это достаточно легко, надеюс вам понравилась статья.

Подписываетесь на соц-сети:

Оценка:

Количество оценивших: 1
Средняя оценка: 5,00

Результат работы google recaptcha в phpРезультат работы google recaptcha в php Загрузка…

Также рекомендую:

Вышла новая версия reCaptcha API 2.0 / Хабр

На днях, занимаясь очередным внедрением reCaptcha для одного из проектов, столкнувшись с небольшой проблемой в области отображения нескольких защитных изображений на 1 странице с помощью AJAX я в очередной раз пошел на страницу официальной документации «reCaptcha» и обнаружил, что документация существенно отличается от предыдущих версий.
Воспользовавшись поиском стало ясным — в мир вышла «recaptcha 2.0» с обновленным API и визуализацией а так же рядом других «плюшек», о чем я и расскажу в данной статье.

В Новой версии reCaptcha, или как ее теперь следует называть «gCaptcha» существенным изменениям подверглись визуальный интерфейс капчи для веб-приложений и алгоритм взаимодействия с сервисом валидации (API). Сами «защитные изображения» существенно (визуально) не изменились.
В данный момент так же нет (мне не удалось найти) информации об «официальном релизе» reCaptcha2, а на посадочной страничке проекта весит гордый «coming soon».

Новый интерфейс reCaptcha 2

Одним из существенных изменений, на который мы наталкиваемся практически сразу при ознакомлении с reCaptcha2 является новый интерфейс оформления защитного изображения.
Интерфейс был существенно переработан — теперь он отображается в виде небольшого виджета с импровизируемым чекбоксом «я не робот», при клике на котором пользователю предлагается разгадать изображение.

При успешном разгадывании изображения капча примет следующий вид:

В случае неудачного разгадывания изображения капча уведомит об этом, что является существенным улучшением — пользователю не нужно будет перезагружать страницу несколько раз. Капча так же уведомит о неудаче в случае истекания время сессии.
Посмотреть reCaptcha2 можно в живую на демо-страничке от гугла.

Новый API

Вместе с новым интерфейсом reCaptcha2 для взаимодействия используется и новый алгоритм внедрения и взаимодействия с удаленным API.
Ключи для использования reCaptcha2 на ваших сайтах можно получить в новом интерфейсе (требуется авторизация google):

Все так же используется алгоритм приватного и публичного ключа, которые в данной версии названы как «секретный ключ» и «ключ» соответственно. Существенным изменением является то, что ключ в reCaptcha2 не может быть глобальным — теперь каждый домен, на котором планируется использовать reCaptcha2 должен быть указан в настройках. Для localhost и 127.0.0.1 капча будет работать без указания домена.
С новым api внедрить капчу в тело страницы — дело 2х строк кода(*пример простого внедрения):

<script src="https://www.google.com/recaptcha/api.js" async defer></script>
<div data-sitekey="your_site_key"></div>

Несмотря на это, api обладает достаточно большим набором функций для различных вариаций выгрузки reCaptcha2 и настройки ее визуализации(отображение по callback’у, стилизация и другие).
Изменился и API для валидации взаимодействия пользователя с капчей. Сразу хочу отметить, что ранее используемый стандартный post field — recaptcha_response_field теперь именуется как g-recaptcha-response. Сам API теперь возвращает результат проверки в формате JSON, что собственно не может не радовать. Запрос на валидацию при submit`e формы с капчей должен выглядеть следующим образом:
www.google.com/recaptcha/api/siteverify?secret=your_secret&response=response_string&remoteip=user_ip_address

где соответственно secret — приватный ключ (секретный ключ), response — результат ответа пользователя (post.g-recaptcha-response), remoteip — ип-адрес пользователя (не обязателен). Результат обработки на данном URL будет возвращен в JSON формате:

{
  "success": true|false,
  "error-codes": [...]
}

в результате чего, валидация капчи будет выполнена в 1 строку (json_decode; object->success).
Документация: смотреть на google

Другие «Futures»

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

Ссылки по теме:

П.с. — для собратьев, увлекающихся php прикреплю ссылку на готовую библиотеку по упрощенному(хотя — куда уже легче то?) использованию reCaptcha2: github/google

Принципы решения reCAPTCHA 2 | AntiCaptcha plugin solver

Общие принципы


Когда наше расширение находит на странице блок reCAPTCHA 2 (не важно обычная это Кекапча или invisible) оно посылает API запрос к сервису anti-captcha.com, передаем ему Site key и домен сайта и ожидает от него ответа в виде специального Хеша. Этот хеш записывается в невидимое текстовое поле на странице рядом с Рекапчей. Далее при отправке формы этот хеш получает целевой сайт, валидирует его у Гугла и, убедившись что все впорядке, продолжает нормальную работу. Целевой сайт может использовать специальную callback функцию, о ней специальный подраздел ниже.

Invisible (невидимая) Рекапча


Особый тип капчи, который выглядит как небольшой значок Рекапчи, находящийся обычно в правом нижнем углу сайта. Явно не требует от пользователя незамедлительного решения капчи. И обычно она привязывается к кнопке отправки формы. При ее нажатии алгоритмы Гугл анализируют поведение пользователя и, при подозрении в использовании автоматизации, показывает блок, в котором предлагается выбрать витрины магазинов, дорожные знаки и т. д.. После успешного прохождения теста пользователем вначале вызывается Callback функция (если есть), а затем отправляется форма.


Для нашего расширения нет особой разницы какую Рекапчу решать. Разве что в случае с невидимой Рекапчей есть возможность сэкономить немного денег, используя опцию «Начинать разгадывать reCAPTCHA 2 только при появлении окна с выбором изображений», о ней вы можете почитать больше на странице с советами по финансовой оптимизации работы нашего расширения.

Несколько Рекапч на одной странице

На одной веб странице всегда может оказаться несколько Рекапч, например, одна для блока с регистрацией, другая для авторизации и так далее. Причем чаще всего все обычные Рекапчи имеют один Site key (уникальный ключ для каждого домена в системе Recaptcha 2), а рекапчи типа invisible — другой. Мы группируем все Рекапчи с одинаковым sitekey и сервису anti-captcha.com отправляется одно, максимум два задания (если на странице присутствует и обычная и invisible рекапчи) на решение. Тем самым достигается экономия ваших средств.

Callback функция

Часто для полного решения Рекапчи необходимо не только само хеш-решение, которое мы получаем от anti-captcha.com, но и выполнение определенной JS функции, которую владелец целевого сайта указал при настройке Рекапчи в качестве той, которую надо выполнить после успешного прохождения капчи. Так называемая callback функция.

Так как рекапч на странице может быть несколько, то наш алгоритм автоматически определяет для какой из них необходимо выполнить этот callback. Причем этот алгоритм учитывает множество факторов, распределенных по следующим приоритетам.

О приоритетах вызова callback функции для Рекапчи

Главный (первый) приоритет имеет блок Рекапчи, который был указан в API запросе в методе solveRecaptcha. Т.е. если вы явно в API запросе указали, что хотите решить вот эту конкретную Рекапчу, то callback почти наверняка будет вызван для нее, не зависимо от других факторов: скрыт этот блок в браузере или нет и т. д.

Далее приоритет отдается одному единственному видимому в браузере блоку Рекапчи. Это наиболее частый случай. Так как мы не можем знать наверняка, какую Рекапчу наш клиент задумал решать, то на момент окончания решения из их множества выберается одна, которая не скрыта от пользователя, и для нее вызывается callback. Если Рекапча одна на странице — то она все-равно должна быть видна пользователю, иначе callback не вызывается!

Причем тип рекапчи «невидимая» (invisible) не является в нашем понимании скрытой от пользователя. Ее значок все-равно виднеется в правом нижнем углу и мы ее интерпритируем так же, как и обычную. Вот если этот значок специально совсем скрыт от глаз пользователя в браузере, то тогда эта рекапча интерпритируется как скрытая и она не получит приоритет при вызове callback.

Последняя в приоритете вызова callback Рекапча, это та, которая была вызвана с учетом включенной опции «Начинать разгадывать reCAPTCHA 2 только при появлении окна с выбором изображений».  Т. е. если опция включена, и среди множества Рекапч на странице для какого-то блока появится окно, где надо выбрать светофоры или витрины магазинов, то, согласно идее этой опции, начнется сам процесс решения капчи и в итоге callback будет вызван именно для этого блока Рекапчи, но только если не выполняются два вышеуказанных условия (вызов API метода solveRecaptcha или одна единственная видимая Рекапча), которые являются более приоритетными.

На данный момент все приоритеты покрывают, по нашему мнению, большинство случаев, когда этот callback надо вызывать, и, в то же самое время, отсекают те вызовы callback, которые могут быть лишними. Если у вас есть какие-либо вопросы по вызову callback, не стесняйтесь писать свои предложение в нашу службу поддержки. 

Инструкции | AntiCaptcha plugin solver

При решении любого вида капчи


Плагин всегда рисует на целевои сайте значок нашего плагина рядом с решаемой капчей. Этот HTML элемент, помимо прочих классов, всегда имеет CSS класс .antigate_solver. Так что его всегда можно найти по такому селектору.


Помимо информационно-декоративной задачи, он так же может сообщить вашему скрипту о статусе решения капчи. Так как этот элемент так же содержит классы типа решаемой капчи и статуса ее решения.


Например значок может иметь вот такую группу CSS классов: «.antigate_solver.recaptcha.in_process». Что означает, что типом качи является Recaptcha2 (или Recaptcha3), а статус решения «В процессе».


Типами капч являются: recaptcha, funcaptcha, geetest, hcaptcha и image (обычная капча с искаженными символами).


Статусы решения: in_process, solved, error.


Соответственно ваш скрипт может опираться на классы элемента значка AntiCaptcha plugin и иметь представление о том, в каком статусе находится решение капчи.

Решение reCAPTCHA 2 («Я не робот»)


Recaptcha 2 (включая невидимую Рекапчу) подхватывается и решается автоматически на всех новых страницах браузера.
Затем для этого решения вызывается callback функция, куда и передается ответ на Рекапчу.
Обычно на решение уходит где-то около минуты, но вы всегда можете воспользоваться функцией прекешинга, который может значительно ускорить процесс работы.

Капча Я не робот автоматически находится на странице и распознается. Если в настройках плагина включены звуковые оповещения, то звуковые сигналы звучат: когда такая капча найдена, в процессе ее решения и по завершению.

Читайте больше информации по внутренней работе Рекапчи и вызове callback-функции.

Решение reCAPTCHA v3


Просто установите желаемое значение score (Desired score) в настройках плагина и не забудьте оставить галочку «Разгадывать reCAPTCHA 3 автоматически» включенной. Таким образом, все обнаруженные капчи, будут автоматически решаться в фоновом режиме на любой посещаемой странице.

Капча Я не робот автоматически находится на странице и распознается. Если в настройках плагина включены звуковые оповещения, то звуковые сигналы звучат: когда такая капча найдена, в процессе ее решения и по завершению.

Решение FunCaptcha с ротацией значков животных


FunCaptcha так же распознается и решается автоматически аналогично Рекапче, смотрите скриншот.
Для нее тоже вызывается callback метод с передает результата распознавания.
Процесс разгадывания может занять от 30 секунд до двух минут.

Капча FunCaptcha автоматически находится на странице и распознается. Если в настройках плагина включены звуковые оповещения, то звуковые сигналы звучат: когда такая капча найдена, в процессе ее решения и по завершению.

Решение FunCaptcha через прокси


Теперь можно решать Фанкапчу через прокси. В этом случае ваш IP адрес и IP адрес решеной капчи будут совпадать!

ВНИМАНИЕ!!! Для заданий капчи без прокси вам необходимо включить решение Funcaptcha Proxyless заданий в двух местах:
1) На странице API настроек чтобы эти типы заданий решались в плагине.
2) А так же в опциях плагина надо отметить галочку Разгадывать Funcaptcha автоматически.

Решение китайской Geetest капчи


С недавних пор мы работаем и с Geeest капчами и успешно их решаем.
Такие капчи распознаются автоматически на всех новых страницах браузера, как показано ниже.

Капча FunCaptcha автоматически находится на странице и распознается. Если в настройках плагина включены звуковые оповещения, то звуковые сигналы звучат: когда такая капча найдена, в процессе ее решения и по завершению.

Решение hCaptcha (Cloudfare) капчи


hCaptcha автоматически решается на всех новых страницах браузера, как показано ниже.

Капча FunCaptcha автоматически находится на странице и распознается. Если в настройках плагина включены звуковые оповещения, то звуковые сигналы звучат: когда такая капча найдена, в процессе ее решения и по завершению.

Обычная графическая капча

Для обычный капч-картинок необходимо вызвать контекстное меню (кликнуть правой клавишей мышки) на картинке капчи и в меню выбрать «Отметить картинку как содержащую капчу» (1), или нажать комбинацию CTRL+SHIFT+3. На картинке должен появиться значок AntiCaptcha plugin, обозначающий, что все подобные картинки для данного сайта будут интерпретироваться как содержащие капчу.

Также необходимо вызвать контекстное меню на поле ввода ответа на капчу и выбрать в списке «Отметить поле получателем решения капчи» (2), или нажать комбинацию CTRL+SHIFT+3. Рядом с полем ввода тоже появится значок плагина.

Присутствует функция автопоиска картинки с капчей при нажатии комбинации клавиш CTRL+SHIFT+6 на поле ввода капчи, аналогичная функционалу в WebVisum. После разгадывания капчи результат будет сразу помещен в поле ввода.

Со включенным звуковом действия по отмечанию картинки и поля ввода сопровождаются звуковым уведомлением.

Автоматическое разгадывание начнется и будет проходить для всех новый страниц данного домена, содержащих указанные картинку и поле ввода. Чтобы впредь процесс разгадывания не повторялся достаточно кликнуть мышкой на один из значков плагина рядом с картинкой или рядом с полем ввода. При наведении на этот значок на нем появится буква X и при нажатии пометка удалится.

Тепер капча-картинка автоматически находится на странице, распознается и ответ вставляется в помеченное поле. Если в настройках плагина включены звуковые оповещения, то звуковые сигналы звучат: когда такая капча найдена, в процессе ее решения и по завершению разгадывания.

Автоматическое решение Google Recaptcha / Хабр

Привет! Я воплощаю интересные идеи на python и рассказываю о том, что из этого вышло. В прошлый раз я пробовал найти аномалии на карте цен недвижимости. Просто так. На этот раз идея была построить систему, которая смогла бы сама решать очень популярную ныне Google Recaptcha 2.0, основываясь на некоторых алгоритмах и большой базе обучающих примеров.
Google Recaptcha 2.0 представляет собой набор изображений (9 или 16 квадратных картинок под одной инструкцией), среди которых пользователю, для подтверждения своей разумности, нужно выбрать все изображения одной категории. Речь пойдет НЕ о построении системы машинного обучения — распознавать мы будем именно капчи!

Если читатель не хочет вдаваться в подробности технического плана и романтику исследований, то вывод всей статьи будет сосредоточен около БКГ в конце.
Обучающие выборки капч для данного исследования мне любезно предоставил сервис антикапчи RuCaptcha.com, которые разработали API для доступа к выборкам решенных капч специально для моего исследования.
Стоит заметить, что Google располагает не очень большим набором инструкций для капч (пример: Select all images with recreational vehicle) на всех основных языках мира, а некоторые инструкции встречаются намного чаще других. Далее в статье под типом будут подразумеваться именно инструкции для капчи.

Тысячи изображений

После выгрузки и сортировки пробной партии изображений я стал вручную разбирать разные типы капч. Первым делом я построил md5 суммы от всех капч одного типа в надежде найти совпадения. Самый простой способ не сработал — совпадений попросту не было. А что? — Имею право!
Прогуливаясь глазами по иконкам изображений, нашлось кое-что интересное. Вот, например, 4 одинаковых лимузина:

Одинаковые, да не совсем — это заметно по размерам колеса в нижних левых углах. Почему для сравнения были выбраны именно лимузины? Их легче всего было просматривать глазами — картинки дорожных знаков или наименований улиц сливаются в одну, а искать похожие лимузины или пикапы было проще простого. Оценив глазами изображения разных типов, во многих я увидел повторяющиеся капчи с разными деформациями — растяжениями, сжатиями или смещениями. Найдя подходящую функцию похожести изображений и собрав достаточную базу, можно было надеяться на некоторый успех.

Perceptive hash

Почти все поисковые запросы ведут именно к нему. На хабре можно отыскать достаточно много статей, посвященных перцептивному хэшу (1, 2, 3, 4). Быстро нашлась и python библиотечка ImageHash, использующая пакеты NumPy и SciPy.

Как же работает Perceptive Hash? Вкратце:

dct = scipy.fftpack.dct(scipy.fftpack.dct(pixels, axis=0), axis=1)
dctlowfreq = dct[:hash_size, :hash_size]
med = numpy.median(dctlowfreq)
diff = dctlowfreq > med

  1. Изображение сжимается до размера hash_size.
  2. От значения получившихся пиксел берется дискретное фурье преобразование.
  3. От фурье преобразования считается медиана.
  4. Матрица фурье преобразования сравнивается с медианой и в качестве результата мы получаем матрицу нулей и единиц.

Тем самым от изображения мы можем выделить некоторый инвариант, который не будет меняться при незначительных изменениях исходного изображения. Стандартный hash_size равен 8 и он неплохо себя показал на пробных сравнениях. Одно из замечательных свойств данного хэша — их можно сравнивать и разность их выглядит как натуральное число.
Сейчас поясню. Хэш изображения — это матрица нулей или единиц (ноль — ниже медианы, а единица — выше). Для нахождения разницы, матрицы сравниваются поэлементно и значение разницы равняется количеству отличающихся элементов на одних и тех же позициях. Этакий XOR на матрице.

Десятки тысяч изображений

Перцептивный хэш хорошо определял сходство между одним и тем же лимузином, но с разными деформациями, и различие между совершенно разными изображениями. Однако, хэш подходит скорее для описания форм, изображенных на картинке: при увеличении числа капч неизбежны совпадения по форме объектов, но не по содержанию картинки (с некоторым порогом срабатывания, разумеется).
Так и случилось. С увеличением базы капч, росла необходимость в добавлении ещё одной сравнительной величины для изображений.
Объективную цветовую характеристику изображения можно описать гистограмой интенсивности цветов. Функция расстояния для двух гистограмм (она же функция разности) — сумма среднеквадратичных отклонений элементов гистограммы. Довольно неплохая связка получается. Абзац о подборе границ срабатывания и механизме поиска похожих изображенийУстановление максимальных допустимых разниц хэшей происходило вручную:

  1. Имеем пороги срабатывания для разниц перцептивного хэша и гистрограмы: max phash distance и max histogram distance
  2. Для всех изображений одного типа строим группы похожих, где каждой капче соответствует пара чисел — расстояния до «главы» группы phash distance и histogram distance
  3. Открываем всю группу изображений и визуально проверяем наличие ошибок
  4. В случае ложных срабатываний корректируем один из порогов

В пункте 1 я упомянул, что у группы есть «глава»: При поиске похожих изображений, капча сравнивается не со всей базой, а лишь с главами групп похожих изображений. В каждой группе гарантируется, что все изображения являются похожими с главой, но не гарантируется их похожесть друг с другом. Таким образом достигается некоторый выйгрыш в быстродействии.
Чуть позже я узнал об алгоритмах жадного поиска, но было поздно. В теории такой наколеночный алгоритм ищет первое, а не самое подходящее изображение, как в алгоритме жадного поиска. Однако это мешает только когда поиск ведется по всем типам инструкций сразу.

С одной стороны, учитывая тот факт, что разница phash у очень близких по форме изображений будет равна нулю, и представив, что процент ложных срабатываний будет достаточно низок — можно подумать, что использование одного лишь перцептивного хэша будет быстрее, чем использование двух хэшей. Но что говорит практика?

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

instructions						: phash only	: both hashes
дорожные знаки (не названия улиц!)			: 0.001%	: 0.002%
лимузины						: 52.97%	: 60.12%

Больше половины изображений лимузинов похожи между собой, вот это да! При использовании обоих хэшей результат все-таки лучше, но как дело обстоит с производительностью?

instructions						: phash only	: both hashes
дорожные знаки (не названия улиц!)			: 31.37s	: 31.06s
лимузины						: 17.85s	: 17.23s

Удивительно, но использование обоих хэшей оказалось быстрее, чем использование только перцептивного хэша с нулевым максимальным отклонением. Разумеется, это вызванно разницей в количестве операция сравнения изображений, и это притом, что сравнение гистограм из 300 значений медленнее сравнения перцептивных хешей размером 8 байт на 28.7%!

Сотни тысяч изображений

Проблемы производительности дали о себе знать на действительно большом объеме выборок. Для самых популярных типов время поиска похожих изображений на моём ноутбуке составляло уже секунды. Требовалась оптимизация поиска с минимальными потерями точности.
Изменение точности phash не казалось мне хорошей идеей. Поэтому посмотрим внимательно на гистограмму интенсивности цветов какой-то капчи:

Если бы меня попросили кратко описать эту гистограмму, то я бы сказал так: «Резкий пик на значении абсциссы 55, затем постепенное снижение графика и два локальных минимума на значениях 170 и 220». Если мы возьмём больше графиков гистограмм от похожих капч, то заметим, что эти графики по форме повторяют друг друга с небольшими погрешностями в положении максимумов и минимумов (экстремумов). Так почему бы не использовать эти значения для того, чтобы заведомо отсекать непохожие?

Окей гугл, как найти экстремумы в графике на питоне?

import numpy as np
from scipy.signal import argrelextrema
mins = argrelextrema(histogram, np.less)[0]
maxs = argrelextrema(histogram, np.greater)[0]

Описание функции argrelextrema говорит само за себя: Calculate the relative extrema of data.
Однако, наша гистограмма слишком зубчатая и локальных экстремумов намного больше, чем нужно. Необходимо сгладить функцию:

s = numpy.r_[x[window_len-1:0:-1],x,x[-1:-window_len:-1]]

Усредняем график алгоритмом скользящего окна. Размер окна выбирался опытным путем для того, чтобы количество минимумов или максимумов было в среднем 2, и остановился на значении 100 пиксел. Следствием работы такого алгоритма является красивый, гладкий и… удлиненный график. Удлиненный ровно на размер окна.
Соответственно смещаются позиции экстремумов:

mins = array([ 50, 214, 305])
maxs = array([116, 246])

Статистика распределения экстремумов
Сопоставив многие графики похожих капч я установил, что допустимым отклонением от позиций локальных экстремумов будет 3-4 пиксела. Регулируя эту величину в меньшую сторону можно добиться большей фильтрации и ускорения алгоритма за счет ухудшения сжимаемости.

Разумеется, в капчах от RuCaptcha могут быть и были ошибки распознавания. Для борьбы с ними была введена рейтинговая система капч. Если md5 новой капчи уже содержится в базе, но с другим типом инструкции, то у старой капчи увеличивается счетчик failure, а если тип старой капчи совпадает с новым, то увеличивается счетчик popularity. Таким образом вводится естественная регулировка неправильных решений — при поиске похожих учитываются только капчи с popularity > failure.

Мой первый миллион

За все время исследовательской работы было собрано более миллиона решенных капч. Для хранения данных использовалась база данных PostgreSQL, в которой удобно было хранить хеши и массивы значений гистограмм. К слову о хранении гистограмм — для расчета растояния между двумя гистограммами не обязательно хранить все 255 + window_size значений. При использовании половины или даже трети значений массива точность расстояния падает незначительно, зато экономится дисковое пространство.

По такой выборке капч статистика будет очень точной.

Ниже приведены данные по самым «сжимаемым» и самым популярным капчам (по 3 строчки):

тип инструкций				количество капч		количество групп	сжимаемость (%)

кактус					15274			5508			64
трёхколёсные велосипеды			2453			928			62
байдарки				5261			2067			61

дорожные знаки (не названия улиц!)	201872			189473			6
таблички названий улиц			137893			134695			2
любые уличные знаки			94569			92824			2

Закон Парето в чистом виде: 11% инструкций дают ~80% всех капч (а 20% инструкций дают 91% всех капч). И статистика отнюдь не в пользу самых сжимаемых типов.

Сам же google говорит так:
reCAPTCHA uses an advanced risk analysis engine and adaptive CAPTCHAs to keep automated software from engaging in abusive activities on your site.

Every time our CAPTCHAs are solved, that human effort helps digitize text, annotate images, and build machine learning datasets. This in turn helps preserve books, improve maps, and solve hard AI problems.

Намекая на то, что, через решение капч людьми он обеспечивает их автоматическую ротацию. Google сделал ставку на небольшой набор инструкций с хорошим уровнем ротации изображений, таких, как дорожные знаки или названия улиц.

В задачу не входил пункт про проверку на настоящей Google reCaptcha, поэтому в качестве альтернативы я буду использовать следующий алгоритм для всех новых обучающих изображений:

  1. На вход поступает капча 3×3 или 4×4 и разбивается на 9 или 16 изображений соответственно
  2. По описанным выше алгоритмам для всех 9 или 16 изображений подбирается похожее по ВСЕМ типам в базе данных
  3. Индексы изображений найденного решения сравниваются с индексами эталонного решения
  4. Если разница (количество различающихся индексов) между решениями 50% и больше, то капча считается нерешенной

На примере слева, если данные из базы (автоматическое решение) говорят, что правильные индексы это 0, 1, 3, а эталонное решение это 0, 1, 4, то различающимися индексами будут индексы 3 и 4. В этом примере 2 совпающих и 2 различных индекса, т.е. капча не решена.

Так как в большинстве капч 3×3 правильными являются 3 (+-1) индекса, то такой алгоритм даст схожие результаты, что и на натуральной reCaptcha.

В пункте 2 решение можно было подбирать по-разному:

  • Для каждого изображения делать поиск по ВСЕМ типам изображений в базе и потом отбирать только те, которые соответствуют типу инструкции. Такой подход позволит узнать статистику решений и по нецелевым изображениям тоже, а также проверит влияние ложных срабатываний на верность решений.
  • Для каждого изображения производить поиск только по одному типу инструкции. Такой поиск намного быстрее и не дает ложных срабатываний от первого способа впринципе.

Ниже собрана динамика результатов разгадывания за несколько дней:
В среднем, собранная система разгадывала гугловые капчи с вероятностью 12.5%, тем самым приводя весомый довод в пользу решений компании Google.

К моему удивлению, лидером по количеству решений стала одна из самых плохосжимаемых капч (статистика за несколько выборок):

тип					разгадываемость	разгадываемость (%)	сжимаемость (%)
любые уличные знаки			142		14.03			2
дорожные знаки (не названия улиц!)	80		7.91			6
пальмы					68		6.72			40
пикапы (легковая машина с кузовом)	58		5.73			43
жилой автофургон (дом на колесах)	58		5.73			43
названия улиц				57		5.63			43

А нецелевых капч находилось чуть больше (55%), чем целевых (45%). Целевыми капчами называются те, изображения которых при поиске среди всей БД (а не только по одному типу инструкции) успешно находятся и их тип соответствует типу инструкции капчи. Иными словами — в средней капче 3х3 про лимузины находится 3 изображения с лимузинами и ещё 3.66 изображения с любыми другими типами.

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

Я благодарен RuCaptcha за приятное общение и с их позволения выкладываю обучающую выборку в открытый доступ на yandex диск (спешите скачивать, диск проплачен на месяц):

  1. yadi.sk/d/CNJQ5uOwqfykL
  2. yadi.sk/d/gnTU-qwnqfykM
  3. yadi.sk/d/6vTTjhJaqfykV

Yandex диск не умеет загружать файлы больше 10 гигабайт, поэтому исследователей ждет задача склейки tar архива из 3х частей.

Меня не покидают мысли о машинном обучении на той же самой выборке 🙂 А пока что делюсь исходным кодом системы на python.

ReCaptcha — 2Captcha FAQ

Важное обновление: Эта страница содержит наш традиционный алгоритм решения рекапчи V2. Если это по какой-то причине не подходит для ваших целей, мы предлагаем новый альтернативный алгоритм без необходимости эмуляции браузера.
Здесь вы можете найти все дополнительные сведения и пошаговую инструкцию по использованию нового метода .

Основное различие между нашими методами заключается в том, что вам необходимо отправлять нам изображения капчи традиционным способом, а работники решают ваши капчи прямо на сайте, где они вам нужны.После последнего обновления многие капчи на более крупных и популярных сайтах могут быть решены только вторым методом, который также имеет 100% точность.

ReCaptcha Традиционный метод

Наш сервис поддерживает распознавание новой ReCaptcha v2 (ASIRA), где вы ставите галочку и выбираете изображение.
Мы поддерживаем 9 и 16 капчи, например 3×3 и 4×4 google recaptchas.

Схема работы:
1) Ставишь галочку.
2) Получить картинку + инструкция.
3) Отправьте нам картинку + инструкцию.
4) Получите от нас ID captcha.
5) Через 5 секунд подайте заявку на ответ по капче.
6) Возвращаем числовые последовательности изображений, по которым нужно щелкнуть, чтобы разгадать капчу.
7) Щелкните по указанным изображениям.

Captcha отправляется так же, как и обычные CAPTCHA (см. Наш API), но с дополнительными полями

Captcha 9 \ 16 квадратов + Отправить текстовые инструкции с дополнительными параметрами:
recaptcha = 1
textinstructions =% TEXT%
Где% TEXT% — текст, который необходимо указать (дорожные знаки, деревья, подарок, знак и т. Д.))

Captcha 9 \ 16 квадратов + Отправить инструкции изображения в «файл» изображения
recaptcha = 1
imginstructions = img
Где «img» — это инструкции к картинкам. Он может отправлять multipart или base64

Рабочие 2Captcha — люди, поэтому они выбирают правильные изображения для щелчка, и вы получаете следующий ответ:
ОК | щелкните: 1/2/10/14

Требования, отображаемые в CAPTCHA, и образец текста:
-CAPTCHA должна быть либо 300x300px, либо 600x600px, либо 632x632px
-Каптчи должны быть нормального размера, на изображении 300х300 — сетка 9 квадратов, на изображении 600х600 или 632x632px — сетка 16 квадратов
-CAPTCHA должно быть меньше 100 КБ
-textinstructions я должен прийти в кодировке UTF-8
-textinstructions должен содержать только те, которые нужно выбрать, отображаемые в CAPTCHA
-imginstruction не более 100x100px
-imginstruction Должно быть меньше 25 КБ

Образец формы для Zeennoposter http: // zennolab.com / Discussion / Threads / proekt-dlja-raspoznavanija-google-recaptcha-2-s-pomoschju-rucaptcha-dlja-zennoposter-5.22571 / page-8 # post-166204

.

Обход reCAPTCHA с помощью 2Captcha — 2Captcha FAQ

Google постоянно работает над улучшением своего алгоритма рекапчи, что, естественно, побуждает нас также действовать.

На веб-сайтах, использующих этот новый API, значительное количество пользователей смогут безопасно и легко подтвердить, что они люди, без необходимости вводить CAPTCHA. Вместо этого всего одним щелчком они подтвердят, что они не робот.

— Google Security

Большинство людей не видят эту CAPTCHA, особенно если они вошли в систему с помощью Google.Другая большая часть пользователей может просто установить флажок «Я не робот», в то время как остальные получат тест, в котором им нужно отсортировать изображения. Предполагается, что этот тип CAPTCHA намного сложнее обойти или взломать автоматизированными службами решения CAPTCHA.

Не так давно Google обновил ReCaptcha V2 с невидимой версией. Мы добавили несколько подсказок об этом типе ReCaptcha. Пожалуйста, прочтите здесь.

Мы в 2Captcha предлагаем вам 2 альтернативных метода для работы с новым Google recaptchaV2:

  1. Наш традиционный метод, требующий эмуляции браузера.
    Цена: 1,20 $ за 1000 решенных рекапч
  2. Совершенно новый метод без эмуляции браузера и со 100% точностью.
    Цена: $ 2,99 за 1000 решенных рекапч

Основное различие между этими методами заключается в том, что вам необходимо отправлять нам изображения капчи традиционным способом, а работники решают ваши капчи прямо на сайте, где они вам нужны. После последнего обновления многие капчи на более крупных и популярных сайтах могут быть решены только вторым методом, который также имеет точность 100% .

2Captcha — это автоматизированная служба торможения CAPTCHA с API, которая помогает веб-мастерам и интернет-маркетологам отправлять большие объемы CAPTCHA людям, которые их решают. Большинство интернет-маркетологов, которым приходится выполнять различные онлайн-задачи вручную, уже оценили удобство автоматизации онлайн-активности с помощью 2Captcha. Нет необходимости иметь навыки написания кода. Базовых технических знаний о ПО для SEO вполне достаточно, чтобы начать пользоваться сервисом. Если у вас есть вопросы, просмотрите наш FAQ или напишите нам в службу поддержки.

.

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *