Skip to content

LomanTrue/Weather_forecast

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Weather forecast

Консольное приложение на C++ для отображения прогноза погоды в нескольких городах. Подтягивает данные с публичных API, парсит JSON, обновляет экран с заданной периодичностью и реагирует на клавиатуру.

Возможности

  • Прогноз погоды на 1–16 дней вперёд для произвольного списка городов
  • Список городов, период обновления и количество дней по умолчанию задаются в конфиге
  • Автоматическое обновление данных с заданной частотой
  • Управление с клавиатуры:
    • n/p — следующий/предыдущий город
    • +/- — увеличить/уменьшить количество дней прогноза (1 ≤ дней ≤ 16)
    • Esc — выход
  • Устойчивость к сетевым ошибкам и невалидным ответам API: приложение не падает при таймаутах, отказах сервиса и неизвестных названиях городов

Скриншот

Interface

Стек

  • 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

Конфигурация

config.txt

Файл в формате OMFL:

city = ["Omsk","Kazan","Moscow","Rome"]
freq = 60
day = 3
Поле Тип Значение
city список строк Города, между которыми переключается приложение
freq int Период автоматического обновления данных в секундах
day int Количество дней прогноза по умолчанию (1–16)

secrets.txt

Отдельный файл с 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 --recursive

Сборка

git 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; при отказе сервиса или невалидном ответе приложение продолжает работать и показывает последние известные данные
  • Чтение клавиатуры без блокировки — основной цикл должен одновременно слушать ввод пользователя и обновлять данные по таймеру; это сделано через неблокирующее чтение терминала.

About

Console weather forecast app: multiple cities, live auto-refresh, OMFL config, two REST APIs. C++20, cpr, nlohmann/json.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages