[Документация Yandex Cloud](../../../../index.md) > [Yandex SmartCaptcha](../../../index.md) > [Практические руководства](../../index.md) > Невидимая капча в приложении Android

# Невидимая SmartCaptcha в приложении на Android

# Невидимая Yandex SmartCaptcha в приложении на Android

Чтобы встроить [невидимую SmartCaptcha](../../../concepts/invisible-captcha.md) в приложение на Android:
1. [Создайте JavaScript Interface](#create-js-interface).
1. [Настройте WebView для работы с капчей](#customize-webview).
1. [Обработайте событие, при котором капча выдала пользователю задание](#user-task).
1. [Получите результат прохождения капчи](#get-result).

## Перед началом работы {#before-begin}

1. [Разместите HTML-код](../website.md) для работы [SmartCaptcha](../../../index.md) (или воспользуйтесь готовым `https://smartcaptcha.cloud.yandex.ru/webview`).
1. Создайте капчу по [инструкции](../../../operations/create-captcha.md).
1. [Получите ключи](../../../operations/get-keys.md) капчи. Скопируйте значения полей **Ключ клиента** и **Ключ сервера** на вкладке **Обзор** созданной вами капчи. **Ключ клиента** понадобится для загрузки страницы с капчей, **Ключ сервера** — для получения результата прохождения капчи.

## Создайте JavaScript Interface {#create-js-interface}

1. Создайте [класс](../../../concepts/js-interface.md), который будет принимать сообщения с помощью функции обратного вызова от веб-страницы с капчей.
1. Определите методы с аннотациями `@JavascriptInterface`:
   * `onGetToken(token: String)` — веб-страница возвращает токен прохождения капчи.
   * `onChallengeVisible()` — открытие всплывающего окна с заданием.
   * `onChallengeHidden()` — закрытие всплывающего окна с заданием.

   ```kotlin
   class WebJsInterface {

     @JavascriptInterface
     fun onGetToken(token: String) {
       //Ваш код.
     }

     @JavascriptInterface
     fun onChallengeVisible() {
       //Ваш код.
     }

     @JavascriptInterface
     fun onChallengeHidden() {
       //Ваш код.
     }
   }
   ```

## Настройте WebView для работы с капчей {#customize-webview}

1. Создайте **WebView** и добавьте его на экран.
1. Загрузите в **WebView** URL веб-страницы с капчей.
1. Вставьте в URL [query-параметры](../../../concepts/widget-methods.md#methods):

   ```kotlin
   val webView = findViewById<WebView>(R.id.webViewCaptcha)
   webView.loadUrl("URL_страницы_с_капчей?sitekey=<ключ_клиентской_части>&invisible=true")
   ```

   Где:
   * `sitekey` — ключ клиента, который вы получили ранее.
   * `invisible=true` — капча перейдет в невидимый режим работы.
1. Добавьте в **WebView** созданный JavaScript Interface. Укажите вторым параметром `NativeClient` — имя, на которое веб-страница будет отправлять сообщения с помощью функции обратного вызова:

   ```kotlin
   settings.javaScriptEnabled = true //Включает выполнение JavaScript.
   addJavascriptInterface(WebJsInterface(), "NativeClient")
   ```

## Обработайте событие, при котором капча выдала пользователю задание {#user-task}

1. Напишите логику появления **WebView** при помощи метода `onChallengeVisible()`. Он вызывается, когда капча показала задание. 

   >Пример реализации с переключением `visibility` — пока капча обрабатывала действие, **WebView** был в состоянии `View.GONE`:
   >
   >```kotlin
   >val webView = activity.findViewById<WebView>(R.id.webViewCaptcha)
   >webView.visibility = View.VISIBLE
   >```

1. Напишите логику для события, при котором пользователь не прошел задание и свернул его. Тогда будет вызван метод `onChallengeHidden()`, при помощи которого нужно убрать **WebView**.

   >Пример возвращения **WebView** к состоянию `View.GONE`:
   >
   >```kotlin
   >val webView = activity.findViewById<WebView>(R.id.webViewCaptcha)
   >webView.visibility = View.GONE
   >```

## Получите результат прохождения капчи {#get-result}

1. Сохраните токен прохождения капчи. Он вернется в методе `onGetToken(token: String)`, когда сервис обработает попытку.
1. Для проверки токена отправьте POST-запрос на адрес `https://smartcaptcha.cloud.yandex.ru/validate`, передав параметры в формате `x-www-form-urlencoded`:

   * `secret` — [ключ сервера](../../../concepts/keys.md);
   * `token` — одноразовый токен, полученный после прохождения проверки;
   * `ip` — IP-адрес пользователя, с которого пришел запрос на проверку токена. Этот параметр не обязателен, однако мы просим передавать IP-адрес пользователя при запросах. Это помогает улучшить качество работы SmartCaptcha.

   {% note info %}

   Данная логика должна выполняться на бэкенде. В само Android-приложение секретный ключ `secret` попасть не должен.

   {% endnote %}

   >Пример запроса:
   >
   >```text
   >https://smartcaptcha.cloud.yandex.ru/validate?secret=<ключ_сервера>&ip=<IP-адрес_пользователя>&token=<токен>
   >```

1. Получите [ответ с сервера](../../../concepts/validation.md). Он содержит JSON-объект с полями `status` и `message`.

   >Например:
   >* Это человек:
   >
   >  ```json
   >  {
   >    "status": "ok",
   >    "message": ""
   >  }
   >  ```
   >
   >* Это робот:
   >
   >  ```json
   >  {
   >    "status": "failed",
   >    "message": ""
   >  }
   >  ```

## Особенности {#specifics}

Невидимая капча требует меньше памяти, чем обычная — она не загружает код, который отрисовывает кнопку **Я не робот**.

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