Консольное приложение на C++ для отображения прогноза погоды в нескольких городах. Подтягивает данные с публичных API, парсит JSON, обновляет экран с заданной периодичностью и реагирует на клавиатуру.
- Прогноз погоды на 1–16 дней вперёд для произвольного списка городов
- Список городов, период обновления и количество дней по умолчанию задаются в конфиге
- Автоматическое обновление данных с заданной частотой
- Управление с клавиатуры:
- n/p — следующий/предыдущий город
- +/- — увеличить/уменьшить количество дней прогноза (1 ≤ дней ≤ 16)
- Esc — выход
- Устойчивость к сетевым ошибкам и невалидным ответам API: приложение не падает при таймаутах, отказах сервиса и неизвестных названиях городов
- C++20
- CMake ≥ 3.15
- cpr — HTTP-клиент (C++ Requests)
- nlohmann/json — парсинг JSON
- OMFL — формат конфигурационного файла
| API | Назначение | Ключ |
|---|---|---|
| Open-Meteo | Прогноз погоды по координатам | Не требуется |
| API Ninjas — City API | Координаты по названию города | Требуется |
Weather_forecast/
├── bin/ # Точка входа (main, цикл приложения, рендер)
├── lib/ # Логика: парсер конфига, HTTP-клиенты к API, обработка ответов
├── cpr/ # Внешняя зависимость (cpr)
├── json/ # Внешняя зависимость (nlohmann/json)
├── config.txt # Пользовательский конфиг
├── secrets.txt # Файл с API-ключом
└── CMakeLists.txt
Файл в формате OMFL:
city = ["Omsk","Kazan","Moscow","Rome"]
freq = 60
day = 3
| Поле | Тип | Значение |
|---|---|---|
city |
список строк | Города, между которыми переключается приложение |
freq |
int | Период автоматического обновления данных в секундах |
day |
int | Количество дней прогноза по умолчанию (1–16) |
Отдельный файл с API-ключом от API Ninjas — одна строка с ключом. Хранится отдельно от исходников и от config.txt, чтобы ключ не попадал в репозиторий. Пример:
abcDEF123yourApiKey456ghiJKL
- C++ компилятор с поддержкой C++20 (GCC 10+, Clang 11+, MSVC 19.29+)
- CMake ≥ 3.15
- Подключение к интернету при первом запуске (для скачивания зависимостей через cpr) и при работе приложения
- API-ключ от API Ninjas (бесплатная регистрация)
В CMakeLists.txt библиотеки cpr и nlohmann/json подключаются через add_subdirectory(cpr) и add_subdirectory(json). Скачать и подключить их можно двумя способами. Первый - вручную, положите их в корень проекта:
git clone https://github.com/libcpr/cpr.git
git clone https://github.com/nlohmann/json.gitВторой через клонирование с подмодулями
git clone --recurse-submodules https://github.com/LomanTrue/Weather_forecast.gitЕсли репозиторий уже склонирован без --recurse-submodules — подтяните подмодули отдельно:
git submodule update --init --recursivegit clone https://github.com/LomanTrue/Weather_forecast.git
cd Weather_forecast
mkdir build && cd build
cmake ..
cmake --build .После сборки исполняемый файл появится в build/.
Приложение запускается из консоли с двумя обязательными аргументами — путём к файлу конфигурации и путём к файлу с API-ключом:
weather_forecast.exe <путь к config.txt> <путь к secrets.txt>
Пример (Windows):
D:\Weather_forecast\build\weather_forecast.exe D:\Weather_forecast\config.txt D:\Weather_forecast\secrets.txt
Пример (Linux / macOS):
./weather_forecast /home/user/Weather_forecast/config.txt /home/user/Weather_forecast/secrets.txtПути можно указывать как абсолютные, так и относительные (относительно текущей рабочей директории).
Несколько технических моментов, на которые стоит обратить внимание:
- Двухступенчатая работа с API. Чтобы получить прогноз для города, сначала выполняется запрос к City API (название → координаты), затем результат подставляется в запрос к Open-Meteo. Для каждого нового города в сессии выполняется не более одного запроса геокодирования — координаты кэшируются.
- Обработка ошибок сети. HTTP-запросы через cpr оборачиваются в проверки кода ответа и валидности JSON; при отказе сервиса или невалидном ответе приложение продолжает работать и показывает последние известные данные
- Чтение клавиатуры без блокировки — основной цикл должен одновременно слушать ввод пользователя и обновлять данные по таймеру; это сделано через неблокирующее чтение терминала.
