# Урок 7: Регистрация в боте

В данном уроке вы узнаете как реализовать регистрацию и авторизацию в боте на платформе **Metabot**.

Мы создадим бот, который будет собирать данные пользователя и создавать для него персону. С помощью функционала персон он будет определять регистрировался пользователь в данном боте или нет. Уже зарегистрированные пользователи будут проходить через процесс авторизации.

<p class="callout info align-left">Подробнее изучить работу бота вы можете с помощью нашего примера — бота в Telegram: **[@RegistrationMetabot](https://t.me/RegistrationMetabot)**</p>

В этом уроке вы познакомитесь с таким функционалом платформы как **Персоны**.

<div class="pointer-container" id="bkmrk-%C2%A0"><div class="pointer anim is-page-editable"><svg class="svg-icon" data-icon="link" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg><div class="input-group inline block"> <button class="button outline icon" data-clipboard-target="#pointer-url" title="Копировать ссылку" type="button"><svg class="svg-icon" data-icon="copy" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></button></div><svg class="svg-icon" data-icon="edit" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></div></div><p class="callout info align-left">Перед началом следует ознакомиться с предыдущими уроками **[Hello Humans: ваше руководство по быстрому старту](https://docs.metabot24.ru/books/3-ucimsya-na-primerax/page/hello-humans-vase-rukovodstvo-po-bystromu-startu "Hello Humans: ваше руководство по быстрому старту")** и **[Metabot 101: Вывод фото в боте по REST API](https://docs.metabot24.ru/books/3-ucimsya-na-primerax/page/metabot-101-vyvod-foto-v-bote-po-rest-api "Metabot 101: Вывод фото в боте по REST API")**</p>

### Инструкция по разработке: Создание скриптов

**1.** Чтобы не отвлекаться на это в будущем, сразу создадим стартовый скрипт с приветствием, маршрут связанный с ним и канал Телеграм, при помощи которого будем тестировать бота, как мы делали это в предыдущих уроках.

Нам потребуются следующие скрипты:

- Стартовый скрипт;
- Меню;
- Fallback;
- Скрипт с выбором регистрации\\авторизации;
- Скрипты регистрации;
- Скрипты авторизации.

<div class="pointer-container" id="bkmrk-%C2%A0-0"><div class="pointer anim is-page-editable"><svg class="svg-icon" data-icon="link" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg><div class="input-group inline block"> <button class="button outline icon" data-clipboard-target="#pointer-url" title="Копировать ссылку" type="button"><svg class="svg-icon" data-icon="copy" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></button></div><svg class="svg-icon" data-icon="edit" role="presentation" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"></svg></div></div>Перейдем к их созданию.

#### Стартовый скрипт и скрипт с выбором регистрации\\авторизации

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

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2024-02/scaled-1680-/J5HCR8lFkefXXust-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2024-02/J5HCR8lFkefXXust-image.png)

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

**2.** Для данного скрипта нам нужно добавить команду **Отправить текст** с объяснением, что пользователю делать дальше, и две кнопки меню: одна с переходом к регистрации, другая с переходом к авторизации.

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2024-02/scaled-1680-/q8Y7FtsbGifDN8rj-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2024-02/q8Y7FtsbGifDN8rj-image.png)

#### Скрипт меню и Fallback

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

**3.** Мы рекомендуем создать в данном скрипте кнопку с выходом из аккаунта в **Скрипт с выбором**, чтобы пользователь мог зарегистрироваться в боте по другой почте.

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2024-02/scaled-1680-/DCGO3GwovAPaIuOO-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2024-02/DCGO3GwovAPaIuOO-image.png)

**Скрипт Fallback** — это скрипт<span data-offset-key="6b88a19e7b674019b68dc822e8a5448a:0">, который будет выполняться в том случае, если пользователь ввел вопрос/намерение или фразу не заложенные в базе знаний вашего бота</span>**.**

<span class="r-crgep1 r-b88u0q">**4.** В свойствах данного скрипта следует установить тип Fallback:</span>

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2024-02/scaled-1680-/qlnIl4EdrmZJh6ZC-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2024-02/qlnIl4EdrmZJh6ZC-image.png)

В данном уроке мы попробуем интересный способ реализации данного скрипта.

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2024-02/scaled-1680-/evbafWMNiVcZPHvN-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2024-02/evbafWMNiVcZPHvN-image.png)

При помощи JS скрипта можно сделать бота более живым и дать ему несколько вариантов ответа на нестандартную реакцию пользователя:

```JavaScript
var randomStrings = [
        "Извините, я Вас не понял. Следуйте указаниям меню.",
        "Попробуйте воспользоваться разделами меню.",
        "Можете выбрать один из предложенных вариантов ответов."
    ];

randomIndex = Math.ceil((Math.random()*randomStrings.length-1));

lead.setAttr('randomAnswer', randomStrings[randomIndex]);
```

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

**6.** Затем нужно добавить команду **Повторить вопрос**, чтобы бот мог вернуться к последнему сообщению отправленному пользователю перед переходом в данный скрипт.

Основные скрипты для работы бота созданы. Перейдем к созданию регистрации и авторизации.

### Скрипты регистрации

В процессе регистрации бот будет собирать данные у пользователя, затем проверять почту пользователя на занятость и создавать персону с собранными данными.

Нам потребуются следующие скрипты:

- Скрипты сбора данных;
- Скрипт проверки;
- Скрипт проверки почты;
- Скрипт "Почта занята";
- Создание персоны.

Перейдем к их созданию.

#### Скрипты сбора данных

Данные скрипты предназначены для того, чтобы узнать информацию о пользователе. Это может быть имя, дата рождения, пол и т.д.

**1.** В таком скрипте нужно создать команду **Запросить значение**, команду перехода на следующий скрипт и команду перехода на скрипт проверки.

Для примера разберем скрипт сбора информации об имени:

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2024-02/scaled-1680-/mZzDwzoBfwN8dhUZ-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2024-02/mZzDwzoBfwN8dhUZ-image.png)

1. Первым делом бот запрашивает имя пользователя.
2. Затем происходит проверка: если пользователь передумал и ввел одно из ключевых слов, указанных в условии, то регистрация прерывается и бот переходит к **Скрипту выбора**. Данную проверку можно добавлять после каждой команды **Запросить значение**.
3. Далее бот запрашивает фамилию пользователя и снова выполняет проверку.
4. Затем бот проверяет существует ли тег **исправление**. Если его нет, то происходит переход к следующему скрипту сбора данных.
5. Если же тег был найден, то бот переходит к скрипту проверки.

Проверка на прерывание регистрации:

```JavaScript
if (['отмена','назад','выход','стоп'].indexOf(lead.getAttr('lead_name').toLowerCase()) >= 0) {
return true;
}
```

Данные скрипты необязательны и их может быть как много, так и вообще не быть.

#### Скрипт проверки

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

**2.** В скрипте проверки нужно создать две команды: команду **Добавить тег исправление** и **Отправить текст** со всеми ранее собранными данными.

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2024-02/scaled-1680-/zk2yj5XjRU4JLiNs-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2024-02/zk2yj5XjRU4JLiNs-image.png)

**3.** Для всех данных нужно добавить в меню кнопку с переходом на скрипт запроса этих данных. Так же в меню должна быть кнопка перехода на скрипт ввода почты.

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2024-02/scaled-1680-/jcAmXmzgYkZR8wYY-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2024-02/jcAmXmzgYkZR8wYY-image.png)

#### Скрипт проверки почты

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

**4.** Первым делом нужно добавить команду **Удалить теги** и удалить тег **исправление**.

**5.** Затем запрашиваем почту у пользователя со следующим регулярным выражением: (отмена|\[^@\\s\]+@\[^@\\s\]+\\.\[^@\\s\]+).

**6.** Далее выполняем проверку на прерывание регистрации.

**7.** После этого создаем JS скрипт с проверкой на существование персоны с такой почтой и, в зависимости от ответа, выполняем скрипт завершения регистрации или **Почта занята**.

```JavaScript
//Проверяем есть ли зарегистрованная почта

let lead_email = lead.getAttr('lead_email');

let persons = bot.findPersons([["email", lead_email]]);

if (persons.length == 0){
    lead.setAttr('email', null);
}
```

Этот код ищет персону с заданным email в боте, и если не находит, то возвращает **null**.

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2024-02/scaled-1680-/3XQUoDuSdMHEtKe0-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2024-02/3XQUoDuSdMHEtKe0-image.png)

#### Скрипт "Почта занята"

**8.** Этот скрипт должен содержать всего две команды: отправка текста с оповещением и переход к скрипту запроса почты.

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2024-02/scaled-1680-/iMPJdNiUwhkcxFGS-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2024-02/iMPJdNiUwhkcxFGS-image.png)

#### Скрипт создания персоны

В данном скрипте происходит создание персоны с заданной почтой и переход к авторизации.

**9.** Для создания команды с созданием персоны используйте данный код:

```JavaScript
//Создаем для лида персону
lead.createPersonForCurrentLead({
  'is_external'         : 1,
  'firstname'           : lead.getAttr('lead_name'),
  'lastname'            : lead.getAttr('lead_surname'),
  'email'               : lead.getAttr('lead_email'),
  'comment'             : lead.getAttr('lead_birthday') + ', ' + lead.getAttr('lead_gender')
});
```

В этот скрипт так же можно добавить тег **зарегистрировался**.

**10.** Затем отправляем текст с оповещением пользователя о завершении регистрации и добавляем в меню кнопку с переходом к авторизации.

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2024-02/scaled-1680-/NJc9Mu9OoAMZ6xnA-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2024-02/NJc9Mu9OoAMZ6xnA-image.png)

### Скрипты авторизации

В процессе авторизации бот будет узнавать почту у пользователя, затем проверять ее на занятость и отправлять PIN на нее для авторизации.

Нам потребуются следующие скрипты:

- Скрипт запроса почты;
- Скрипт проверки почты;
- Скрипт отправки PIN;
- Скрипт ввода PIN;
- Скрипт проверки PIN.

Перейдем к их созданию.

#### Скрипт запроса почты

В этот скрипт пользователь попадает из **Скрипта выбора**.

Тут повторяются команды из скрипта запроса почты для регистрации.

**1.** Запрашиваем почту у пользователя со следующим регулярным выражением: (отмена|\[^@\\s\]+@\[^@\\s\]+\\.\[^@\\s\]+).

**2.** Далее выполняем проверку на прерывание регистрации.

**3.** Последней командой добавляем вывод почты для проверки пользователю.

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2024-02/scaled-1680-/haVhb6NYfbHwTiN4-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2024-02/haVhb6NYfbHwTiN4-image.png)

**5.** В меню данного скрипта добавляем кнопки перехода к следующему скрипту авторизации, замены почты и **Скрипту выбора**.

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2024-02/scaled-1680-/pDrJ2CUHTSQwoJay-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2024-02/pDrJ2CUHTSQwoJay-image.png)

<p class="callout info">Для исправления почты нужно добавить еще один скрипт, в котором будет находиться только команда перехода к скрипту ввода почты.</p>

#### Скрипт проверки почты

Данный скрипт так же повторяет команды регистрации.

**6.** Создаем JS скрипт с проверкой на существование персоны с такой почтой и, в зависимости от ответа, выполняем скрипт отправки PIN или запроса почты.

```JavaScript
//Проверяем есть ли зарегистрованная почта

let lead_email = lead.getAttr('lead_email');

let persons = bot.findPersons([["email", lead_email]]);

if (persons.length == 0){
    lead.setAttr('email', null);
}
```

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2024-02/scaled-1680-/RcIxGgMwCMq2Zqkh-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2024-02/RcIxGgMwCMq2Zqkh-image.png)

#### Скрипт отправки PIN

**7.** В данном скрипте следует создать генератор PIN-кода и команду отправки письма на почту.

```JavaScript
//Генерируем временный пароль------------------------------------------------------------

let password = String(Math.floor(Math.random() * (100000 - 10000 + 1) + 10000));

//---------------------------------------------------------------------------------------

lead.setAttr('password', password);
```

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2024-02/scaled-1680-/AJ0NIy4dKSsPgDSg-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2024-02/AJ0NIy4dKSsPgDSg-image.png)

**8.** В меню добавляем кнопки перехода к следующему скрипту авторизации, повторной отправки PIN и **Скрипту выбора**.

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2024-02/scaled-1680-/QWOMFPdfjb4yJ5JD-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2024-02/QWOMFPdfjb4yJ5JD-image.png)

<p class="callout info">Для повторной отправки PIN нужно добавить еще один скрипт, в котором будет находиться только команда перехода к скрипту отправки PIN.</p>

#### Скрипт ввода PIN

**9.** В данном скрипте нужны команды запроса PIN и перехода к скрипту проверки PIN.

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2024-02/scaled-1680-/RYrIO8MfVlAMRRaV-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2024-02/RYrIO8MfVlAMRRaV-image.png)

#### Скрипт проверки PIN и "Неверный PIN"

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

**10.** Для проверки добавляем команду с условием при выполнении которого будет вызываться скрипт "Неверный PIN".

Можно так же добавить тег **авторизовался**.

**11.** Последним делом добавляем команду перехода в меню.

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2024-02/scaled-1680-/v5aK01JKHrzkOd3Y-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2024-02/v5aK01JKHrzkOd3Y-image.png)

**12.** В скрипте "Неверный PIN" добавляем команду отправки текста с оповещением о неправильном PIN-коде.

**13.** В меню добавляем следующие кнопки:

- Запрос PIN;
- Отправка PIN;
- Запрос почты;
- Скрипт выбора регистрации\\авторизации.

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2024-02/scaled-1680-/PBZQzQ1tYgAFx3Me-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2024-02/PBZQzQ1tYgAFx3Me-image.png)

Бот завершен! Теперь при регистрации в нем на вкладке **Персоны** платформы будут создаваться персоны:

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2024-02/scaled-1680-/K07IK21hIc1yAUUt-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2024-02/K07IK21hIc1yAUUt-image.png)

Поздравляем вас с прохождением урока!