Недавно мы разобрали новый бесплатный курс практикума «Прогноз погоды на 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')
Теперь нам нужно это интегрировать в бота. Логика будет такая:
- После старта бот ждёт название города. Каждое сообщение, что пришлёт пользователь, будет считаться таким названием.
- Как только пользователь что-то присылает, бот подставляет город из сообщения и отправляет запрос в службу погоды.
- После ответа от службы бот формирует сообщение о погоде и отправляет обратно пользователю.
- Дальше всё повторяется: мы боту пишем город и получаем в ответ погоду в этом городе.
Добавим скрипт с погодой в код с ботом:
# подключаем модуль для Телеграма
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('❌❌❌❌❌ Сработало исключение! ❌❌❌❌❌')