Лендвис

Telegram-бот для сферы услуг · aiogram 3

Бот, который сам
ведёт запись клиентов

Клиент выбирает услугу и свободное время прямо в переписке, бот напоминает о визите, а владелец видит расписание и выручку в той же Telegram. Ниже — работающая имитация: запишитесь, и панель администратора пересчитает цифры на глазах.

Карта диалога

нажмите узел
Салон · бот записи
/start

Почему «свободно в 15:00» — это не так просто

Наивный бот показывает все получасовые интервалы подряд. Наш считает, влезает ли услуга целиком: окрашивание на два с половиной часа закрывает пять соседних слотов и не может начаться в 18:30, потому что салон работает до 20:00. Выберите услугу и кликните свободное время — увидите, как схлопывается сетка.

Свободное время

свободно займёт выбранная услуга уже занято

Панель администратора — в самом боте

Владельцу не нужна отдельная админка в браузере: расписание на сегодня, выручка, конверсия и топ услуг приходят командой /admin прямо в Telegram. Цифры ниже живые — они меняются, когда вы записываетесь выше.

Записи на сегодня

Топ услуг за 30 дней

Что внутри

Продукт, а не набор кнопок: данные в базе, защита от гонок, фоновые напоминания и работа под нагрузкой чата.

Два клиента, один слот

Если двое подтверждают одно время одновременно, второму не достаётся «дубль»: в базе стоит частичный уникальный индекс на активные записи, и бот честно говорит, что время только что заняли, возвращая к выбору.

Напоминания без дублей

Планировщик раз в пять минут находит визиты через сутки и через два часа и отмечает отправленное флагом — перезапуск бота не приводит к двойным сообщениям клиенту.

Отмена по правилам

Клиент отменяет визит сам, но не позже чем за CANCEL_DEADLINE_HOURS часов. Позже — бот объясняет правило и предлагает связаться, а слот не освобождается втихую.

Рассылка, которая не банит бота

Сообщения уходят с паузой между отправками, заблокировавшие бота помечаются в базе и исключаются из следующих рассылок. В отчёте — доставлено, заблокировано, ошибки.

Прайс правит владелец

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

Защита от флуда

Middleware пропускает не чаще одного действия в THROTTLE_SECONDS от пользователя, поэтому «дребезг» по кнопкам не превращается в шквал запросов к базе.

Стек и запуск

aiogram 3, SQLAlchemy 2 с SQLite, APScheduler, Docker. Тесты не требуют ни сети, ни токена.

git clone https://github.com/lendvis/python-faq-bot
cd python-faq-bot
cp .env.example .env          # BOT_TOKEN, ADMIN_IDS, MANAGER_CHAT_ID
docker compose up -d --build

# или без докера
python3 -m venv venv && source venv/bin/activate
pip install -r requirements.txt
python -m bot

# 109 тестов, без сети и токена
pytest