Бот телеграмм питон погода

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

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

nsbarsukov/weather-telegram-bot

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

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
  1. Иметь установленный python версии >= 3.8
  2. Загрузи все используемые библиотеки командой:
    pip3 install python-telegram-bot natasha emoji requests
  3. В файле 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.

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

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

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

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

About

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

Источник

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

Представляем вам статью от Максима Плачковского, автора канала PythonToday. Вы узнаете, как написать своего Telegram-бота для получения данных о погоде в любом городе нашей планеты. Мы детально рассмотрим работу с API, парсинг JSON и напишем бота на асинхронной библиотеке aiogram. А после — загрузим его на виртуальный сервер и запустим.

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

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

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

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

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

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

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

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

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

import os import datetime import requests from aiogram import Bot, types from aiogram.dispatcher import Dispatcher from aiogram.utils import executor bot = Bot(token=’your_bot_token’) dp = Dispatcher(bot)

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

import os import datetime import requests from aiogram import Bot, types from aiogram.dispatcher import Dispatcher from aiogram.utils import executor bot = Bot(token=’your_bot_token’) dp = Dispatcher(bot) @dp.message.handler(commands=[«start»]) async def start_command(message: types.Message): await message.reply(«Привет! Напиши мне название города и я пришлю сводку погоды») if __name__ == «__main__»: # С помощью метода executor.start_polling опрашиваем # Dispatcher: ожидаем команду /start executor.start_polling(dp)

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

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

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

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

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

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

@dp.message_handler() async def get_weather(message: types.Message): try: response = requests.get(f»http://api.openweathermap.org/data/2.5/weather? q=москва&lang=ru&units=metric&appid=your_token») data = response.json() except: await message.reply(«Проверьте название города!»)

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

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

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

city = data[«name»] cur_temp = data[«main»][«temp»] humidity = data[«main»][«humidity»] pressure = data[«main»][«pressure»] wind = data[«wind»][«speed»]

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

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

@dp.message_handler() async def get_weather(message: types.Message): try: response = requests.get(f»http://api.openweathermap.org/data/2.5/weather?q=москва&lang=ru&units=metric&appid=your_token») data = response.json() city = data[«name»] cur_temp = data[«main»][«temp»] humidity = data[«main»][«humidity»] pressure = data[«main»][«pressure»] wind = data[«wind»][«speed»] sunrise_timestamp = datetime.datetime.fromtimestamp(data[«sys»][«sunrise»]) sunset_timestamp = datetime.datetime.fromtimestamp(data[«sys»][«sunset»]) # продолжительность дня length_of_the_day = datetime.datetime.fromtimestamp(data[«sys»][«sunset»]) — datetime.datetime.fromtimestamp(data[«sys»][«sunrise»]) except: await message.reply(«Проверьте название города!»)

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

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

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

# получаем значение погоды weather_description = data[«weather»][0][«main»] if weather_description in code_to_smile: wd = code_to_smile[weather_description] else: # если эмодзи для погоды нет, выводим другое сообщение wd = «Посмотри в окно, я не понимаю, что там за погода. «

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

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

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

Источник

Читайте также:  Php stroka в число
Оцените статью