Telegram-бот, CLI та MCP-сервер для планування маршрутів у Харківському метрополітені.
- 3 лінії метро: Холодногірсько-заводська, Салтівська, Олексіївська
- 3 пересадки: Майдан Конституції ↔ Історичний музей, Спортивна ↔ Метробудівників, Університет ↔ Держпром
- Розклад: Окремий для буднів та вихідних
-
Local-first: Локальна БД, працює офлайн
-
Час пересадки: 3 хвилини
-
Мови: Українська та англійська
-
Альтернативні назви: Старі та скорочені назви станцій
- Героїв праці: Салтівська
- Проспект Гагаріна: Левада
- Пушкінська: Ярослава Мудрого
- 23: 23 Серпня
- Барабашова: Академіка Барабашова
- Бекетова: Архітектора Бекетова
- Ботсад: Ботанічний сад
- Гагаріна: Левада
- Масельського: Ім. О.С. Масельського
- Павлова: Академіка Павлова
- Палац: Палац спорту
- ХТЗ: Тракторний завод
Проєкт організовано як монорепозиторій з окремими пакунками для різних інтерфейсів. Всі пакунки вимагають Python >= 3.11.
Ядро системи — бібліотека з базовою логікою.
Відповідальність:
- Моделі даних (станції, лінії, маршрути)
- Граф метрополітену та алгоритми пошуку шляху
- Робота з базою даних SQLite
- Парсинг розкладу з metro.kharkiv.ua
- Конфігурація XDG
Залежності: beautifulsoup4, requests, toml, tzdata
Консольний інтерфейс для планування маршрутів у терміналі.
Особливості:
- Кольоровий вивід таблиць через Rich
- JSON та табличні формати виводу
- Конфігурація через TOML
Залежності: click, rich, kharkiv-metro-core
Команда: metro
Telegram-бот з інтерактивним інтерфейсом.
Особливості:
- Інтерактивний вибір станцій через кнопки
- Нагадування про вихід на потрібній станції
- Підтримка української та англійської мов (TODO)
Залежності: aiogram, python-dotenv, kharkiv-metro-core
Команда: metro-bot
MCP-сервер для інтеграції з AI-асистентами (OpenCode, Claude Desktop тощо).
Доступні інструменти:
get_route— пошук маршрутуget_schedule— розклад станціїlist_stations— список станційfind_station— пошук станції за назвою
Залежності: mcp, kharkiv-metro-core
Команда: metro-mcp
Проєкт використовує uv, наступні команди виконуються через uv run metro.
Ініціалізація
metro scrape --init-dbРозклади парсяться з https://www.metro.kharkiv.ua/ і зберігаються окремо для буднів та вихідних.
# За замовчуванням - з поточного часу
metro route "Холодна гора" "Студентська"
# З конкретним часом
metro route "Холодна гора" "Студентська" --time "08:30"
# З виведенням у JSON
metro route "Холодна гора" "Студентська" --output json
# Англійською мовою
metro route "Kholodna Hora" "Studentska" --lang en
# Компактний вивід (тільки ключові станції: початок, пересадки, кінець)
metro route "Холодна гора" "Студентська" --compact
# Повний вивід (всі станції) - якщо в конфігу compact=true
metro config set preferences.route.compact true
metro route "Холодна гора" "Студентська" --compact# Розклад станції
metro schedule "Майдан Конституції"
# З конкретним напрямком
metro schedule "Майдан Конституції" --direction "Індустріальна"
# У вихідні
metro schedule "Майдан Конституції" --day-type weekend# Всі станції
metro stations
# Тільки одна лінія
metro stations --line saltivska
# Або коротше
metro stations -l s # "k", "o"Конфіг зберігається в XDG директоріях:
- Linux:
~/.config/kharkiv-metro-rp/config.toml - macOS:
~/Library/Application Support/kharkiv-metro-rp/config.toml - Windows:
%APPDATA%\kharkiv-metro-rp\config.toml
База даних:
- Linux:
~/.local/share/kharkiv-metro-rp/metro.db - macOS:
~/Library/Application Support/kharkiv-metro-rp/metro.db - Windows:
%LOCALAPPDATA%\kharkiv-metro-rp\metro.db
База аналітики (для збереження між редеплоями використовуйте ANALYTICS_DB_PATH):
- Linux:
~/.local/share/kharkiv-metro-rp/analytics.db - macOS:
~/Library/Application Support/kharkiv-metro-rp/analytics.db - Windows:
%LOCALAPPDATA%\kharkiv-metro-rp\analytics.db
| Опція | Тип | За замовчуванням | Опис |
|---|---|---|---|
auto |
boolean | true |
true - використовувати XDG директорію, false - використовувати path |
path |
string | null |
Абсолютний шлях до бази даних (використовується якщо auto = false). Підтримує ~ (домашня директорія) |
| Опція | Тип | За замовчуванням | Можливі значення | Опис |
|---|---|---|---|---|
language |
string | "ua" |
"ua", "en" |
Мова станцій за замовчуванням |
output_format |
string | "table" |
"table", "json" |
Формат виводу за замовчуванням для stations та schedule команд |
| Опція | Тип | За замовчуванням | Можливі значення | Опис |
|---|---|---|---|---|
format |
string | "full" |
"full", "simple", "json" |
Формат виводу маршруту: full=детальна таблиця, simple=компактний inline, json=JSON |
compact |
boolean | false |
true, false |
true - показувати тільки ключові станції (початок, пересадки, кінець), false - всі станції. Працює з форматами full та simple |
| Опція | Тип | За замовчуванням | Опис |
|---|---|---|---|
timeout |
integer | 30 |
Таймаут HTTP запитів в секундах |
user_agent |
string | "kharkiv-metro-rp/1.0" |
User-Agent для HTTP запитів |
[database]
auto = false
path = "~/Documents/kharkiv_metro.db"
[preferences]
language = "ua"
output_format = "table"
[preferences.route]
format = "full"
compact = false
[scraper]
timeout = 30
user_agent = "kharkiv-metro-rp/1.0"- Команда
metro config setпрацює для будь-якої опції з config.toml за шаблономsection.key value. Тип значення визначається автоматично (string, boolean, integer). - Команда
metro config openвідкриває конфіг у системному редакторі:- Linux: використовує
xdg-openабо$EDITOR(fallback: nano) - macOS: використовує
open - Windows: використовує
start
- Linux: використовує
# Кастомна база даних
metro --db-path /tmp/test.db route "Холодна гора" "Студентська"
# Кастомний конфіг
metro --config ./my-config.toml route "Холодна гора" "Студентська"| Змінна | Опис | Приклад |
|---|---|---|
DB_PATH |
Шлях до основної бази даних метро | /app/data/metro.db |
ANALYTICS_DB_PATH |
Шлях до бази аналітики (для persistent зберігання між редеплоями) | /app/data/analytics.db |
BOT_TOKEN |
Токен Telegram бота | 123456:ABC-DEF... |
TZ |
Часовий пояс | Europe/Kyiv |
Інтерактивний Telegram бот для пошуку маршрутів з нагадуваннями про станції.
# Встановіть змінні оточення
export BOT_TOKEN="your_bot_token_here"
export DB_PATH="/path/to/metro.db" # Опціонально, за замовчуванням XDG
export ANALYTICS_DB_PATH="/path/to/analytics.db" # Опціонально, для persistent зберігання
export TZ="Europe/Kyiv" # Опціонально, часовий пояс
# Запуск
uv run python -m kharkiv_metro_rp.bot.main/start— Початок роботи та головне меню
/about— Інформація про бота
Пошук маршруту:
- Інтерактивний вибір лінії та станції відправлення/призначення
- Вибір часу відправлення: зараз, +-10/20 хв, або власний час
- Вибір типу дня: будній/вихідний
- Розрахунок часу прибуття з урахуванням розкладу
Нагадування:
- Можливість створити нагадування перед виходом на потрібній станції
- Автоматична пропозиція нагадувань для довгих ліній (2+ станцій)
Бот підтримує розгортання на Railway. Необхідні змінні оточення:
BOT_TOKEN— токен бота від @BotFatherDB_PATH— шлях до бази даних (наприклад,/app/data/metro.db)TZ— часовий пояс (Europe/Kyiv)ANALYTICS_DB_PATH— шлях до бази аналітики (для persistent зберігання, наприклад,/app/data/analytics.db)
Запуск MCP сервера для інтеграції з AI-агентами:
Передбачає:
- Наявність
uvу$PATH - Локальний репозиторій
git clone https://github.com/beauloxe/kharkiv-metro-rp.git /foo/bar/, де/foo/bar/- приклад директорії.
"mcp": {
"metro-kh": {
"enabled": true,
"type": "local",
"command": [
"uv", "run",
"--directory", "/foo/bar/kharkiv-metro-rp",
"python", "-m", "kharkiv_metro_rp.mcp.server"
],
}
}get_route- пошук маршруту між станціямиget_schedule- отримання розкладу станціїlist_stations- список всіх станційfind_station- пошук станції за назвою
metropoliten/
├── src/metropoliten/
│ ├── core/ # Ядро системи
│ │ ├── models.py # Моделі даних
│ │ ├── graph.py # Граф метро
│ │ └── router.py # Алгоритми маршрутизації
│ ├── data/ # Робота з даними
│ │ ├── database.py # SQLite база
│ │ ├── scraper.py # Парсер сайту metro.kharkiv.ua
│ │ └── initializer.py # Ініціалізація бази
│ ├── cli/ # CLI інтерфейс
│ │ └── main.py # Команди
│ ├── mcp/ # MCP сервер
│ │ └── server.py # Сервер
│ └── config.py # XDG конфігурація
└── data/
└── metro.db # База даних (legacy, тепер в XDG)
- Правильна транслітерація та назви станцій
- Доопрацювати парсер
- Переклад усіх полів
- Уніфікація виводу, аргументів
-
Переписати весь цей ШІ слопЗробити повний рефактор
Цей проєкт не пов'язаний з КП «Харківський метрополітен» і не надає жодних гарантій. Користуючись цим проєктом, Ви несете відповідальність за належне планування маршрутів.
Для повної інформації ознайомтесь з умовами ліцензії MIT.