Невидимая Yandex SmartCaptcha в приложении на Android
Чтобы встроить невидимую SmartCaptcha в приложение на Android:
- Создайте JavaScript Interface.
- Настройте WebView для работы с капчей.
- Обработайте событие, при котором капча выдала пользователю задание.
- Получите результат прохождения капчи.
Перед началом работы
- Разместите HTML-код для работы SmartCaptcha (или воспользуйтесь готовым
https://smartcaptcha.yandexcloud.net/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.yandexcloud.net/validate
, передав параметры в форматеx-www-form-urlencoded
:secret
— ключ сервера;token
— одноразовый токен, полученный после прохождения проверки;ip
— IP-адрес пользователя, с которого пришел запрос на проверку токена. Этот параметр не обязателен, однако мы просим передавать IP-адрес пользователя при запросах. Это помогает улучшить качество работы SmartCaptcha.
Примечание
Данная логика должна выполняться на бэкенде. В само Android-приложение секретный ключ
secret
попасть не должен.Пример запроса:
https://smartcaptcha.yandexcloud.net/validate?secret=<ключ_сервера>&ip=<IP-адрес_пользователя>&token=<токен>
-
Получите ответ с сервера. Он содержит JSON-объект с полями
status
иmessage
.Например:
- Это человек:
{ "status": "ok", "message": "" }
- Это робот:
{ "status": "failed", "message": "" }
Особенности
Невидимая капча требует меньше памяти, чем обычная — она не загружает код, который отрисовывает кнопку Я не робот.
Однако, у пользователей, которым будет показано задание, время загрузки виджета может варьироваться. Поэтому мы рекомендуем предупреждать пользователей о показе капчи, чтобы не вводить их в замешательство во время ожидания.