Невидимая SmartCaptcha в приложении на Android
Чтобы встроить невидимую SmartCaptcha в приложение на Android:
- Создайте JavaScript Interface.
- Настройте WebView для работы с капчей.
- Обработайте событие, при котором капча выдала пользователю задание.
- Получите результат прохождения капчи.
Перед началом работы
- Разместите HTML-код для работы SmartCaptcha (или воспользуйтесь готовым
https://smartcaptcha.cloud.yandex.ru/webview). - Создайте капчу по инструкции.
- Получите ключи капчи. Скопируйте значения полей Ключ клиента и Ключ сервера на вкладке Обзор созданной вами капчи. Ключ клиента понадобится для загрузки страницы с капчей, Ключ сервера — для получения результата прохождения капчи.
Создайте JavaScript Interface
-
Создайте класс, который будет принимать сообщения с помощью функции обратного вызова от веб-страницы с капчей.
-
Определите методы с аннотациями
@JavascriptInterface:onGetToken(token: String)— веб-страница возвращает токен прохождения капчи.onChallengeVisible()— открытие всплывающего окна с заданием.onChallengeHidden()— закрытие всплывающего окна с заданием.
class WebJsInterface { @JavascriptInterface fun onGetToken(token: String) { //Ваш код. } @JavascriptInterface fun onChallengeVisible() { //Ваш код. } @JavascriptInterface fun onChallengeHidden() { //Ваш код. } }
Настройте WebView для работы с капчей
-
Создайте WebView и добавьте его на экран.
-
Загрузите в WebView URL веб-страницы с капчей.
-
Вставьте в URL query-параметры:
val webView = findViewById<WebView>(R.id.webViewCaptcha) webView.loadUrl("URL_страницы_с_капчей?sitekey=<ключ_клиентской_части>&invisible=true")Где:
sitekey— ключ клиента, который вы получили ранее.invisible=true— капча перейдет в невидимый режим работы.
-
Добавьте в WebView созданный JavaScript Interface. Укажите вторым параметром
NativeClient— имя, на которое веб-страница будет отправлять сообщения с помощью функции обратного вызова:settings.javaScriptEnabled = true //Включает выполнение JavaScript. addJavascriptInterface(WebJsInterface(), "NativeClient")
Обработайте событие, при котором капча выдала пользователю задание
-
Напишите логику появления WebView при помощи метода
onChallengeVisible(). Он вызывается, когда капча показала задание.Пример реализации с переключением
visibility— пока капча обрабатывала действие, WebView был в состоянииView.GONE:val webView = activity.findViewById<WebView>(R.id.webViewCaptcha) webView.visibility = View.VISIBLE -
Напишите логику для события, при котором пользователь не прошел задание и свернул его. Тогда будет вызван метод
onChallengeHidden(), при помощи которого нужно убрать WebView.Пример возвращения WebView к состоянию
View.GONE:val webView = activity.findViewById<WebView>(R.id.webViewCaptcha) webView.visibility = View.GONE
Получите результат прохождения капчи
-
Сохраните токен прохождения капчи. Он вернется в методе
onGetToken(token: String), когда сервис обработает попытку. -
Для проверки токена отправьте POST-запрос на адрес
https://smartcaptcha.cloud.yandex.ru/validate, передав параметры в форматеx-www-form-urlencoded:secret— ключ сервера;token— одноразовый токен, полученный после прохождения проверки;ip— IP-адрес пользователя, с которого пришел запрос на проверку токена. Этот параметр не обязателен, однако мы просим передавать IP-адрес пользователя при запросах. Это помогает улучшить качество работы SmartCaptcha.
Примечание
Данная логика должна выполняться на бэкенде. В само Android-приложение секретный ключ
secretпопасть не должен.Пример запроса:
https://smartcaptcha.cloud.yandex.ru/validate?secret=<ключ_сервера>&ip=<IP-адрес_пользователя>&token=<токен> -
Получите ответ с сервера. Он содержит JSON-объект с полями
statusиmessage.Например:
- Это человек:
{ "status": "ok", "message": "" }- Это робот:
{ "status": "failed", "message": "" }
Особенности
Невидимая капча требует меньше памяти, чем обычная — она не загружает код, который отрисовывает кнопку Я не робот.
Однако, у пользователей, которым будет показано задание, время загрузки виджета может варьироваться. Поэтому мы рекомендуем предупреждать пользователей о показе капчи, чтобы не вводить их в замешательство во время ожидания.