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

Как парсить погоду в телеграмм

  • автор:

Соединяем парсер погоды на Python с ботом в Telegram (Урок №7)

Доброго времени суток, сегодня наша задача, это соединить написанный ранее парсер погоды с ботом Telegram написанным при помощи aiogram.

Для начала создадим помимо основного файла, файл где будет хранится наш токен, назовем его config.py

Соединяем парсер погоды на Python с ботом в Telegram (Урок №7), изображение №1

Запишем в него наш токен, полученный в уроке №6

Соединяем парсер погоды на Python с ботом в Telegram (Урок №7), изображение №2

Импортируем нужные нам библиотеки:

Соединяем парсер погоды на Python с ботом в Telegram (Урок №7), изображение №3

requests и beautifulsoup нужны для парсинга погоды, config это наш файл где хранится токен бота.

Из aiogram мы импортируем Bot собственно наш бот, Dispatcher — отправитель сообщений, executor — отправитель запросов на сервер телеграма

Далее будем переписывать и немного дорабатывать код написанный в статье Парсим погоду на Python (парсер погоды)

Функцию get_html получения html оставляем как есть

Соединяем парсер погоды на Python с ботом в Telegram (Урок №7), изображение №4

Но немного скорректируем функцию получения погоды get_weather. Функция будет получать message, это то что будет вводить пользователь. Вместо принтов, присвоим нашу строку с температурой и описанием погоды в переменную result и вернем ее из функции

Как я сделал телеграм-бота, который сообщает, что надеть по погоде

И привел туда 65 000 пользователей без затрат на рекламу и навыков программирования.

Идея бота возникла не только на почве банального «пойти налегке и замерзнуть вечером или носить весь день c собой куртку», но и еще по двум причинам:

1) в течение дня температуре свойственно меняться, а выбор в одежде иногда приходится делать всего раз в день

2) зачастую остаются незамеченными ветер и влажность, которые по итогу значительно влияют на то, как ощущается температура

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

Не имея за душой ни строчки кода, собирать бота я полез на конструктор botmother, в котором есть возможность делать простые API-запросы, например к погодным сервисам и получать всю необходимую информацию. Схема работы бота выглядит так:

1) бот запрашивает данные погоды в выбранном пользователем городе

2) рассчитывает температуру «по ощущениям» для каждого часа

3) определяет средние значения для утра, полудня и вечера

4) по ним подбирает одежду из каталога, составленного на основе собственных наблюдений

5) присылает сообщение с прогнозом одежды

Пользователь видит только:

Вид бота изнутри:

Про 65 000 пользователей:

Это вышло случайно. Когда я доделал бота и задумался, где взять аудиторию, то без задней мысли снял несколько простеньких видео в тикток, два из которых неожиданно собрали в сумме больше полмиллиона просмотров, причем 10% из просмотревших выходили вручную открывали телеграм и находили бота через поиск(в тиктоке нельзя прикреплять ссылки в описание).

Позже я пробовал встраивать в другие ролики инфу про бота в виде рекламы, но в таком виде трюк уже не срабатывал. Повторная загрузка одного и того же видео иногда давала неплохой результат, до 100к просмотров. Также пробовал загружать одно и то же виде с разных аккаунтов — на одном из пяти собрал 50к просмотров, на остальных — ноль. Была даже концептуальная короткометражка, но больше 5к просмотров в тиктоке она не собрала.

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

Кому интересно пожмакать бота, вот ссылка: https://tele.gg/pogodarlingbot

Напомнило другое полезное приложение погоды на телефон

Где такое скачать?)

Симферополь переходил из рук в руки.

Белгород нужно вводить )

Бот уже монетизируется из гос. бюджета )))

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

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

Потом добавить подборку исторических фактов в духе 《В этот день в 2012 году на Ольге Бузовой было надето *clothes_name*》 и по вашей логике вообще все должны ссаться от счастья

Не, надо чтоб юзер отфотка весь свой гардероб, ИИ его классифицировала и предлагала лучший лук на основании погоды, истории (чтоб каждый день не повторятся), места (робота, ресторан) + монетизация — рекомендоции по покупкам из WB, lamoda и прочих спонсоров.

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

Но это уже не бот, должен быть отдельный апп.

Ну и конечно нет гарантии о том что все это разобьется о лень юзера фоткать гардероб.

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

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

Пишем 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

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

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