Telegram бот для туроператора, который помогает клиентам выбирать страны, получает информацию через AI и собирает заявки.
- 🌍 Просмотр доступных стран с описанием и ценами
- 📞 Заказ обратного звонка
- ❓ Справочная информация о туризме (визы, погода, транспорт)
- ✅ Создание заявок на подбор тура
- 📋 Просмотр всех заявок через команду
/show - 🔧 Управление AI промптом (
/showprompt,/editprompt) - 📊 Получение уведомлений о новых заявках
travelBot/
├── bot.py # Основной файл бота (handlers)
├── ai.py # Интеграция с Perplexity AI
├── supabase_client.py # Работа с Supabase (БД)
├── flows.py # Управление состояниями и тексты
├── keyboards.py # Клавиатуры (inline и reply)
├── .env # Токены и ключи
├── requirements.txt # Зависимости
└── README.md # Этот файл
pip install -r requirements.txtBOT_TOKEN=your_telegram_bot_token
SUPABASE_URL=your_supabase_url
SUPABASE_ANON_KEY=your_supabase_anon_key
PERPLEXITY_API_KEY=your_perplexity_api_key
ADMINS=123456789,987654321 # ID админов через запятуюCREATE TABLE countries (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
flag TEXT,
description TEXT,
price_from TEXT,
visa_info TEXT,
is_active BOOLEAN DEFAULT true,
created_at TIMESTAMP DEFAULT NOW()
);CREATE TABLE leads (
id SERIAL PRIMARY KEY,
telegram_id BIGINT,
name TEXT,
phone TEXT,
country_id INTEGER REFERENCES countries(id),
message TEXT,
clarification TEXT,
created_at TIMESTAMP DEFAULT NOW()
);CREATE TABLE settings (
id SERIAL PRIMARY KEY,
ai_prompt TEXT
);
INSERT INTO settings (id, ai_prompt) VALUES (1, '...');python3 bot.pyИли в фоновом режиме:
nohup python3 bot.py > bot.log 2>&1 &1. /start → Главное меню
├─ 🔍 Подобрать тур → Список стран
│ ├─ Выбор страны → Карточка страны
│ │ ├─ ✅ Хочу сюда! → Ввод телефона → Имя → Пожелания → Создание заявки
│ │ ├─ ❓ Узнать подробнее → AI отвечает об стране → Кнопки работают
│ │ └─ 🔙 Назад → Возврат к списку
│ └─ Пагинация (страницы со странами)
│
├─ 🌍 Страны → То же что "Подобрать тур"
│
├─ 📞 Перезвоните мне → Ввод телефона → Имя → Создание заявки
│
└─ ❓ Вопрос → Вопрос AI → Ответ (только про туризму) → Главное меню
/show- Показать все заявки (только админы)/admin- Последние 10 заявок/showprompt- Показать текущий AI промпт/editprompt Текст- Изменить AI промпт
-
Справка по туризму (
ask_question)- Отвечает на вопросы про визы, погоду, транспорт
temperature=0.0для строгости- Отказывается от подбора туров и нетуристических вопросов
-
Информация о странах (
get_country_info)- Рассказывает о стране (погода, виза, достопримечательности)
- Отвечает одним абзацем без заголовков
AI использует Markdown (**жирный**), бот конвертирует в HTML (<b>жирный</b>):
def _clean_answer(text: str) -> str:
# Убирает [1], [2] ссылки
# Конвертирует ** → <b>
# Конвертирует * → <i>Прямые HTTP запросы через httpx.AsyncClient:
# Создание лида
await sc.create_lead(
telegram_id=user_id,
name="Иван",
phone="+79001234567",
country_id=1,
message="Хочу на море в июле"
)
# Получение стран
countries = await sc.get_countries()
# Добавление уточнения
await sc.add_clarification(lead_id, "2 человека, без детей")-
Дублирование заявок
- Флаг
lead_createdустанавливается СРАЗУ после проверки - Кнопки удаляются мгновенно при клике
- Проверка флага идёт в начале callback handler
- Флаг
-
Callback timeout
- Увеличен timeout до 30 секунд для AI запросов
- Try-except на все
edit_text()иedit_reply_markup() - Если edit не удался → отправляем новое сообщение
-
Порядок handlers
- Сначала точное совпадение
F.data == "countries_list" - Потом
startswith("countries_")для пагинации
- Сначала точное совпадение
class State:
MENU = "menu" # Главное меню
WAITING_PHONE = "waiting_phone" # Ожидание телефона
WAITING_NAME = "waiting_name" # Ожидание имени
WAITING_WISHES = "waiting_wishes" # Ожидание пожеланий
WAITING_QUESTION = "waiting_question" # Вопрос AI
WAITING_CLARIFICATION = "waiting_clarification" # Уточнения
WAITING_CONFIRM = "waiting_confirm" # ПодтверждениеКоманда /show показывает:
- ID заявки
- Имя и телефон клиента
- Страну (с флагом)
- Пожелания
- Уточнения (если есть)
- Дату и время создания
Форматирование:
━━━━━━━━━━━━━━━━━━
🔹 Заявка #123
👤 Иван Иванов | 📞 +79001234567
🌍 🇹🇷 Турция
💭 Хочу на все включенно в июле
✏️ Уточнение: 2 человека, 1 ребёнок 7 лет
📅 2026-01-27 12:30
/showprompt- показать текущий промпт/editprompt Новый текст промпта- изменить
Промпт хранится в Supabase (settings.ai_prompt), можно менять на лету без перезапуска бота.
-
In-memory хранилище состояний
- При перезапуске бота состояния пользователей теряются
- Решение: подключить Redis для хранения сессий
-
AI может ошибаться
- Иногда даёт неточную информацию
- Решение: добавить vetifier или обновить данные
-
Нет валидации ввода
- Телефон проверяется только Telegram
- Имя и пожелания - любой текст
- Решение: добавить базовую валидацию
- ✅ История заявок для админа - фильтрация, поиск, экспорт в CSV
- ✅ Уведомления в канал - отправлять новые заявки в Telegram канал
- ✅ Изменение статуса заявки - "новая", "в работе", "закрыта"
- ✅ Комментарии к заявкам - админ может оставлять заметки
- ✅ Аналитика - статистика по странам, конверсия
- Умная сортировка стран - по цене, популярности, сезону
- Избранное - пользователь может сохранять страны
- История запросов - показывать предыдущие вопросы пользователя
- Рассылка - отправить спецпредложения всем пользователям
- QR-коды - генерация QR для контакта турфирмы
- Фотогалерея - показать несколько фото страны
- Voice сообщения - пользователь может голосом задать вопрос
- Геолокация - показать ближайший офис фирмы
- Калькулятор тура - примерный расчёт стоимости
- Интеграция с CRM - отправка заявки в AmoCRM, Bitrix
- Планировщик поездки - AI составляет маршрут по дням
- Мультиязычность - поддержка английского, узбекского и т.д.
- WebApp версия - мини-сайт внутри Telegram
- Payment integration - оплата тура прямо в боте
- AI-фото - генерация фото через Midjourney/DALL-E
- Новости - автоматический парсинг новостей о туризме
- Карточки туров - конкретные туры с датами и ценами
- Chat with agent - переключение на живого оператора
✅ Работает:
- Выбор стран с пагинацией
- Создание заявок (с защитой от дублей)
- AI справка (строго по туризму)
- Админ команды (/show, /admin, /showprompt, /editprompt)
- Кнопка "Назад" работает корректно
- Обработка callback timeout
🔄 В процессе:
- Оптимизация промптов AI
- Тестирование нагрузок
🐛 Баги:
- Нет критических багов на данный момент
- Admin check - все админ команды проверяют
user_id in ADMINS - SQL injection - не применимо (Supabase REST API)
- Rate limiting - можно добавить для защиты от спама
- Sanitization - AI ответы очищаются от HTML тегов (кроме разрешённых)
Для вопросов и предложений:
- Telegram: @your_username
- Email: your@email.com
Дата создания: Январь 2026 Версия: 1.0.0 Статус: Production Ready ✅