Собираем телеграм-бота с прогнозом погоды
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
[anycomment]
Exit mobile version