Telegram бот для скачивания GPX треков с nakarte.me. Бот принимает ссылки nakarte.me и возвращает пользователям GPX файлы с интеллектуальным кешированием для быстрых ответов.
- 🚀 Fast Processing: Intelligent caching system (Redis or file-based)
- 🤖 Browser Automation: Uses Playwright for reliable GPX extraction
- 🐳 Docker Ready: Fully containerized with docker-compose
- 📝 Structured Logging: Comprehensive logging with request tracing
- 🔒 Secure: Runs as non-root user in Docker
- 🌐 Russian Interface: User-friendly messages in Russian
- ⚡ Async/Await: Built with modern async Python patterns
project/
├── docker-compose.yml # Docker orchestration
├── Dockerfile # Multi-stage Docker build
├── requirements.txt # Python dependencies
├── .env.example # Environment variables template
├── test_nakarte.py # Standalone testing script
├── README.md # This file
├── TESTING.md # Testing guide
├── NAKARTE_API.md # Nakarte.me API documentation
├── src/
│ ├── __init__.py
│ ├── main.py # Application entry point
│ ├── bot/
│ │ ├── __init__.py
│ │ └── handlers.py # Telegram bot handlers
│ ├── services/
│ │ ├── __init__.py
│ │ ├── nakarte_service.py # GPX extraction service
│ │ └── cache_service.py # Caching abstraction
│ └── utils/
│ ├── __init__.py
│ └── logger.py # Structured logging setup
└── cache/ # Cache directory (created automatically)
- Docker and Docker Compose
- Telegram Bot Token (get from @BotFather)
git clone <repository-url>
cd NakarteGPXCreate a .env file from the example:
cp .env.example .envEdit .env and set your bot token:
TELEGRAM_BOT_TOKEN=your_bot_token_here# Build and start services
docker-compose up -d
# View logs
docker-compose logs -f bot
# Stop services
docker-compose downПеред запуском бота можно протестировать извлечение GPX:
# Установите зависимости
pip install -r requirements.txt
playwright install chromium
# Запустите тест
python test_nakarte.py "https://nakarte.me/#m=15/41.69442/44.81043&l=O&nktl=YOUR_TRACK_ID"
# Или с видимым браузером (для отладки)
python test_nakarte.py "https://nakarte.me/#..." --no-headlessСкрипт покажет:
- ✅ Валидацию URL
- 📋 ID трека
- 📊 Размер и количество точек
- 💾 Сохранит GPX файл локально
- 📄 Покажет превью содержимого
All configuration is done via environment variables in the .env file:
| Variable | Description | Example |
|---|---|---|
TELEGRAM_BOT_TOKEN |
Your Telegram bot token | 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11 |
| Variable | Description | Default |
|---|---|---|
CACHE_TYPE |
Cache backend (redis or file) |
redis |
CACHE_TTL |
Cache time-to-live in seconds | 86400 (24 hours) |
REDIS_HOST |
Redis hostname | redis |
REDIS_PORT |
Redis port | 6379 |
REDIS_DB |
Redis database number | 0 |
REDIS_PASSWORD |
Redis password (if required) | (empty) |
LOG_LEVEL |
Logging level | INFO |
BROWSER_HEADLESS |
Run browser in headless mode | true |
BROWSER_TIMEOUT |
Browser timeout in milliseconds | 30000 |
- Начните чат с ботом в Telegram
- Отправьте
/startдля приветствия - Скопируйте ссылку с nakarte.me (например,
https://nakarte.me/#m=15/41.69442/44.81043&l=O&nktl=FqYcC2069tzeSG-foUKGsA) - Отправьте ссылку боту
- Получите GPX файл
/start- Приветственное сообщение и инструкции/help- Подробная справка
- Откройте nakarte.me
- Создайте или загрузите трек
- Скопируйте URL из адресной строки браузера
- Убедитесь, что URL содержит параметр
nktl(идентификатор трека)
- Install Python 3.11+:
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
pip install -r requirements.txt- Install Playwright browsers:
playwright install chromium-
Create
.envfile with your configuration -
Run the bot:
python -m src.main# Install dev dependencies
pip install pytest pytest-asyncio pytest-cov
# Run tests (when implemented)
pytest tests/Бот использует Playwright для автоматизации браузера и извлечения GPX данных:
- Загрузка страницы: Открывает nakarte.me с URL трека
- Ожидание инициализации: Ждет загрузки JavaScript приложения
- Доступ к API: Получает доступ к
window.app.trackManager - Извлечение данных: Получает координаты через
getTrackPolylines() - Генерация GPX: Создает XML в формате GPX 1.1
- Кеширование: Сохраняет результат для быстрого повторного доступа
Подробнее см. NAKARTE_API.md
Пользователь → Telegram Bot Handler
↓
Проверка кеша
↙ ↘
Cache Hit Cache Miss
↓ ↓
Возврат Playwright Browser
файла ↓
nakarte.me загрузка
↓
Извлечение GPX
↓
Сохранение в кеш
↓
Возврат файла
The Dockerfile uses a multi-stage build to optimize image size:
- Builder stage: Compiles Python dependencies
- Runtime stage: Minimal runtime with only necessary components
- bot: Main application container
- redis: Redis cache (optional, can use file cache instead)
redis_data: Persistent Redis datacache_data: File-based cache storage./logs: Application logs (optional)
Default limits (configurable in docker-compose.yml):
- CPU: 2 cores max, 0.5 cores reserved
- Memory: 2GB max, 512MB reserved
The bot includes health checks:
# Check bot container health
docker-compose ps
# View detailed health status
docker inspect nakarte-bot --format='{{.State.Health.Status}}'View structured JSON logs:
# Follow all logs
docker-compose logs -f
# Follow bot logs only
docker-compose logs -f bot
# View last 100 lines
docker-compose logs --tail=100 botEach log entry includes:
timestamp: ISO 8601 timestamplevel: Log level (INFO, WARNING, ERROR)event: Event typeuser_id: Telegram user IDrequest_id: Unique request identifier- Additional context-specific fields
- Проверьте логи:
docker-compose logs bot - Убедитесь, что токен бота правильный в
.env - Проверьте, что Redis запущен:
docker-compose ps redis
Симптомы: Бот отвечает "Не удалось загрузить трек"
Решения:
- Проверьте доступность nakarte.me в браузере
- Убедитесь, что URL содержит параметр
nktl - Увеличьте
BROWSER_TIMEOUTв.env - Проверьте логи:
docker-compose logs bot | grep error - Протестируйте локально:
python test_nakarte.py "URL"
Типичные ошибки:
"No tracks found on the page" - трек не загрузился или удален
"Timeout waiting for condition" - слишком маленький timeout
"Could not find GPX data" - проблема с извлечением данных
Redis connection failed:
# Check Redis status
docker-compose ps redis
# Restart Redis
docker-compose restart redisSwitch to file-based cache:
CACHE_TYPE=fileIf the bot runs out of memory:
- Increase memory limits in
docker-compose.yml - Reduce
BROWSER_TIMEOUT - Monitor with:
docker stats nakarte-bot
- Use secrets management: Don't commit
.envto version control - Enable Redis password: Set
REDIS_PASSWORDin production - Use reverse proxy: Put behind nginx for additional security
- Regular updates: Keep dependencies updated
- Monitor logs: Set up log aggregation (ELK, Loki, etc.)
For high load:
- Horizontal scaling: Run multiple bot instances
- Redis cluster: Use Redis cluster for distributed caching
- Load balancing: Use Telegram's webhook mode with load balancer
Backup important data:
# Backup Redis data
docker-compose exec redis redis-cli BGSAVE
# Backup file cache
tar -czf cache-backup.tar.gz cache/Подробное руководство по тестированию см. в TESTING.md
# Тест извлечения GPX
python test_nakarte.py "https://nakarte.me/#m=15/41.69442/44.81043&l=O&nktl=ABC123"
# С видимым браузером (для отладки)
python test_nakarte.py "URL" --no-headless# Следить за логами в реальном времени
docker-compose logs -f bot
# Фильтр по событиям
docker-compose logs bot | grep "gpx_downloaded"
docker-compose logs bot | grep "error"from src.services.nakarte_service import NakarteService
service = NakarteService(headless=True, timeout=30000)
# Валидация URL
is_valid = service.validate_url(url)
# Извлечение ID трека
track_id = service.extract_track_id(url)
# Скачивание GPX
gpx_data = await service.download_gpx(url)
# Закрытие
await service.close()from src.services.cache_service import create_cache_service
cache = create_cache_service(cache_type='redis')
# Получение из кеша
data = await cache.get(key)
# Сохранение в кеш
await cache.set(key, value, ttl=86400)
# Проверка существования
exists = await cache.exists(key)
# Закрытие
await cache.close()README.md- Основная документация (этот файл)TESTING.md- Руководство по тестированиюNAKARTE_API.md- Документация по API nakarte.me.env.example- Пример конфигурации
- Форкните репозиторий
- Создайте feature branch
- Внесите изменения
- Добавьте тесты (если применимо)
- Создайте pull request
Проект предоставляется "как есть" для образовательных и личных целей.
При возникновении проблем:
- Проверьте раздел Troubleshooting
- Изучите логи для деталей ошибок
- Используйте
test_nakarte.pyдля локального тестирования - Откройте issue на GitHub
- nakarte.me - Отличный картографический сервис
- aiogram - Современный фреймворк для Telegram ботов
- Playwright - Надежная автоматизация браузера
Планируемые улучшения:
- Поддержка множественных треков в одном URL
- Экспорт в другие форматы (KML, GeoJSON)
- Webhook режим для масштабирования
- Веб-интерфейс для мониторинга
- Автоматические тесты (pytest)
- Метрики и мониторинг (Prometheus)
Примечание: Этот бот не связан с nakarte.me. Пожалуйста, соблюдайте их условия использования и используйте ответственно.