Как создать Telegram-бота для мониторинга погоды на Python
В статье делимся пошаговой инструкцией, как написать Telegram-бота для получения данных о погоде и задеплоить его на виртуальный сервер.
Эта инструкция — часть курса «Как создавать Telegram-ботов».
Смотреть весь курс
Введение
Всем привет! Меня зовут Максим Плачковский, я автор канала PythonToday. Из этой статьи вы узнаете, как написать своего Telegram-бота для получения данных о погоде в любом городе нашей планеты. Мы детально рассмотрим работу с API, парсинг JSON и напишем бота на асинхронной библиотеке aiogram. А после — загрузим его на виртуальный сервер и запустим.
Подготовка API и рабочего окружения
Перед написанием кода нужно получить API-токены для работы с сервисом OpenWeather и Telegram-ботом, а также подготовить рабочее окружение.
Получаем токен OpenWeather
Начнем с самого простого: зарегистрируемся на официальном сайте и в разделе My API keys создадим токен.

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

Импортируем необходимые библиотеки
Для работы нам понадобятся модули requests и aiogram — установим их.
pip install 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 — все работает: бот возвращает нужное сообщение.

Обрабатываем входные данные
Теперь добавим функцию, которая будет реагировать на текстовые сообщения с названиями городов. Она должна проверять их на корректность и выводить ошибку, если валидация не была пройдена.
@dp.message_handler() async def get_weather(message: types.Message): pass
OpenWeather должен принимать название города через API и возвращать данные о погоде. Исходя из документации, кроме названия города запрос должен содержать API-токен.

Усовершенствуем запрос: в параметр q будем передавать город, добавим параметр lang=ru , чтобы API работал с кириллицей. А также используем units=metric для установки метрической системы:
http://api.openweathermap.org/data/2.5/weather?q=москва&lang=ru&units=metric&appid=наш_токен
Теперь добавим блок 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("Проверьте название города!")
Отправим запрос через браузер и посмотрим, какая температура, например, в Бангкоке.

В ответе получаем не только данные о температуре, но и облачность, давление, влажность, время заката, рассвета и другие величины.
Парсим JSON
Приступим к парсингу ответа 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. Извлечем эти данные и преобразуем в секунды.
# получаем время рассвета и преобразуем его в читабельный формат sunrise_timestamp = datetime.datetime.fromtimestamp(data["sys"]["sunrise"]) # то же самое проделаем со временем заката sunset_timestamp = datetime.datetime.fromtimestamp(data["sys"]["sunset"])
Зная время рассвета и заката, мы можем вернуть пользователю продолжительность дня. В результате получается следующее:
@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 — он хранит описание погоды. На его основе мы можем создать свою коллекцию с эмодзи под разные ситуации.
code_to_smile =
Также напишем условие, чтобы в случае специфической погоды, для которой эмодзи не предусмотрен, программа не ломалась, а выводила специальное сообщение.
# получаем значение погоды weather_description = data["weather"][0]["main"] if weather_description in code_to_smile: wd = code_to_smile[weather_description] else: # если эмодзи для погоды нет, выводим другое сообщение wd = "Посмотри в окно, я не понимаю, что там за погода. "
Возвращаем данные пользователю
Данные собрали — время отдать их пользователю. Сформируем строки с датой и временем, погодой, влажностью и другими данными. Главное — учесть формат данных. Например, OpenWeather возвращает значение давления в гектопаскалях. Так, если вы хотите отдавать пользователю данные в миллиметрах ртутного столба, значение нужно разделить на 1.33 и округлить в большую сторону.
await message.reply(f""\n f"Погода в городе: \nТемпература: °C \n" f"Влажность: %\nДавление: мм.рт.ст\nВетер: м/с \n" f"Восход солнца: \nЗакат солнца: \nПродолжительность дня: \n" f"Хорошего дня!" )
Супер — бот работает и возвращает данные в удобочитаемом формате!

Деплой бота
Сейчас синоптик запущен на компьютере. Это неудобно, если вы хотите общаться с ним круглосуточно. Ведь тогда нужно поддерживать бесперебойную работу компьютера и постоянное соединение с интернетом.
Облачные серверы с гибкой производительностью ядра vCPU
Бота лучше перенести в облако. Поскольку затраты процессора на работу с простым Open Weather API минимальны, будет достаточно виртуального сервера с 1 vCPU и 1 ГБ оперативной памяти. С учетом выделенного IP-адреса такая конфигурация выйдет примерно в 30 ₽/день.
Для начала зарегистрируемся в панели управления и создадим новый сервер в разделе Облачная платформа. Затем настроим его.

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

Последним шагом нужно создать .service-файл, который будет автоматически поднимать бота в случае перезагрузки сервера.


Запускаем командой: systemctl enable tg_bot.service
Проверяем статус: systemctl status tg_bot.service
И перезапускаем .service-файл: systemctl restart tg_bot.service

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

Заключение
Следуя инструкции, каждый может создать бота для мониторинга погоды. А использование виртуальной машины из линейки Shared Line позволит избежать капитальных затрат. Платите только за потребленные ботом мощности по модели pay-as-you-go, а также экономьте на неполной загрузке ядра.
Автор: Максим Плачковский, создатель канала PythonToday
Как подключить платежную систему с Payments к Telegram
Как разработать веб-приложение (интернет-магазин) в Telegram
Зарегистрируйтесь в панели управления
И уже через пару минут сможете арендовать сервер, развернуть базы данных или обеспечить быструю доставку контента.
Читайте также:
Инструкция
Как создать 100 серверов в облаке за минуту? Работа с OpenStack клиентом
Инструкция
Как создать веб-приложение на базе Telegram Mini Apps
Инструкция
Что делает команда chmod и как ее использовать в Linux
«Карманный синоптик за час». Пишем Telegram-бота для мониторинга погоды на Python
Представляем вам статью от Максима Плачковского, автора канала PythonToday. Вы узнаете, как написать своего Telegram-бота для получения данных о погоде в любом городе нашей планеты. Мы детально рассмотрим работу с API, парсинг JSON и напишем бота на асинхронной библиотеке aiogram. А после — загрузим его на виртуальный сервер и запустим.
Подготовка API и рабочего окружения
Перед написанием кода нужно получить API-токены для работы с сервисом OpenWeather и Telegram-ботом, а также подготовить рабочее окружение.
Получаем токен OpenWeather
Начнем с самого простого: зарегистрируемся на официальном сайте и в разделе My API keys создадим токен.
После того, как вы создали API-ключ, дайте ему немного «отлежаться» — обычно это занимает 10-15 минут. Спустя это время можно общаться с OpenWeather с помощью сгенерированного токена.
Генерируем токен для Telegram-бота
Ключ для Telegram-бота можно получить у @BotFather, введя /newbot — команду для создания и регистрации нового бота. Во время настройки придумайте боту логин и название — например, Weather Bot. Есть также опциональные настройки: текст приветствия, изображение. Используйте, если хотите получить более уникального бота!
Импортируем необходимые библиотеки
Для работы нам понадобятся модули requests и aiogram — установим их.
pip install 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 — все работает: бот возвращает нужное сообщение.
Обрабатываем входные данные
Теперь добавим функцию, которая будет реагировать на текстовые сообщения с названиями городов. Она должна проверять их на корректность и выводить ошибку, если валидация не была пройдена.
@dp.message_handler() async def get_weather(message: types.Message): pass
OpenWeather должен принимать название города через API и возвращать данные о погоде. Исходя из документации, кроме названия города запрос должен содержать API-токен.
Усовершенствуем запрос: в параметр q будем передавать город, добавим параметр lang=ru, чтобы API работал с кириллицей. А также используем units=metric для установки метрической системы:
http://api.openweathermap.org/data/2.5/weather?q=москва&lang=ru&units=metric&appid=наш_токен
Теперь добавим блок 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(«Проверьте название города!»)
Отправим запрос через браузер и посмотрим, какая температура, например, в Бангкоке.
В ответе получаем не только данные о температуре, но и облачность, давление, влажность, время заката, рассвета и другие величины.
Парсим JSON
Приступим к парсингу ответа 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 — он хранит описание погоды. На его основе мы можем создать свою коллекцию с эмодзи под разные ситуации.
code_to_smile = < "Clear": "Ясно \U00002600", "Clouds": "Облачно \U00002601", "Rain": "Дождь \U00002614", "Drizzle": "Дождь \U00002614", "Thunderstorm": "Гроза \U000026A1", "Snow": "Снег \U0001F328", "Mist": "Туман \U0001F32B" >
Также напишем условие, чтобы в случае специфической погоды, для которой эмодзи не предусмотрен, программа не ломалась, а выводила специальное сообщение.
# получаем значение погоды weather_description = data[«weather»][0][«main»] if weather_description in code_to_smile: wd = code_to_smile[weather_description] else: # если эмодзи для погоды нет, выводим другое сообщение wd = «Посмотри в окно, я не понимаю, что там за погода. «
Возвращаем данные пользователю
Данные собрали — время отдать их пользователю. Сформируем строки с датой и временем, погодой, влажностью и другими данными. Главное — учесть формат данных. Например, OpenWeather возвращает значение давления в гектопаскалях. Так, если вы хотите отдавать пользователю данные в миллиметрах ртутного столба, значение нужно разделить на 1.33 и округлить в большую сторону.
Супер — бот работает и возвращает данные в удобочитаемом формате!
Погода бот на python
На тему телеграмм ботов много материал, но погода бота я не находил и поэтому для себя и своих братьев написал свой собственный бот на Python.
В первую очередь нам нужна среда разработки для меня это Pycharm от нашей питерской компании. Установка проста как три рубля поэтому на ней останавливаться не буду.
Пока устанавливается Pycharm, нужно получить токены:
- для бота от телеграмма,
- для доступа к api accuweather
- для доступа к api yandex.weather
Итак, для получения токена от телеграмма Вам необходимо написать @BotFather и следовать инструкции (инструкций по созданию телеграмм-бота полно в интернете).
По accuweather необходимо зарегистрироваться как разработчику на сайте https://developer.accuweather.com/ во вкладке My Apps добавить новое приложение, App Name это соответственно имя, далее выбираем Limited Trial, Where will the API be used? Выбираем Other, What will you be creating with this API? Выбираем Internal App и Weather App, What programming language is your APP written in? – Python, Is this for Business to Business or Business to Consumer use? — Business to Consumer, Is this Worldwide or Country specific use? – Worldwide, или выбираем Russia или та страна в которой планируется использовать, и последний вопрос What is the public launch date? Тут все просто дата с которой планируется запустить приложение. И нажимаем Create App. После этого вы снова попадете во вкладку My Apps щелкнув по названию своего приложения вы увидите API Key он то Вам и нужен!
Далее нам нужен токен от яндекса. Если у Вас нет почты от яндекса, то создаем, а потом переходим на сайт https://developer.tech.yandex.ru/services/ нажимаем подключить API. Выбираем API Яндекс.Погоды там будет всплывающее окно с вводом фамилии имени, название компании, номер телефона, город и нужно выбрать бесплатный тариф погода на вашем. Нажимаем перейти к API, там будет KEY #1 вот он то Вам и нужен.
Все токены поместим в переменные среды, об этом в конце статьи.
Запускаем pycharm создаем новый проект.
Переходим в Main.py и в первую очередь устанавливаем дополнительные библиотеки:
В нижнем ряду окна нажимаем кнопку Python Packages, в поиске вводим requests и нажимаем install, тоже повторяем для pyTelegramBotAPI и geopy.
Затем в main.py импортируем библиотеки и токены:
import json import telebot import requests as req from geopy import geocoders from os import environ token = environ['token_bot'] token_accu = environ['token_accu'] token_yandex = environ['token_yandex']
Все вся подготовка сделана, теперь переходим к написанию самого бота
Для того чтобы получить прогноз от accuweather нужен уникальный код города, чтобы его получить нужны его координаты, так же координаты города нам понадобятся при запросе к яндексу, поэтому в первую очередь пишем функцию получения координат через библиотеку geopy:
def geo_pos(city: str): geolocator = geocoders.Nominatim(user_agent="telebot") latitude = str(geolocator.geocode(city).latitude) longitude = str(geolocator.geocode(city).longitude) return latitude, longitude
Теперь получаем код города:
def code_location(latitude: str, longitude: str, token_accu: str): url_location_key = f'http://dataservice.accuweather.com/locations/v1/cities/geoposition/search?apikey=&q=,&language=ru' resp_loc = req.get(url_location_key, headers=) json_data = json.loads(resp_loc.text) code = json_data['Key'] return code
На вход функции даем координаты и токен, префикс “f” перед строкой дает нам вставлять значения переменных в нужные места вместо текста. Далее мы отправляем запрос по указанному url и с нужным заголовком. Хоть resp_loc.text и выглядит как стандартный словарь python на самом деле это json-объект, его нужно переделать в словарь, по ключу ‘Key’ получаем код города.
После этого можно написать уже код получения непосредственно прогноза:
def weather(cod_loc: str, token_accu: str): url_weather = f'http://dataservice.accuweather.com/forecasts/v1/hourly/12hour/?apikey=&language=ru&metric=True' response = req.get(url_weather, headers=) json_data = json.loads(response.text) dict_weather = dict() dict_weather['link'] = json_data[0]['MobileLink'] dict_weather['сейчас'] = for i in range(len(json_data):1:): time = 'через' + str(i) + 'ч' dict_weather[time] = return dict_weather
По ключу ‘link’ сохраним ссылку на полный прогноз, сохраним погоду сейчас, далее нам понадобится в цикле перебрать оставшиеся часы и так же сохранить их в словаре.
Далее нам нужно получить погоду от яндекса:
def yandex_weather(latitude, longitude, token_yandex: str): url_yandex = f'https://api.weather.yandex.ru/v2/informers/?lat=&lon=&[lang=ru_RU]' yandex_req = req.get(url_yandex, headers=, verify=False) conditions = wind_dir = yandex_json = json.loads(yandex_req.text) yandex_json['fact']['condition'] = conditions[yandex_json['fact']['condition']] yandex_json['fact']['wind_dir'] = wind_dir[yandex_json['fact']['wind_dir']] for parts in yandex_json['forecast']['parts']: parts['condition'] = conditions[parts['condition']] parts['wind_dir'] = wind_dir[parts['wind_dir']] pogoda = dict() params = ['condition', 'wind_dir', 'pressure_mm', 'humidity'] for parts in yandex_json['forecast']['parts']: pogoda[parts['part_name']] = dict() pogoda[parts['part_name']]['temp'] = parts['temp_avg'] for param in params: pogoda[parts['part_name']][param] = parts[param] pogoda['fact'] = dict() pogoda['fact']['temp'] = yandex_json['fact']['temp'] for param in params: pogoda['fact'][param] = yandex_json['fact'][param] pogoda['link'] = yandex_json['info']['url'] return pogoda
Начинаем стандартно, но есть нюанс направление ветра и состояние неба в ответе от яндекса пишется на английском языке, делаем словари conditions и wind_dir для перевода. В ответе только фактическая погода и прогноз на следующих два периода (можно сделать и более подробно, но в бесплатном варианте только так). Сразу в словаре меняем направление ветра и состояние неба. Далее создаем новый словарь и забираем только то что нам нужно из всего ответа. При отладке кода стоит отметить, что в бесплатной версии api яндекса допускается только 50 запросов в сутки.
Далее нам стоит написать функции которые будут отправлять ответом прогнозы. Начнем с аккувезер:
def print_weather(dict_weather, message): bot.send_message(message.from_user.id, f'Разрешите доложить, Ваше сиятельство!' f' Температура сейчас !' f' А на небе .' f' Температура через три часа !' f' А на небе .' f' Температура через шесть часов !' f' А на небе .' f' Температура через девять часов !' f' А на небе .') bot.send_message(message.from_user.id, f' А здесь ссылка на подробности ' f'')
В эту функцию мы должны погрузить вывод функции weather и сообщение на которое мы отвечаем. В самой функции мы отправляем сообщение с текстом и ссылками на тот словарь из функции weather. В конце отправляем сообщение со ссылкой на полный прогноз.
Далее делаем сообщение с погодой от яндекса:
def print_yandex_weather(dict_weather_yandex, message): day = bot.send_message(message.from_user.id, f'А яндекс говорит:') for i in dict_weather_yandex.keys(): if i != 'link': time_day = day[i] bot.send_message(message.from_user.id, f'Температура ' f', на небе ') bot.send_message(message.from_user.id, f' А здесь ссылка на подробности ' f'')
здесь так же скармливаем функции выход функции yandex_weather и сообщение на которое отвечаем. Здесь создаем словарь с переводом времени дня, затем отправляем сообщение, далее задаем цикл по ключам словаря из выхода функции yandex_weather если ключ не link то отправляем сообщение: температура , на небе . В конце отправляем ссылку на яндекс (это требование яндекса).
И наконец обобщающая функция:
def big_weather(message, city): latitude, longitude = geo_pos(city) cod_loc = code_location(latitude, longitude, token_accu) you_weather = weather(cod_loc, token_accu) print_weather(you_weather, message) yandex_weather_x = yandex_weather(latitude, longitude, token_yandex) print_yandex_weather(yandex_weather_x, message)
В нее мы погружаем сообщение и город. Определяем координаты, запрашиваем accuweather и пишем сообщение на основе данных от него, потом тоже самое от яндекса.
Нужна ещё функция сохранения городов:
def add_city(message): try: latitude, longitude = geo_pos(message.text.lower().split('город ')[1]) global cities cities[message.from_user.id] = message.text.lower().split('город ')[1] with open('cities.json', 'w') as f: f.write(json.dumps(cities)) return cities, 0 except Exception as err: return cities, 1
Сперва проверяем существование такого города если все ок то все что после слова город сохраняем в словарь cities под ключом id пользователя. Можно было бы использовать имя, но это только если Вы уверены, что сервисом будут пользоваться люди с разными именами.
Так все вспомогательные функции мы описали теперь функции ответа на сообщения:
@bot.message_handler(command=['start', 'help']) def send_welcome(message): bot.reply_to(message, f'Я погодабот, приятно познакомитсья, ')
Здесь мы просто представляемся при первом посещении.
А вот и самая большая функция:
bot.message_handler(content_types=['text']) def get_text_messages(message): global cities if message.text.lower() == 'привет' or message.text.lower() == 'здорова': bot.send_message(message.from_user.id, f'О великий и могучий ! Позвольте Я доложу ' f' Вам о погоде! Напишите слово "погода" и я напишу погоду в Вашем' f' "стандартном" городе или напишите название города в котором Вы сейчас') elif message.text.lower() == 'погода': if message.from_user.id in cities.keys(): city = cities[message.from_user.id] bot.send_message(message.from_user.id, f'О великий и могучий !' f' Твой город ') big_weather(message, city) else: bot.send_message(message.from_user.id, f'О великий и могучий !' f' Я не знаю Ваш город! Просто напиши:' f'"Мой город *****" и я запомню твой стандартный город!') elif message.text.lower()[:9] == 'мой город': cities, flag = add_city(message) if flag == 0: bot.send_message(message.from_user.id, f'О великий и могучий !' f' Теперь я знаю Ваш город! это' f' ') else: bot.send_message(message.from_user.id, f'О великий и могучий !' f' Что то пошло не так :(') else: try: city = message.text bot.send_message(message.from_user.id, f'Привет ! Твой город ') big_weather(message, city) except AttributeError as err: bot.send_message(message.from_user.id, f'! Не вели казнить,' f' вели слово молвить! Я не нашел такого города!' f'И получил ошибку , попробуй другой город')
В первой части если автор сообщения сказал «привет» или «здарова» мы просто здороваемся и напоминаем, то что мы ждем от автора сообщения.
Если написал «погода» то уточняемся есть ли он в нашем списке и если есть, то сообщаем название города и выполняем функцию big_weather.
Если пользователя нет, то предлагаем ему задать его стандартный город.
Если пользователь написал «Мой город *****», то пользователя. И сообщаем что город записан, если что-то пошло не так, то сообщаем об этом.
Во всех остальных случаях мы сообщение воспринимаем как название города. Если города такого не находится то сообщаем об этом.
ну и собственно нам нужно записать всю программу (это наверное самое короткое):
bot = telebot.TeleBot(token) with open('cities.json', encoding='utf-8') as f: cities = json.load(f) bot.polling(none_stop=True)
Здесь мы создаем объект bot, потом открываем json файл с архивом городов и id пользователей. И наконец запускаем в бесконечном цикле бота.
На этом можно закончить, но в целом функционал можно расширять, можно было бы добавить гисметео или rp5, но у этих товарищей нет бесплатных версий прогноза L.
И теперь нам нужно все это запустить на сервере.
Для этого нам нужен собственно сам сервер я например арендовал на джино, это не реклама просто констатация факта. это обходится 3,19 рублей в день.

Для создания своего аккаунта достаточно иметь аккаунт в google. Для целей телеграмм бота достаточно самого дешевого сервера.


И нажимаем создать сервер.
После выделения Вам сервера можно будет попасть в его меню.

Здесь можно посмотреть обзор сервера его загруженность и самое главное параметры для ssh соединения и задать пароль для root (это нужно сделать обязательно).

Для подключения по SSH нам нужна программа putty она бесплатная. Устанавливаем, запускаем и видим окно:

В host-name вписываем хост из данных от джино и подключаемся, появляется командная строка вводим логин root нажимаем enter после чего вводим пароль который мы задали ранее.
Так теперь нам нужно установить python для этого в командной строке пишем
sudo apt install python3
и обновляем pip
sudo apt install python3-pip
Далее устанавливаем все библиотеки которые устанавливали в начале:
pip install requests
pip install geopy
pip install pyTelegramBotAPI
Переходим в каталог cd /usr/bin/
Создаем каталог mkdir telegrambot/
Открываем командную строку в виндовс
pscp -P (здесь указываем порт джино) C:\(путь к проекту)\ root@»указываем имя сервера»:/usr/bin/telegrambot/
Он попросит ввести пароль, вводим пароль от root.
после копирования переходим на окно putty проверяем что все скопировалось командной ls.
В начале статьи я писал что токены сохраним в переменные среды. Мне проще было сделать так:
- В командной строке винды пишем: pscp -P (здесь указываем порт джино) root@»указываем имя сервера»:/etc/environment C:\(путь к проекту)\environment
- открываем блокнотом скачанный файл и вписываем наши перменные каждую на отдельной строке: token_bot=ваш токен для бота token_accu=ваш токен для accuweather token_yandex=ваш токен для яндекса
- Сохраняем
- Отправляем этот файл обратно: pscp -P (здесь указываем порт джино) C:\(путь к проекту)\environment root@»указываем имя сервера»:/etc/environment
Закрываем putty и открываем его снова. Входим как и ранее. для проверки добавления переменных среды в консоли вводим команду export. Должны отобразиться все переменные среды, включая Ваши.
После чего запускаем python3 /usr/bin/telegrambot/ main.py
Все, телеграм бот работает.
Создание чат-бота “прогноз погоды” на Python.
Друзья, если вы хотите попробовать свои силы в программировании на Python и создать собственного Telegram-бота, который будет уведомлять вас об актуальной погоде, регистрируйтесь на интенсивный онлайн тренинг Артема Мураховского!
Если вы еще не знакомы с Python, мы поможем легко и быстро войти в разработку на этом языке. Минимум теории, максимум практики — смотрите и делайте с нами! Что будет непонятно, обсудим по ходу.
Кому это будет полезно:
- Новичкам. Если вы никогда не программировали — не проблема. У вас есть шанс сделать свою первую программу на Python и получить опыт практического применения данного языка программирования в создании полезного софта. Тренер поможет вам понять все тонкости создания кода.
- Начинающим Python разработчикам. Вы сможете углубить и применить на практике свои знания языка Python вместе с наставником.
Чему вы научитесь:
- Реализовывать несложную программу на языке Python, которая будет прогнозировать погоду.
- Понимать базовый синтаксис языка Python.
- Работать с запросами.
- Понимать, что такое API и как он работает.
- Создавать ботов для мессенджера Telegram.
- Использовать существующие сервисы для привязки к разрабатываемой программе.
Формат тренинга
Вас ждёт прямой эфир на YouTube с Артемом Мураховским в течение 3 часов с 19:00 до 22:00, общение в чате во время эфира и в специальном телеграм-канале вне эфира. Все примеры и исходные данные также будут в телеграм-канале, к которому вы сможете присоединиться после регистрации.
План:
- Уровни модели сети интернет.
- Что такое библиотеки на Python.
- Что такое API.
- Telegram API.
- Библиотеки для Telegram API.
- Работа с «чистым» API.
Покупай подписку с доступом ко всем курсам и сервисам
Библиотека современных IT знаний в удобном формате
Выбирай свой вариант подписки в зависимости от задач, стоящих перед тобой. Но если нужно пройти полное обучение с нуля до уровня специалиста, то лучше выбирать Базовый или Премиум. А для того чтобы изучить 2-3 новые технологии, или повторить знания, готовясь к собеседованию, подойдет Пакет Стартовый.
- Все видеокурсы на 3 месяца
- Тестирование по 10 курсам
- Проверка 5 домашних заданий
- Консультация с тренером 30 мин
- Все видеокурсы на 6 месяцев
- Тестирование по 16 курсам
- Проверка 10 домашних заданий
- Консультация с тренером 60 мин
- Все видеокурсы на 1 год
- Тестирование по 24 курсам
- Проверка 20 домашних заданий
- Консультация с тренером 120 мин