Бот-асистент для запису на послуги в мобільному додатку
Запис на послуги через чат — це конкурент нативному календарю-пікеру. Щоб він працював краще за «виберіть дату на екрані», діалог повинен бути суттєво коротше: користувач описує бажаний час словами, бот пропонує підходящі слоти.
Розбір часових виразів
Головна технічна складність — розуміти довільні часові запити: «завтра після обіду», «у п'ятницю з ранку», «через тиждень, найкраще ввечері». Це завдання 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 тижні.







