Как сделать телеграмм бота погода на python
Перейти к содержимому

Как сделать телеграмм бота погода на python

  • автор:

«Карманный синоптик за час». Пишем Telegram-бота для мониторинга погоды на Python

Перед написанием кода нужно получить API-токены для работы с сервисом OpenWeather и Telegram-ботом, а также подготовить рабочее окружение.

Получаем токен OpenWeather

Начнем с самого простого: зарегистрируемся на официальном сайте и в разделе My API keys создадим токен.

После того, как вы создали API-ключ, дайте ему немного «отлежаться» — обычно это занимает 10-15 минут. Спустя это время можно общаться с OpenWeather с помощью сгенерированного токена.

Генерируем токен для Telegram-бота

Ключ для Telegram-бота можно получить у @BotFather, введя /newbot — команду для создания и регистрации нового бота. Во время настройки придумайте боту логин и название — например, Weather Bot. Есть также опциональные настройки: текст приветствия, изображение. Используйте, если хотите получить более уникального бота!

Импортируем необходимые библиотеки

Для работы нам понадобятся модули requests и aiogram — установим их.

После импортируем модули и классы в файл нашего пет-проекта.

Создание бота

Первое сообщение

Для начала проверим, что aiogram увидел бота и мы можем с ним взаимодействовать. Создадим простую асинхронную функцию start_command для ответа на команду /start . И добавляем метод start_polling для запуска бота.

Запускаем скрипт, заходим в Telegram и пишем команду /start — все работает: бот возвращает нужное сообщение.

Обрабатываем входные данные

Теперь добавим функцию, которая будет реагировать на текстовые сообщения с названиями городов. Она должна проверять их на корректность и выводить ошибку, если валидация не была пройдена.

OpenWeather должен принимать название города через API и возвращать данные о погоде. Исходя из документации, кроме названия города запрос должен содержать API-токен.

Усовершенствуем запрос: в параметр q будем передавать город, добавим параметр lang=ru , чтобы API работал с кириллицей. А также используем units=metric для установки метрической системы:

Теперь добавим блок try-except для обработки пользовательских запросов и создадим переменную для записи результатов OpenWeather, которые возвращает сервис в JSON-формате.

Отправим запрос через браузер и посмотрим, какая температура, например, в Бангкоке.

В ответе получаем не только данные о температуре, но и облачность, давление, влажность, время заката, рассвета и другие величины.

Парсим JSON

Приступим к парсингу ответа OpenWeather в формате JSON: заберем данные о городе и температуре, влажности, давлении и скорости ветра.

OpenWeather возвращает время рассвета и заката в формате unix timestamp. Извлечем эти данные и преобразуем в секунды.

Зная время рассвета и заката, мы можем вернуть пользователю продолжительность дня. В результате получается следующее:

Декорируем сообщения

Разнообразим текст сообщений — будем выводить разные эмодзи в зависимости от погоды.

У словаря, который мы ранее спарсили, есть ключ main — он хранит описание погоды. На его основе мы можем создать свою коллекцию с эмодзи под разные ситуации.

Также напишем условие, чтобы в случае специфической погоды, для которой эмодзи не предусмотрен, программа не ломалась, а выводила специальное сообщение.

Возможно, эти тексты тоже вас заинтересуют:

Возвращаем данные пользователю

Данные собрали — время отдать их пользователю. Сформируем строки с датой и временем, погодой, влажностью и другими данными. Главное — учесть формат данных. Например, OpenWeather возвращает значение давления в гектопаскалях. Так, если вы хотите отдавать пользователю данные в миллиметрах ртутного столба, значение нужно разделить на 1.33 и округлить в большую сторону.

Супер — бот работает и возвращает данные в удобочитаемом формате!

Деплой бота

Сейчас синоптик запущен на компьютере. Это неудобно, если вы хотите общаться с ним круглосуточно. Ведь тогда нужно поддерживать бесперебойную работу компьютера и постоянное соединение с интернетом.

Бота лучше перенести в облако. Поскольку затраты процессора на работу с простым Open Weather API минимальны, будет достаточно виртуального сервера с 1 vCPU и 1 ГБ оперативной памяти. С учетом выделенного IP-адреса такая конфигурация выйдет примерно в 30 ₽/день.

Для начала зарегистрируемся в панели управления и создадим новый сервер в разделе Облачная платформа. Затем настроим его.

Далее подключимся к серверу по SSH, создадим виртуальное окружение для бота и загрузим его удобным способом.

Последним шагом нужно создать .service-файл, который будет автоматически поднимать бота в случае перезагрузки сервера.

Запускаем командой: systemctl enable tg_bot.service

Проверяем статус: systemctl status tg_bot.service

И перезапускаем .service-файл: systemctl restart tg_bot.service

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

Telegram Bot For Weather Report

Ajay Balakumaran

https://amdy.su/wp-admin/options-general.php?page=ad-inserter.php#tab-8

Weather forecasting is an application/technology which will predict the condition of an atmosphere for a given location and time. It is important to track the weather report daily convenience. There is some third-party application available for mobile application to track the weather forecast. But it would be better if those applications are wrapped in some messenger platform. This article will help with such condition.

Weather Bot For Telegram Application:

This bot will help us by making us not to leave the messenger application to look for the weather report. Weather Bot is deployed in a Telegram and we can get the Current and Forecast weather details of a location.

It will provide the following details of the location which are provided.

  • Current Temperature
  • Max/Min Temperature
  • Humidity
  • Wind Speed

Open the Weather Bot and start a chat with the Bot to get the Current or Forecast weather details. Weather Bot will be able to provide the following

  • Current Weather Report with respect to the Map Location
  • Current Weather Report with respect to the City
  • Forecast Weather Report with respect to the Map Location
  • Forecast Weather Report with respect to the City

Guide to use the Weather Bot

Current Weather Report with respect to the map location

Пишем Telegram бот текущей погоды по IP адресу на Python aiogram

Штош. В этой статье я расскажу вам, как создать Telegram бота, который получает текущую погоду по IP адресу. Мы будем использовать язык Python и асинхронную библиотеку для взаимодействия с Telegram Bot API — aiogram.

Итак, как же вы можете создать такого бота?

Склонируйте репозиторий shtosh-weather-bot и пройдите по инструкции в README.

Выбираем погодный сервис с бесплатным API

Данные о текущей погоде нам нужно откуда-то брать. Еще желательно, чтобы это было бесплатно. У сайта OpenWeatherMap есть нужный нам API текущей погоды. Бесплатно можно посылать 1000 запросов в день.

Кстати, если вы ищете какой-то application user interface для своего проекта, рекомендую репозиторий public-apis.

Итак, для запроса нужны координаты и специальный ключ, который можно получить, зарегистрировав аккаунт. Ну это вообще не проблема, можно зарегать на временную почту. Конечно, если вы собираетесь серьезно использовать API и покупать больше 1000 запросов в день, лучше регистрировать аккаунт на свою почту. Капитан очевидность.

Заходим в My API keys и видим здесь тот самый ключ. Можете взять мой, мне не жалко.

Итак, давайте сформируем запрос. Я выбрал координаты Нью-Йорка, просто потому что хочу и могу. Не забудем добавить флаг units со значением metric , чтобы температура показывалась в градусах Цельсия. По умолчанию дается в Кельвинах.

Вот такой json мы получаем.

Создаем бота и устанавливаем все необходимое

Создайте Telegram бота с помощью BotFather и возьмите его токен.

Из названия видео вы могли догадаться, что мы будем использовать язык Python и библиотеку aiogram. Я надеюсь, с установкой Python у вас не возникнет проблем. С aiogram тоже.

pip install aiogram

Лирическое отступление

Я много позаимствовал у проекта Алексея Голобурдина — автора YouTube канала «Диджитализируй!» Проблема в том, что его проект предназначен только для macOS устройств, потому что координаты берутся с помощью инструмента командной строки whereami. Пример вывода:

Также его скрипт просто выводит всю форматированную информацию в терминал, хотелось бы иметь интерфейс поприятнее и удобнее.

Я решил, что можно доработать идею и охватить максимальное количество пользователей, пренебрегая точностью информации.

Пишем код. Файл конфигурации

Итак, файл config.py содержит константы:

Токен бота BOT_API_TOKEN

Ключ OpenWeather WEATHER_API_KEY

Запрос текущей погоды CURRENT_WEATHER_API_CALL

Конечно, такие данные, как токены и ключи нужно хранить в переменных окружения, но это пет-проект, деплоить я его не буду, поэтому особо не заморачиваюсь.

Получаем координаты

Для получения координат я создал отдельный модуль. Датакласс Coordinates содержит широту и долготу с типами float.

По IP адресу их можно найти с помощью ipinfo.io/json. Получается вот такой ответ.

Нас интересует ключ «loc» сокращенно от location. Опять капитан очевидность. Делаем запрос с помощью функции urlopen модуля request библиотеки urllib. Возвращаем словарь с помощью json.load()

В функции получения координат парсим этот словарь и возвращаем датакласс координат.

Парсим ответ OpenWeather API

Далее рассмотрим модуль api_service. В нем происходит вся суета с погодой. Температура измеряется в градусах Цельсия, чему соответствует псевдоним float числа.

Как известно, градусы Фаренгейта были созданы только для того, чтобы Рэй Брэдбери смог красиво назвать свою антиутопию.

В ответе API направление ветра дается в градусах. Я решил привести их в более удобный формат. Для этого я создал перечисление основных направлений ветра.

В функции парсинга округление по 45 градусов выглядит таким образом: делим градусы на 45, округляем и умножаем обратно на 45. Результат может округлиться до 360 градусов, поэтому обрабатываем этот случай.

Все данные о погоде будут храниться в датаклассе. При желании вы можете добавить сюда остальную информацию из ответа OpenWeather, например атмосферное давление, часовой пояс, минимальную и максимальную зафиксированную в данный момент температуру.

В остальном ничего интересного в модуле не происходит, просто парсинг json.

Делаем сообщения для бота

В модуле messages собраны сообщения для бота по командам. Сообщение о погоде /weather содержит локацию, описание погоды, температуру и ее ощущение.

Сообщение о ветре /wind показывает его направление и скорость в метрах в секунду.

Ну и сообщение о времени восхода и заката солнца /sun_time . Здесь datetime объект форматируется в часы и минуты, остальное в данном случае неважно.

Нужно заметить, что при каждом вызове функции создается новый API запрос. Почему это нужно заметить? Потому что сначала я сделал бота с одним запросом и недоумевал, почему информация не меняется через время. Потому что в идеале делать один запрос в 5 или 10 минут, за это время погода не особо меняется, да и данные OpenWeather тоже не обновляются каждую секунду.

Inline клавиатура

Можно было сделать reply клавиатуру, но мне больше по душе Inline. 3 кнопки для 3 команд.

4 клавиатуры для 4 команд, добавляется команда помощи. В чем суть? После сообщения погоды нам не нужно показывать ее кнопку. Такая же логика для всех других команд, кроме помощи. Для нее выводятся кнопки всех 3 команд.

Главный модуль бота

Ну и в главном модуле бота присутствует стандартная настройка, хэндлеры сообщений и коллбэков для inline кнопок, ничего сверхъестественного.

Нужно хоть что-нибудь рассказать. Под стандартной настройкой aiogram подразумевается следующий блок кода:

Хэндлер для сообщений /start и /weather выглядит следующим образом. Все работает с помощью магии декораторов aiogram.

Хэндлер коллбэка для инлайн-кнопки погоды:

Запускаем скрипт с помощью такой конструкции:

Запускаем бота

Смотрим логирование, вы должны увидеть 3 сообщения:

Пока что все работает, давайте посмотрим по IP из Германии.

Бывают такие случаи, когда запрос долго обрабатывается. Я не обрабатывал ошибки и не делал для них сообщений, бот просто ничего не делает в таких случаях. Я посчитал, что уже и так хорошо. Как говорится:

Лучшее — враг хорошего

Работает — не трогай

Еще сотня фраз для оправдания лени

Еще тысяча успокаивающих фраз для перфекционистов

Также можно реализовать получение координат через отправление геолокации боту, тогда получится в разы точнее.

https://web.telegram.org/k/#@WeathersBothttps://web.telegram.org/k/#@WeathersBot

Name already in use

Work fast with our official CLI. Learn more about the CLI.

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

Телеграмм-бот, рассказывающий о погоде. Написан на python.

Применяются техники NLP для извлечения городов в их начальной форме и дат из текстов пользователя (пакет natasha для NLP на русском языке).

Для получения координат города по его названию используется Yandex API для перевода географических координат в адрес и наоборот.
Для получения прогноза погоды по полученным координатам используется Open Weather API.

  • Умеет говорить погоду в ЛЮБОМ городе России (за исключением каких-то мелких городов, о которых не знает API яндекса или open weather).
  • Бот умеет извлекать названия городов и приводить их названия в начальную форму (чтобы потом получить координаты данного города).
  • Бот умеет извлекать даты и приводит их единому формату (далеко не идеально, но справляется с многими кейсами).
  • На основе извлеченного названия города бот умеет давать прогноз погоды на нужную дату (в пределах 5 дней вперед).
  • Бот умеет реагировать на непонятные высказывания.
  • Бот умеет здороваться, прощаться.

Перед запуском проекта необходимо установить следующие пакеты:

  • python-telegram-bot — библиотека-обертка для работы с api телеграмма (подробнее здесь)
  • natasha — библиотека для nlp при работе с русским текстом (подробнее здесь)
  • emoji — пригодится для работы со смайликами
  • requests — для работы с Api Yandex и API Open Weather

Иметь установленный python версии >= 3.8

Загрузи все используемые библиотеки командой:
pip3 install python-telegram-bot natasha emoji requests

В файле constants/global_env_variables.py нужно задать токены для работы с апишками.

Рекомендуемый вариант: ничего не менять в коде, а задать каждую переменную в глобальном окружении своего компьютера (как создавать глобальные переменные окружения для bash/zsh здесь).
Легкий и быстрый вариант (только для локального запуска!): Ты можешь просто заменить каждую переменную в духе BOT_TOKEN = os.environ.get(‘BOT_TOKEN’) на BOT_TOKEN=»your token» .

Список всех констант-токенов, которые нужно задать:

  • в константе BOT_TOKEN подставь токен своего бота (как создать бота и получить токен можно почитать здесь)
  • в константе YANDEX_GEOCODER_API_TOKEN подставь токен для API для перевода географических координат в адрес и наоборот.
  • в константе OPEN_WEATHER_API_TOKEN подставь токен для Open Weather API.

Запусти скрипт в корне репозитория weather_bot.py

Полезные ссылочки с tutorial по написанию бота

Почему выбрана python-telegram-bot библиотека

На момент создания бота для Python имелось 2 крупных библиотеки согласно странице на официальном сайте телеграмма в разделе «Bot Code Examples»:

Обе либы разрабатывали с 2015 (согласно статистике релизов) и активно разрабатываются до сих пор. Выбор в пользу python-telegram-bot был сделан крайне примитивно: с 2015 года по 2020 он собрал в 3 раза больше звезд и форков, чем его конкурент (была цель научиться пользоваться инструментом, которое широко одобрило сообщество).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *