Телеграм-бот для навигации по кампусам Московского Политехнического Университета
МосПолиХелпер — это практическое решение реальной проблемы ориентирования в кампусах Московского Политехнического Университета. Бот разработан студентами для студентов и предоставляет интерактивные видео-маршруты до любого кабинета в пяти основных кампусах университета.
Проект создан в рамках проектной практики и демонстрирует применение современных технологий для решения повседневных задач студенческой жизни.
- 🗺️ Интерактивная навигация по 5 кампусам МосПолитеха
- 🎥 Динамические видео-маршруты от входа на территорию или от входа в корпус
- ⚡ Мгновенная отдача готовых маршрутов благодаря интеллектуальному кешированию
- 📱 Интуитивный интерфейс с адаптивными inline-кнопками
- 🔄 Автоматическая обработка видео с оптимизацией для Telegram (H.264, битрейт 1500k)
- 🚀 Высокая производительность — время отклика менее 5 секунд для кешированных маршрутов
- 📊 Умная валидация входных данных с подсказками пользователю
Кампус | Код | Формат номера кабинета | Пример |
---|---|---|---|
Большая Семёновская | bs |
[корпус][этаж]-[номер] | а1-01 , б2-15 |
Павла Корчагина | pk |
пк[корпус][этаж][номер] | пк1201 , пк2315 |
Прянишникова | pr |
пр[корпус][этаж][номер] | пр1101 , пр2208 |
Михалковская | mi |
м[корпус][этаж][номер] | м1205 , м3110 |
Автозаводская | av |
ав[корпус][этаж][номер] | ав2301 , ав1105 |
📝 Важно: Указывайте номер кабинета точно в том формате, как он указан в личном кабинете или расписании
/start
— Приветствие и инструкции/help
— Справка по командам/route
— Построить маршрут до кабинета
- Запустите бота командой
/start
- Выберите команду
/route
- Укажите кампус из предложенного списка
- Введите номер кабинета в точном формате
- Выберите тип маршрута (от территории или от входа в корпус)
- Получите видео с маршрутом
Компонент | Технология | Версия | Назначение |
---|---|---|---|
Backend | Python | 3.10+ | Основной язык разработки |
Bot Framework | Aiogram | 3.0.0 | Асинхронная работа с Telegram Bot API |
Video Processing | MoviePy | 1.0.3 | Обработка и монтаж видеофрагментов |
Video Encoding | FFmpeg | latest | Кодирование и оптимизация видео |
Data Storage | JSON | native | Хранение пользовательских сессий |
State Management | MemoryStorage | aiogram | Управление состояниями пользователей |
src/code/
├── bot.py # 🚀 Точка входа и координация приложения
├── config.py # ⚙️ Конфигурационные параметры
├── database.py # 💾 Управление пользовательскими данными
├── handlers.py # 🎛️ Обработчики команд и callback'ов
├── init.py # 🔧 Инициализация компонентов бота
├── scripts.py # 🎬 Обработка видео и формирование маршрутов
└── combine.py # 🔄 Утилита для предварительной генерации кеша
Принципы проектирования:
- Single Responsibility — каждый модуль отвечает за конкретную задачу
- Dependency Injection — слабая связанность между компонентами
- Async/Await — асинхронная обработка для высокой производительности
- Error Handling — корректная обработка ошибок на всех уровнях
📦 mospoly-helper/
├── 📂 src/code/ # Исходный код
├── 📂 data/ # Рабочие данные
│ ├── 📂 cache/ # Сгенерированные видеомаршруты
│ │ ├── 📄 *-all.mp4 # Полные маршруты (от территории)
│ │ └── 📄 *-small.mp4 # Короткие маршруты (от входа в корпус)
│ ├── 📂 users/ # JSON-файлы сессий пользователей
│ │ └── 📄 {user_id}.json # Данные конкретного пользователя
│ └── 📂 videos/ # Библиотека исходных видеофрагментов
│ ├── 📂 av/ # Автозаводская
│ │ ├── 📂 buildings/ # Видео от входа до корпуса
│ │ ├── 📂 floors/ # Видео по этажам
│ │ └── 📂 offices/ # Видео до конкретных кабинетов
│ ├── 📂 bs/ # Большая Семёновская
│ ├── 📂 mi/ # Михалковская
│ ├── 📂 pk/ # Павла Корчагина
│ └── 📂 pr/ # Прянишникова
└── 📂 logs/ # Журналы работы (рекомендуется)
- OS: Linux (Ubuntu 20.04+), macOS, Windows 10+
- Python: 3.10 или выше
- RAM: минимум 2 ГБ (рекомендуется 4 ГБ)
- Storage: минимум 10 ГБ для видеофрагментов и кеша
- Network: стабильное интернет-соединение
- Клонирование репозитория
git clone https://github.com/EDeev/mospoly-helper.git
cd mospoly-helper
- Установка Python-зависимостей
pip install -r requirements.txt
- Установка FFmpeg
Ubuntu/Debian:
sudo apt update && sudo apt install ffmpeg
macOS (с Homebrew):
brew install ffmpeg
Windows: Скачайте с официального сайта и добавьте в PATH
-
Создание Telegram бота
- Перейдите к @BotFather
- Создайте нового бота командой
/newbot
- Сохраните полученный токен
-
Настройка конфигурации
# config.py
BOT_TOKEN = "YOUR_BOT_TOKEN_HERE" # Замените на ваш токен
- Создание структуры каталогов
mkdir -p data/{cache,users,videos/{av,bs,mi,pk,pr}/{buildings,floors,offices}}
mkdir -p logs
Основной режим:
cd src/code
python bot.py
С логированием:
python bot.py 2>&1 | tee ../../logs/bot.log
Предварительная генерация кеша (опционально):
python combine.py # Генерирует кеш для всех доступных маршрутов
Система обработки видео использует продвинутые техники оптимизации:
# Параметры кодирования (scripts.py)
full_clip.write_videofile(
filename,
fps=30, # Оптимальная частота кадров
codec="libx264", # Эффективный кодек H.264
bitrate="1500k", # Баланс качество/размер
preset="fast", # Быстрое кодирование
ffmpeg_params=["-crf", "23"] # Constant Rate Factor для качества
)
Применяемые оптимизации:
- ✂️ Удаление аудиодорожки — экономия 30-40% размера файла
- ⏩ Ускорение в 2 раза — сокращение времени просмотра
- 📐 Изменение разрешения до 400px — оптимизация для мобильных устройств
- 🗜️ CRF 23 — оптимальный баланс качества и размера файла
Двухуровневое кеширование:
- Полные маршруты (
*-all.mp4
) — от входа на территорию - Короткие маршруты (
*-small.mp4
) — от входа в корпус
Алгоритм проверки кеша:
# Проверка существования готового файла
cache_path = f"../data/cache/{route_id}-{'all' if full_route else 'small'}.mp4"
if os.path.exists(cache_path):
return cache_path # Мгновенная отдача
else:
return await make_full_clip(video_segments) # Генерация нового
Метрика | Кешированный маршрут | Новый маршрут |
---|---|---|
Время отклика | < 3 секунды | 15-30 секунд |
Размер файла | 2-8 МБ | аналогично |
Качество видео | 400p, 30fps | аналогично |
Нагрузка на CPU | минимальная | высокая |
Компонент | До оптимизации | После оптимизации | Улучшение |
---|---|---|---|
Размер видео | 15-25 МБ | 2-8 МБ | 🔻 70% |
Время генерации | 45-60 сек | 15-30 сек | 🔻 50% |
Время отдачи (кеш) | N/A | < 3 сек | ⚡ мгновенно |
Использование RAM | 200-300 МБ | 100-150 МБ | 🔻 40% |
Утилита для предварительной генерации видеомаршрутов:
async def combine_all_videos():
"""
Массовая генерация кеша для всех доступных маршрутов
Обрабатывает:
- Все корпуса: pr, pk, mi, av, bs
- Полные и короткие маршруты для каждого кабинета
- Пропускает несуществующие видеофрагменты
"""
corpora = ["pr", "pk", "mi", "av", "bs"]
for corpus in corpora:
offices_path = f"../videos/{corpus}/offices"
for video_file in os.listdir(offices_path):
# Генерация полного маршрута
await make_full_clip([building_path, floor_path, office_path])
# Генерация короткого маршрута
await make_full_clip([floor_path, office_path])
Использование:
cd src/code
python combine.py # Запуск в фоновом режиме для больших объемов
Проект создан в рамках проектной практики студентами группы 241-327 направления "Системная и программная инженерия":
Участник | Роль | Вклад | Контакты |
---|---|---|---|
Деев Егор Викторович | Tech Lead & Backend Developer | Архитектура системы, обработка видео, оптимизация производительности | @EDeev |
Сапрыкин Пётр Иванович | Frontend & UX Developer | Пользовательский интерфейс, логика взаимодействия, тестирование | @PetrSaprykin |
Старков Руслан Владимирович | DevOps & QA Engineer | Развертывание, мониторинг, обеспечение качества | @RayStar-k |
Научное руководство:
- Куратор практики: Баринова Наталья Владимировна
- Кураторы проектной деятельности: Киреева Галина Ивановна, Будылина Евгения Александровна
Официальные каналы поддержки:
-
📧 Email: support@new-devs.ru
- Время ответа: 24-48 часов
- Для технических вопросов и предложений
-
🐙 GitHub Issues: Создать issue
- Для сообщений об ошибках и feature requests
- Публичное обсуждение и tracking
Этот проект создан в учебных целях как работа по дисциплине "Проектной практики" в Московском Политехническом Университете, 2024-2025 учебный год.
Создано с ❤️ студентами МосПолитеха для студенческого сообщества