Реализация бота-ассистента для записи на услуги в мобильном приложении
Запись на услуги через чат — это конкурент нативному календарю-пикеру. Чтобы она работала лучше, чем «выберите дату на экране», диалог должен быть существенно короче: пользователь описывает желаемое время словами, бот предлагает подходящие слоты.
Разбор временных выражений
Главная техническая сложность — понимать произвольные временные запросы: «завтра после обеда», «в пятницу с утра», «через неделю, желательно вечером». Это задача NLP.
Для русского языка Natasha (Python-библиотека) хорошо извлекает даты и времена из неструктурированного текста:
from natasha import Segmenter, MorphVocab, NewsEmbedding, NewsDatesExtractor
segmenter = Segmenter()
morph_vocab = MorphVocab()
emb = NewsEmbedding()
dates_extractor = NewsDatesExtractor(morph_vocab)
text = "запишите меня на следующую пятницу в 15:00"
for match in dates_extractor(text):
print(match.fact) # DateFact(year=2024, month=1, day=19, hour=15, minute=0)
Если используете Dialogflow — там есть встроенные системные сущности @sys.date, @sys.time, @sys.date-time, которые работают для русского. Для Rasa — duckling extractor, запущенный как отдельный HTTP-сервис.
После разбора времени: запросить свободные слоты из системы записи, предложить ближайшие к запрошенному времени.
Интеграция с системой записи
Бот работает через API scheduling-системы. Популярные варианты в СНГ: 1С:Предприятие (медицина, сервисы), YCLIENTS (красота), Calendly API, Google Calendar API, собственные системы.
Для Google Calendar:
const { google } = require('googleapis');
const calendar = google.calendar({ version: 'v3', auth });
async function getAvailableSlots(serviceId, date) {
const freebusy = await calendar.freebusy.query({
requestBody: {
timeMin: dayjs(date).startOf('day').toISOString(),
timeMax: dayjs(date).endOf('day').toISOString(),
items: [{ id: serviceCalendarId }]
}
});
// Вычисляем свободные слоты между занятыми
const busySlots = freebusy.data.calendars[serviceCalendarId].busy;
return computeFreeSlots(busySlots, workingHours, serviceDuration);
}
Важно обрабатывать race condition: слот занят между тем, как бот его предложил, и тем, как пользователь подтвердил. Решение — двухфазное бронирование: временная резервация на 3–5 минут при показе слота, подтверждение при согласии.
UI бота для записи
Текстовый диалог дополняется inline-компонентами:
Горизонтальный скролл с датами — когда пользователь не указал конкретную дату, показываем ближайшие 7 дней как чипы. Тап на дате — запрос слотов для этого дня.
Сетка времени — свободные слоты отображаем кнопками в сетке, занятые — неактивными. На Android это FlexboxLayout с динамически добавляемыми кнопками-чипами. На iOS — UICollectionView с compositional layout.
Карточка подтверждения — мастер, услуга, дата/время, длительность. Кнопки «Подтвердить» и «Изменить».
Напоминания
После успешной записи бот планирует напоминание. Варианты:
- Push-уведомление за 24 часа и за 2 часа — через FCM/APNs
- SMS через Twilio или SMS.ru — для тех, кто отключил пуши
- Добавление в системный календарь устройства —
EventKitна iOS,CalendarContractна Android
Пользователь выбирает способ при подтверждении записи.
Процесс работы
Анализ целевой scheduling-системы, документация её API.
Разработка NLP-логики разбора времени и слотов.
Серверная часть: state machine диалога, интеграция с calendar/booking API, резервирование слотов.
Мобильный UI: inline-компоненты выбора даты/времени, карточка подтверждения.
Тестирование с реальными граничными случаями: все слоты заняты, рабочие/нерабочие дни, переход через полночь.
Ориентиры по срокам
Бот записи с базовым NLP и Google Calendar API + мобильный UI — 1–2 недели. С кастомной scheduling-системой, несколькими мастерами/услугами, SMS-напоминаниями — 3–4 недели.







