Сделаем чатбота, который будет уметь бронировать места. Для примера возьмем бронирование столиков. Бот будет уметь принимать дату и время, показывать свободные столики на указанную дату, давать пользователю выбрать нужный столик, записывать пользователя в базу данных.

Вы всегда можете найти шаблон этого сценария на экране создания сценариев.

Сценарий



Как это работает

Создаем первый экран. Добавляем блок Текст с приветствием и просьбой ввести дату и время. Ниже добавляем блок Интенты, и добавим нашу системную сущность $DATETIME.

В дальнейшем вы можете дополнить прием даты и времени согласно данной инструкции. А пока же нам хватит и этого. Бот будет принимать такие значения, как "20 января 13:00".



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



Вы можете скопировать эту таблицу.

Первый столбец таблицы — время (time), далее название столика (table), номер столика (number), номер строки (num) - будет нужен при записи данных в нашу таблицу, дата.

Теперь, когда у нас есть готовая таблица, нам нужно к ней обратиться. Чтобы получать данные оттуда, воспользуемся нашим сервисом. Обратите внимание, что мы публикуем только 1 лист. В итоге получится урл такого вида:

https://tools.aimylogic.com/api/csv2json?url=https%3A%2F%2Fdocs.google.com%2Fspreadsheets%2Fd%2Fe%2F2PACX-1vT7n6-f8i4fD0Dlithvh06d5UsffCrZ6fl8O4CE_UVYPxN3rMy2NJkwRlllDs2g3IhsfCV3cY270H4k%2Fpub%3Fgid%3D0%26single%3Dtrue%26output%3Dcsv

От сущности $DATETIME делаем новый экран с блоком Http-запрос и вставляем туда наш урл. Выглядеть запрос будет так. Под изображением вы найдете описание запроса, которое можете скопировать.



Разберем переменные, которые мы создаем в http-запросе на вкладке Response:
time

$DATETIME.hour + ":" + "00" - берем из DATETIME только часы и прибавляем строку "00", чтобы часы соответствовали формату, который у нас в таблице;

result

_.where($httpResponse, {"time": $time}) - метод из underscorejs;

index

0 - нужен для прохода по всем элементам массива в дальнейшем;

day

$DATETIME.day < 10 ? "0" + $DATETIME.day : $DATETIME.day - пишем условие: если день меньше 10, то прибавляем к дню 0, чтобы формат дня был таким, как в нашей таблице, иначе оставляем день таким, какой пришел;

month

$DATETIME.month < 10 ? "0" + $DATETIME.month : $DATETIME.month - то же самое, что и с переменной $day, только месяц;

date

$day + "." + $month - формируем дату, складываем день и месяц.

Далее от блока Http-запрос завершен успешно создаем блок Условие, в нём пишем:
_.property($date)($result[$index]) === false



_.property - возвращает функцию, которая вернёт ключ key любого переданного ей объекта. Тут мы берем первый элемент массива $result[$index] и проверяем дату $date. Если ячейка в нашей таблице пустая, функция должна вернуть false.

От этого условия создаем новый экран с блоком Текст. Если условие сработает, мы можем вывести номер столика и время:

Столик: $result[$index].table
Время: $result[$index].time




На этот же экран добавляем блок Переход:



От блока Переход создаем новый экран с блоком Условие. В этом условии мы увеличим нашу переменную $index на 1. Тем самым мы сможем взять следующий элемент массива:
$index = $index + 1



После того как мы увеличили $index, нужно проверить, есть ли в нашем массиве элемент под таким индексом. Поэтому снова создаем Условие и пишем:
$index < $result.length



Если условие сработает, то делаем переход на экран, где мы проверяли свободную дату.



Теперь у нас получился цикл. Сделаем связь от else в блоке Условие. То есть, если такая дата и время заняты, берем следующий элемент для проверки.



Также делаем связь от данного условия, если массив закончился и больше нет элементов. От else создаем блок Текст, в нём пишем:

Введите номер столика, который желаете забронировать.

Добавьте на этот экран блок Интенты и впишите интент:

$NUMBER



Добавляем кнопку Выбрать другое время.

Далее, от системной сущности $NUMBER делаем связь на новый экран с блоком Условие:

$res = _.findWhere($result, {"number":$NUMBER})



Тут мы по номеру, который ввел пользователь, проверяем, есть ли такой столик. Если пользователь ввел номер столика, которого нет в списке, то вернем его на предыдущий экран.



Если же такой номер есть, то сделаем новый экран на котором выведем пользователю информацию перед бронированием. Добавляем блок Текст:

Столик $res.table на $date в $res.time. Бронируем?



Также добавим кнопки:



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

От кнопки Бронировать создаем новый экран с блоком Текст, в котором попросим пользователя оставить номер телефона и имя.

Добавим блок Интенты* и добавим интент:

* $NAME $PHONE *
и пример:

* $NAME $PHONE *



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

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



Снова публикуем эту страницу с помощью нашего сервиса.

Теперь мы можем по дате получить нужный адрес.

Делаем блок Http-запрос от интента $NAME $PHONE. Запрос выглядит так:



Тут мы создали две переменные:

letter

$httpResponse[0][$date]
- берем первый элемент массива, а он у нас всего один, и ищем по ключу букву, ключ у нас дата.

cell

$letter + $res.num - склеиваем строку, наша буква, которую мы получили в переменной $letter и номер строки, num - это столбец из нашей первоначальной строки.

Теперь у нас есть адрес ячейки.

Дальше, нам нужно оформить запись в ячейку.

От http-запроса Завершен успешно делаем новый http-запрос, в котором отправляем значение true в нужную ячейку. Это будет значить, что на эту дату столик будет занят. Чтобы отправить данные в нужную ячейку, нужно создать апплет через IFTTT.

Вам нужно пройти шаги, которые описаны в этой инструкции до шага 9. На шаге 9 у вас должны быть такие настройки:



В итоге настройки апплета будут выглядеть так:

Drive folder path - укажите папку на вашем гугл диске
Например, можете в корне гугл диска создать папку под названием "Work" и тогда в поле Drive folder path вам нужно просто указать Work.
Spreadsheet name - переместите в созданную папку на гугл диске гугл-таблицу, которую вы заполняли в этом уроке. Укажите в поле Spreadsheet name название таблицы.
Which cell? - Value1



Value - Value2





После этого перейдите на https://ifttt.com/maker_webhooks, нажмите Documentaion и заполните эту ячейку названием ивента:



Чтобы протестировать, вы можете в поле value1 ввести значение ячейки какой-нибудь не отмеченной флажком ячейки, например, E2.



В value2 напишите:

true



И нажмите Test It.

После этого в соответствующей ячейке должна появиться галочка:



И скопируйте получившуюся ссылку:



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

метод POST

URL - полученная выше ссылка

BODY:

{
"value1": "$cell",
"value2": "true"
}




То есть, отправляем в определенную ячейку значение true.

От данного запроса делаем еще один http-запрос.

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

И сделаем новый апплет через ifttt по данной инструкции - теперь нам нужно не добавлять запись в ячейку, а добавлять в таблицу новую строку.

Запрос выглядит так:

метод POST
URL - получайте во время выполнения инструкции по созданию апплета IFTTT

BODY:

{
"value1": "$NAME.name",
"value2": "$PHONE",
"value3": "$cell"
}




То есть, тут мы отправим имя, номер телефона и адрес ячейки нашей основной таблицы. Новая таблица будет выглядеть так:



От этого запроса Завершен успешно делаем новый экран с блоком Текст, в котором пишем пользователю информацию о том, что бронирование успешно выполнено.



На этом все, бот готов!

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

Была ли эта статья полезна?
отменить
Спасибо!