Собираем телеграм-бота с прогнозом погоды
medium

Собираем телеграм-бота с прогнозом погоды

Мы ему город, а он нам — погоду и рекомендации, как одеться

Недавно мы разобрали новый бесплатный курс практикума «Прогноз погоды на Python за час». Там мы пошагово написали скрипт, который отправляет в погодный сервис название города, а в ответ получает температуру и то, как она ощущается.

Сегодня сделаем к этому скрипту удобный интерфейс — напишем телеграм-бота, который будет давать нам погоду и рекомендации по тому, как одеться. Для этого нам понадобится Python:

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

Мы уже собирали несколько телеграм-ботов, поэтому возьмём уже готовый код и немного поменяем его под нашу задачу. Но сначала нам нужен телеграм-бот — для этого идём в статью «Телеграм-бот на Python», по очереди выполняем каждый шаг и через 5 минут получаем его ник в телеграме и ключ доступа, который выглядит примерно так:

123456789:AAAAA12345678abcdef12345678abcdef

Это единственное, что нам понадобится в скрипте, поэтому сохраните этот код после создания бота.

Теперь идём в статью про простой проект телеграм-бота и копируем оттуда код. Чтобы всё заработало, замените токен для доступа к боту на свой:

# подключаем модуль для Телеграма
import telebot

# указываем токен для доступа к боту
bot = telebot.TeleBot(123456789:AAAAA12345678abcdef12345678abcdef')

# приветственный текст
start_txt = 'Привет! Это журнал «Код». \n\nТеперь у бота появился бэкенд.'


# обрабатываем старт бота
@bot.message_handler(commands=['start'])
def start(message):
    # выводим приветственное сообщение
    bot.send_message(message.from_user.id, start_txt, parse_mode='Markdown')

# запускаем бота
if __name__ == '__main__':
    while True:
        # в бесконечном цикле постоянно опрашиваем бота — есть ли новые сообщения
        try:
            bot.polling(none_stop=True, interval=0)
        # если возникла ошибка — сообщаем про исключение и продолжаем работу
        except Exception as e: 
            print('❌❌❌❌❌ Сработало исключение! ❌❌❌❌❌')

Сразу поменяем приветственный текст — пусть он объясняет, как работает бот:

start_txt = 'Привет! Это бот прогноза погоды. \n\nОтправьте боту название города и он скажет, какая там температура и как она ощущается.'

Запускаем код и пишем в боте команду /start:

Собираем телеграм-бота с прогнозом погоды

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

Добавляем прогноз погоды

У нас уже есть готовый скрипт для прогноза погоды — возьмём его из статьи с разбором курса «Практикума». Если хотите понять, как и откуда взялась каждая строчка, — почитайте разбор, там интересно и с картинками.

# подключаем библиотеку для работы с запросами
import requests
# указываем город
city = 'Сочи'
# формируем запрос
url = 'https://api.openweathermap.org/data/2.5/weather?q='+city+'&units=metric&lang=ru&appid=79d1ca96933b0328e1c7e3e7a26cb347'
# отправляем запрос на сервер и сразу получаем результат
weather_data = requests.get(url).json()
# получаем данные о температуре и о том, как она ощущается
temperature = round(weather_data['main']['temp'])
temperature_feels = round(weather_data['main']['feels_like'])
# выводим значения на экран
print('Сейчас в городе', city, str(temperature), '°C')
print('Ощущается как', str(temperature_feels), '°C')

Теперь нам нужно это интегрировать в бота. Логика будет такая:

  1. После старта бот ждёт название города. Каждое сообщение, что пришлёт пользователь, будет считаться таким названием.
  2. Как только пользователь что-то присылает, бот подставляет город из сообщения и отправляет запрос в службу погоды.
  3. После ответа от службы бот формирует сообщение о погоде и отправляет обратно пользователю.
  4. Дальше всё повторяется: мы боту пишем город и получаем в ответ погоду в этом городе.

Добавим скрипт с погодой в код с ботом:

# подключаем модуль для Телеграма
import telebot
import requests

# указываем токен для доступа к боту
bot = telebot.TeleBot(123456789:AAAAA12345678abcdef12345678abcdef')

# приветственный текст
start_txt = 'Привет! Это бот прогноза погоды. \n\nОтправьте боту название города и он скажет, какая там температура и как она ощущается.'


# обрабатываем старт бота
@bot.message_handler(commands=['start'])
def start(message):
    # выводим приветственное сообщение
    bot.send_message(message.from_user.id, start_txt, parse_mode='Markdown')

# обрабатываем любой текстовый запрос
@bot.message_handler(content_types=['text'])
def weather(message):
    # получаем город из сообщения пользователя
  city = message.text
  # формируем запрос
  url = 'https://api.openweathermap.org/data/2.5/weather?q='+city+'&units=metric&lang=ru&appid=79d1ca96933b0328e1c7e3e7a26cb347'
  # отправляем запрос на сервер и сразу получаем результат
  weather_data = requests.get(url).json()
  # получаем данные о температуре и о том, как она ощущается
  temperature = round(weather_data['main']['temp'])
  temperature_feels = round(weather_data['main']['feels_like'])
  # формируем ответы
  w_now = 'Сейчас в городе ' + city + ' ' + str(temperature) + ' °C'
  w_feels = 'Ощущается как ' + str(temperature_feels) + ' °C'
  # отправляем значения пользователю
  bot.send_message(message.from_user.id, w_now)
  bot.send_message(message.from_user.id, w_feels)
  

# запускаем бота
if __name__ == '__main__':
    while True:
        # в бесконечном цикле постоянно опрашиваем бота — есть ли новые сообщения
        try:
            bot.polling(none_stop=True, interval=0)
        # если возникла ошибка — сообщаем про исключение и продолжаем работу
        except Exception as e: 
            print('❌❌❌❌❌ Сработало исключение! ❌❌❌❌❌')
Собираем телеграм-бота с прогнозом погоды

Добавляем рекомендации

Чтобы получить от бота больше пользы, добавим рекомендации. Например, пусть бот предупредит нас, когда ветер будет слишком сильный. Для этого идём на страницу официальной документации погодного сервиса и находим там свойство  wind.speed — оно как раз отвечает за скорость ветра. Запишем скорость в отдельную переменную:

wind_speed = round(weather_data['wind']['speed'])

Теперь прикрутим такую логику:

  • если до 5 метров в секунду — пишем, что ветра нет;
  • если от 5 до 10 — пишем про ветреную погоду;
  • если от 10 до 20 — говорим, что ветер очень сильный;
  • выше 20 — говорим, что на улицу лучше не выходить.

Добавим такой блок после отправки сообщений о температуре:

wind_speed = round(weather_data['wind']['speed'])
  if wind_speed < 5:
      bot.send_message(message.from_user.id, '✅ Погода хорошая, ветра почти нет')
  elif wind_speed < 10:
      bot.send_message(message.from_user.id, '🤔 На улице ветрено, оденьтесь чуть теплее')
  elif wind_speed < 20:
      bot.send_message(message.from_user.id, '❗️ Ветер очень сильный, будьте осторожны, выходя из дома')
  else:
      bot.send_message(message.from_user.id, '❌ На улице шторм, на улицу лучше не выходить')

Перезапустим бота и посмотрим на результат:

Собираем телеграм-бота с прогнозом погоды

# подключаем модуль для Телеграма
import telebot
import requests


# указываем токен для доступа к боту
bot = telebot.TeleBot('123456789:AAAAA12345678abcdef12345678abcdef')

# приветственный текст
start_txt = 'Привет! Это бот прогноза погоды. \n\nОтправьте боту название города и он скажет, какая там температура и как она ощущается.'


# обрабатываем старт бота
@bot.message_handler(commands=['start'])
def start(message):
    # выводим приветственное сообщение
    bot.send_message(message.from_user.id, start_txt, parse_mode='Markdown')

# обрабатываем любой текстовый запрос
@bot.message_handler(content_types=['text'])
def weather(message):
    # получаем город из сообщения пользователя
  city = message.text
  # формируем запрос
  url = 'https://api.openweathermap.org/data/2.5/weather?q='+city+'&units=metric&lang=ru&appid=79d1ca96933b0328e1c7e3e7a26cb347'
  # отправляем запрос на сервер и сразу получаем результат
  weather_data = requests.get(url).json()
  print(weather_data)
  # получаем данные о температуре и о том, как она ощущается
  temperature = round(weather_data['main']['temp'])
  temperature_feels = round(weather_data['main']['feels_like'])
  # формируем ответы
  w_now = 'Сейчас в городе ' + city + ' ' + str(temperature) + ' °C'
  w_feels = 'Ощущается как ' + str(temperature_feels) + ' °C'
  # отправляем значения пользователю
  bot.send_message(message.from_user.id, w_now)
  bot.send_message(message.from_user.id, w_feels)
  # сообщаем про ветреную погоду
  wind_speed = round(weather_data['wind']['speed'])
  if wind_speed < 5:
      bot.send_message(message.from_user.id, '✅ Погода хорошая, ветра почти нет')
  elif wind_speed < 10:
      bot.send_message(message.from_user.id, '🤔 На улице ветрено, оденьтесь чуть теплее')
  elif wind_speed < 20:
      bot.send_message(message.from_user.id, '❗️ Ветер очень сильный, будьте осторожны, выходя из дома')
  else:
      bot.send_message(message.from_user.id, '❌ На улице шторм, на улицу лучше не выходить')  

# запускаем бота
if __name__ == '__main__':
    while True:
        # в бесконечном цикле постоянно опрашиваем бота — есть ли новые сообщения
        try:
            bot.polling(none_stop=True, interval=0)
        # если возникла ошибка — сообщаем про исключение и продолжаем работу
        except Exception as e: 
            print('❌❌❌❌❌ Сработало исключение! ❌❌❌❌❌')

Художник:

Алексей Сухов

Корректор:

Ирина Михеева

Вёрстка:

Кирилл Климентьев

Соцсети:

Аня Соколова

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Вам может быть интересно
medium