Skip to content

Verper1/Weather_in_Moscow

Repository files navigation

Бот погоды в Москве (Telegram, aiogram 3.x)

Асинхронный Telegram‑бот, который показывает погоду в Москве (сейчас, сегодня, завтра) и может присылать ежедневное уведомление о погоде на завтра в выбранное пользователем время.
Бот реализован на aiogram 3.x, использует WeatherAPI для получения прогнозов и APScheduler для планирования уведомлений.


Возможности

  • Погода сейчас — текущая температура, состояние погоды и «ощущается как».
  • Погода на сегодня — краткий прогноз на текущий день (средняя/макс/мин температура, дождь/снег, восход/закат, фаза Луны).
  • Погода на завтра — аналогичный прогноз на следующий день.
  • Уведомление о завтрашней погоде — ежедневное сообщение с прогнозом на завтра в заданное время.
  • Ограничение частоты запросов — каждый режим можно вызывать не чаще одного раза в 15 минут (per‑user).

Технологии и зависимости

Основные используемые библиотеки:

  • aiogram — асинхронный Telegram‑фреймворк (версия 3.x).
  • APScheduler — планировщик задач (AsyncIOScheduler).
  • Requests — HTTP‑клиент для запросов к WeatherAPI.
  • python‑dotenv — загрузка переменных окружения из .env.
  • Loguru — удобное логирование.

Зависимости и версии зафиксированы в pyproject.toml и uv.lock.


Установка и запуск

1. Клонирование репозитория

git clone <url_репозитория>
cd Weather_in_Moscow

2. Установка зависимостей

Если используешь uv (рекомендуется, т.к. в проекте уже есть pyproject.toml и uv.lock):

uv sync

Если хочешь установить через pip, ориентируйся на зависимости:

pip install aiogram requests python-dotenv apscheduler loguru

(Версии лучше уточнить в pyproject.toml.)

3. Настройка переменных окружения

Создай файл .env в корне проекта со следующим содержимым:

BOT_TOKEN=токен_твоего_бота_из_BotFather
API_TOKEN=ключ_доступа_к_WeatherAPI
CODE=секретный_код_для_доступа_к_боту
  • BOT_TOKEN — токен Telegram‑бота (см. инструкцию BotFather).
  • API_TOKEN — токен WeatherAPI (получить на https://www.weatherapi.com/, см. их документацию).
  • CODE — любой секретный код (строка), который пользователь должен ввести после /start.

Модуль src/config.py загружает эти значения при помощи load_dotenv().

4. Запуск бота

Точка входа — src/main.py, который вызывает handlers.main() через asyncio.run.

python -m src.main

или, если используешь uv:

uv run python -m src.main

После запуска бот начинает long polling и ждёт обновления от Telegram.


Запуск через Docker

Для удобного развёртывания на сервере проект включает Dockerfile и docker-compose.yml.

Требования

Сборка и запуск через Docker Compose (рекомендуется)

  1. Убедись, что файл .env создан и содержит все необходимые переменные (см. раздел "Настройка переменных окружения").

  2. Запусти контейнер:

docker-compose up -d

Контейнер запустится в фоновом режиме и будет автоматически перезапускаться при сбоях (restart: unless-stopped).

  1. Просмотр логов:
docker-compose logs -f weather-bot
  1. Остановка контейнера:
docker-compose down

Сборка и запуск через Docker напрямую

  1. Собери образ:
docker build -t weather-in-moscow-bot .
  1. Запусти контейнер с переменными окружения из .env:
docker run -d \
  --name weather-in-moscow-bot \
  --restart unless-stopped \
  --env-file .env \
  weather-in-moscow-bot

Или передай переменные окружения напрямую:

docker run -d \
  --name weather-in-moscow-bot \
  --restart unless-stopped \
  -e BOT_TOKEN=твой_токен \
  -e API_TOKEN=твой_api_токен \
  -e CODE=твой_код \
  weather-in-moscow-bot
  1. Просмотр логов:
docker logs -f weather-in-moscow-bot
  1. Остановка и удаление контейнера:
docker stop weather-in-moscow-bot
docker rm weather-in-moscow-bot

Особенности Docker-образа

  • Используется многоступенчатая сборка для уменьшения размера финального образа.
  • Зависимости устанавливаются через uv (быстрый менеджер зависимостей Python).
  • Базовый образ: python:3.13-slim (минимальный образ на основе Debian).
  • Логирование настроено через драйвер json-file с ротацией (максимум 10 МБ на файл, до 3 файлов).
  • Переменные окружения загружаются из .env файла через python-dotenv.

Обновление бота

Для обновления кода бота:

# Останови текущий контейнер
docker-compose down

# Пересобери образ (если изменился код)
docker-compose build

# Запусти заново
docker-compose up -d

Если изменились только переменные окружения в .env, достаточно перезапустить контейнер:

docker-compose restart

Автозапуск при перезагрузке сервера

Для автоматического запуска контейнера при загрузке сервера нужно настроить systemd сервис.

Важно: Убедись, что Docker настроен на автозапуск (обычно это уже включено по умолчанию):

sudo systemctl enable docker

Настройка systemd сервиса для бота:

  1. Скопируй файл weather-bot.service в директорию systemd:
sudo cp weather-bot.service /etc/systemd/system/
  1. Отредактируй файл и укажи правильный путь к проекту:
sudo nano /etc/systemd/system/weather-bot.service

Измени строку WorkingDirectory=/path/to/Weather_in_Moscow на реальный путь к проекту, например:

WorkingDirectory=/home/user/Weather_in_Moscow

Также убедись, что путь к docker-compose правильный. Обычно это /usr/bin/docker-compose или /usr/local/bin/docker-compose. Проверь:

which docker-compose
  1. Перезагрузи конфигурацию systemd:
sudo systemctl daemon-reload
  1. Включи автозапуск сервиса:
sudo systemctl enable weather-bot.service
  1. Запусти сервис:
sudo systemctl start weather-bot.service
  1. Проверь статус:
sudo systemctl status weather-bot.service

Теперь бот будет автоматически запускаться при перезагрузке сервера.

Управление сервисом:

# Запуск
sudo systemctl start weather-bot

# Остановка
sudo systemctl stop weather-bot

# Перезапуск
sudo systemctl restart weather-bot

# Просмотр статуса
sudo systemctl status weather-bot

# Просмотр логов
sudo journalctl -u weather-bot -f

# Отключить автозапуск
sudo systemctl disable weather-bot

Альтернативный способ (без systemd):

Если не хочешь использовать systemd, можно использовать флаг --restart unless-stopped при запуске через Docker напрямую:

docker run -d \
  --name weather-in-moscow-bot \
  --restart unless-stopped \
  --env-file .env \
  weather-in-moscow-bot

В этом случае Docker сам будет поднимать контейнер после падения/перезагрузки сервера, но не будет запускать его, если ты остановил контейнер вручную (если Docker daemon настроен на автозапуск).


Как пользоваться ботом (для пользователя Telegram)

  1. Найди бота в Telegram по username.

  2. Нажми Start или отправь /start.

  3. Бот ответит: «Введите пароль для использования бота:».

  4. Введи код, который ты указал в переменной окружения CODE.

  5. При успешной проверке кода бот покажет клавиатуру с кнопками:

    • «Погода сейчас»
    • «Погода на сегодня»
    • «Погода на завтра»
    • «Уведомление о завтрашней погоде»
    • «Выключить оповещение»
  6. Нажимай на нужный режим:

    • «Погода сейчас» — мгновенно получает текущую погоду через WeatherAPI.
    • «Погода на сегодня» — прогноз на текущий день.
    • «Погода на завтра» — прогноз на следующий день.

    Каждый из этих режимов можно вызывать раз в 15 минут (ограничение реализовано в utils.check_cooldown / update_cooldown).

  7. Уведомление о завтрашней погоде:

    • Нажми кнопку «Уведомление о завтрашней погоде».
    • Если у тебя уже есть активное уведомление, бот сообщит, что может быть только одно.
    • Если уведомления нет, бот попросит время в формате HH:MM (например, 9:30).
    • Отправь время — будет создана ежедневная задача в APScheduler, которая будет вызывать send_weather_func и присылать прогноз на завтра.
  8. Выключение уведомления:

    • Нажми «Выключить оповещение».
    • Если задача найдена — бот удалит её и напишет, что оповещение отключено.
    • Если задач нет — бот сообщит, что у тебя нет активных оповещений.

Структура проекта

  • src/config.py — загрузка конфигурации и создание объектов:
    • dp: Dispatcher
    • bot: Bot
    • scheduler: AsyncIOScheduler
    • токены и код доступа из .env.
  • src/utils.py — утилиты:
    • keyboard_mode() — клавиатура режимов.
    • weather_now_func() — текущая погода.
    • weather_today_func() — прогноз на сегодня.
    • weather_tomorrow_func() — прогноз на завтра.
    • send_weather_func() — отправка прогноза в чат.
    • check_cooldown() / update_cooldown() — ограничение частоты запросов.
  • src/handlers.py — хэндлеры aiogram + FSM + логика APScheduler:
    • состояния Auth, Notify;
    • обработчики /start, пароля, кнопок режимов;
    • настройка/отключение уведомлений;
    • корутина main() — запуск бота.
  • src/main.py — точка входа, запускает asyncio.run(main()).

Дополнительно

  • Логи работы бота пишутся через loguru.logger.
  • Планировщик задач AsyncIOScheduler явно запускается в handlers.main() при помощи scheduler.start(), что соответствует документации APScheduler.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors