Обновлено: сентябрь 2026
Как сделать телеграм-бота для записи клиентов
Разбираем оба реальных способа — свой бот через официальный BotFather и no-code конструктор — и что нужно учесть, чтобы бот реально принимал записи, а не просто отвечал на /start.
Способ 1: свой бот через BotFather
- Откройте @BotFather — официального бота Telegram для создания ботов — и отправьте команду
/newbot. - Придумайте имя и техническое имя бота — оно обязательно заканчивается на
bot, напримерmy_salon_bot. - BotFather выдаст токен API — это ключ доступа к вашему боту, храните его в секрете.
- Напишите логику бота на любом языке с библиотекой вроде python-telegram-bot (Python) или Telegraf (Node.js) — полный список методов есть в официальной документации Bot API. Бот должен показывать услуги, свободные окна и сохранять записи.
- Разверните бота на сервере или хостинге, чтобы он работал круглосуточно, а не только пока запущен у вас на компьютере.
Минимальный каркас на Python выглядит так:
from telegram import Update
from telegram.ext import Application, CommandHandler, ContextTypes
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text(
"Привет! Свободные окна на завтра: 10:00, 14:00, 16:30"
)
app = Application.builder().token("ВАШ_ТОКЕН").build()
app.add_handler(CommandHandler("start", start))
app.run_polling() Это уже отвечающий бот — но пока без выбора услуги, реального расписания, хранения записей и напоминаний. Их придётся программировать отдельно.
«/start ответил» — это лёгкая часть. Чтобы бот реально принимал записи, ему ещё нужны: защита от двойной записи на одно окно, напоминания клиентам, хранение расписания и истории записей. Это уже полноценная разработка, а не вечер выходного дня.
Как выглядит запись, а не «привет»
Разница между отвечающим ботом и принимающим записи — в кнопках и в том, что происходит после нажатия. Минимальная версия с выбором окна:
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import (Application, CommandHandler,
CallbackQueryHandler, ContextTypes)
SLOTS = ["10:00", "14:00", "16:30"]
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
keyboard = [[InlineKeyboardButton(t, callback_data=f"slot:{t}")]
for t in SLOTS]
await update.message.reply_text(
"Свободные окна на завтра:",
reply_markup=InlineKeyboardMarkup(keyboard),
)
async def pick(update: Update, context: ContextTypes.DEFAULT_TYPE):
query = update.callback_query
await query.answer() # без этого у клиента крутится индикатор
slot = query.data.removeprefix("slot:")
if not book(query.from_user.id, slot): # book() обязан быть атомарным
await query.edit_message_text(f"{slot} уже заняли, выберите другое")
return
await query.edit_message_text(f"Записала на {slot}")
app = Application.builder().token("ВАШ_ТОКЕН").build()
app.add_handler(CommandHandler("start", start))
app.add_handler(CallbackQueryHandler(pick, pattern=r"^slot:"))
app.run_polling() Здесь уже видно, где начинается настоящая работа: список окон захардкожен, а book() не написан — и именно он окажется самой сложной функцией во всём боте.
Polling или webhook
run_polling() из примера сам ходит за обновлениями и работает откуда угодно, включая ноутбук без домена. Этого достаточно, чтобы попробовать, но не чтобы принимать записи круглосуточно.
Второй режим — webhook: Telegram сам отправляет обновления на ваш адрес. Требования из документации метода setWebhook:
- адрес по HTTPS на одном из портов 443, 80, 88 или 8443 — других вариантов нет;
- сертификат может быть самоподписанным, если загрузить публичный ключ параметром
certificate; secret_tokenдлиной 1–256 символов: Telegram кладёт его в заголовокX-Telegram-Bot-Api-Secret-Token. Без проверки этого заголовка чужой POST на ваш адрес неотличим от настоящего обновления;max_connections— по умолчанию 40, допустимый диапазон 1–100.
Сервер нужен в обоих случаях. Разница в том, кто инициирует обмен: при polling ваш процесс постоянно опрашивает Telegram, при webhook Telegram стучится к вам — меньше пустых запросов и меньше задержка, но нужен доступный извне адрес.
Способ 2: конструктор без кода
Если писать код не хочется, есть конструкторы ботов с визуальным редактором сценариев — диалог собирается из блоков («сообщение» → «кнопки» → «сохранить ответ») без единой строчки кода. Такие сервисы обычно берут абонентскую плату и подходят, если нужен не только бот для записи, а что-то более универсальное — рассылки, воронки, интеграции с другими сервисами.
Что учесть до запуска
- Защита от двойной записи на одно и то же окно
- Напоминания клиентам, чтобы не забыли прийти
- Как клиент увидит цены и свободное время без переписки с вами
- Что происходит, если клиент отменит запись в последний момент
- Как принимать предоплату, если она нужна
Три места, где самописный бот ломается первыми
Двойная запись. Проверка «окно свободно?» и сама запись — это две операции, и между ними успевает пройти второй клиент: обе записи проходят успешно, а прийти к вам в 14:00 собираются двое. Флаг в памяти процесса не спасает — обновления обрабатываются параллельно, а после перезапуска флаг обнуляется. Держит только ограничение уникальности на стороне базы (одна запись на пару «мастер + время»), где ошибка вставки и означает «занято».
Напоминания. У бота нет собственного расписания: Bot API отвечает на обновления, а не будит вас в нужный час. Напоминание за день — это отдельный процесс, который просыпается по времени, выбирает завтрашние записи и рассылает сообщения. И когда он выстрелит, упрётся в лимиты Telegram: в один чат рекомендовано не чаще одного сообщения в секунду, в группу — не больше 20 сообщений в минуту, а массовая рассылка ограничена примерно 30 сообщениями в секунду.
Жизнь процесса. Бот, запущенный из терминала, умирает вместе с закрытым ноутбуком, а вместе с ним пропадает и запись, которую клиент делал в этот момент. Нужен сервер, автозапуск после перезагрузки и понимание, что произойдёт с обновлениями, пришедшими за время простоя.
Если не хочется собирать всё это самому
У Mira уже есть готовый бот для записи бьюти-мастеров: свободные окошки, напоминания клиентам, защита от двойной записи и приём предоплаты — всё внутри Telegram, без кода.
Год бесплатно по промокоду MIRA2026 — без банковской карты. Код можно ввести при регистрации или позже в кабинете, в разделе Premium.