# Использование SDK

### getInstance()

Чтобы использовать **BotProtection**, достаточно создать экземпляр класса `BotProtection`:

```kotlin
val botProtection = BotProtection.getInstance()
```

### start()

Чтобы начать сбор данных для идентификации ботов и отправки их на сервер, вам нужно вызвать функцию `start()`.

Пример метода `start()`, при котором BotProtection SDK активируется и начинает собирать данные в момент запуска приложения:

```java
 class ApplicationExample: Application() {

    val botProtection by lazy {
        BotProtection.getInstance()
    }
    
    override fun onCreate() {
        super.onCreate()
        
        botProtection
            .sendUUID("uuid")
            .start()
    }
    
    // ...
}
```

Сначала необходимо создать экземпляр `BotProtection`:

```kotlin
val botProtection by lazy {
    BotProtection.getInstance()
}
```

Чтобы начать сбор данных, используйте:

```kotlin
botProtection
    .sendUUID("uuid")
    .start()
```

BotProtection собирает данные до тех пор, пока не произойдет метод `stop()`.

### sendUUID()

Метод `sendUUID` принимает значение типа String.

**UUID** - это уникальный идентификатор пользователя, который позволяет соотносить пользователей с анонимными проанализированными пользователями в системе.

**UUID** может генерироваться независимо или отправлять зашифрованный идентификатор, связанный с пользователем.

Примечание: Этот метод необходимо вызывать в момент входа пользователя в учетную запись и перед вызовом метода `stop()`, который полностью остановит SDK.

```kotlin
botProtection.sendUUID("uuid")
```

Если UUID известен во время выполнения `start()`, вы можете запустить библиотеку следующим образом, сначала сообщив UUID:

```kotlin
botProtection
    .sendUUID("uuid")
    .start()
```

### stop()

Метод `stop()` следует вызывать, если необходимо полностью остановить сбор данных, отключить BotProtection и немедленно отправить данные на сервер.

Примечание: Чтобы снова начать сбор данных и отправку их на анализ, необходимо вызвать `start()`.

```kotlin
 botProtection
   .setMode(Mode.NO_TOKEN) \\ or Mode.WITH_TOKEN
   .setListener(botProtectionListener)
   .stop()
```

| Команда     | Результат                                                                                                                                                                                                  |
| ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| NO\_TOKEN   | <p>Включается режим NO\_TOKEN, который отправляет данные на BotProtection machine и останавливает библиотеку. </p><p>Этот режим полезен, когда вам нужно проанализировать трафик из вашего приложения.</p> |
| WITH\_TOKEN | <p>Полезно, когда токен JWT планируется передать бэкенду для активной защиты от ботов.</p><p>Например, такой подход используется используется в процессе создания нового пользователя на клиенте.</p>      |

### setListener()

Чтобы получить результаты анализа поведения BotProtection, вы можете использовать функцию обратного вызова `BotProtectionListener`. Этот метод работает так же, как обычный `start()`.

```kotlin
.setListener(object : BotProtectionListener {
    override fun onSuccess(botProtectionResult: BotProtectionResult) {
		    Log.i(TAG, "challengeId: ${botProtectionResult.challengeId}, "
		            + "token: ${botProtectionResult.token}")
    }

    override fun onError(result: BotProtectionError) {
        Log.e(TAG, botProtectionError.name)
    }
})
```

| Команда       | Описание                                                                                                                                                                              |
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `challengeId` | Уникальный идентификатор для подтверждения пользователя, который можно отправить на сервер для получения результатов (не обязательно, поскольку вы можете получить результат по UUID) |
| `token`       | Принимается, если используется режим `WITH_TOKEN`. Используется для активного препятствия ботам                                                                                       |

В **BotProtectionResult** присутствует два метода `getChallengeId()` и`getToken()` необходимых для получения информации из проверки.

> `getToken()` возвращает значение только при режиме **`WITH_TOKEN`**

В **BotProtectionError** может содержать следующие значения:

| **Значение**                     | **Описание**                                                |
| -------------------------------- | ----------------------------------------------------------- |
| **CONNECTION\_ERROR**            | Ошибка подключения                                          |
| **INVALID\_DATA**                | Ошибка обработки данных                                     |
| **BP\_KEY\_NAME\_NOT\_FOUND**    | ApiKey не найден в метаданных                               |
| **BP\_KEY\_NAME\_NULL\_POINTER** | ApiKey равен NULL                                           |
| **BP\_KEY\_INCORRECT**           | ApiKey неправильно записан, скопируйте его снова из консоли |
| **UNKNOWN**                      | Неизвестная ошибка                                          |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.mobguards.com/ru/android-usage/sdk-usage-kotlin.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
