Команды и оповещения @BotFather в Telegram
Для создания нового бота необходимо использовать команду /newbot . @BotFather запросит имя бота и имя пользователя бота (логин), а затем сгенерирует токен авторизации для вашего нового бота.
Имя бота отображается в контактных данных и в других местах.
Имя пользователя бота — это логин бота и представляет из себя короткое имя, которое будет использоваться в упоминаниях и ссылках на t.me . Обратите внимание, что в дальнейшем имя пользователя изменить нельзя! Имена пользователей (логины) состоят из 5–32 символов и нечувствительны к регистру, и могут включать только латинские символы, числа и символы подчеркивания. Имя пользователя бота должно заканчиваться на bot , например tetris_bot или TetrisBot .
Токен представляет собой строку типа 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw , которая требуется для авторизации бота и отправки запросов в API бота. Держите свой токен в безопасности и храните его, он может быть использован кем угодно для управления вашим ботом.
Пересоздание токена авторизации Telegram бота.
Если существующий токен скомпрометирован или был утерян по какой-либо причине, то используйте команду /token для создания нового.
Команды @BotFather
- /mybots — возвращает список ваших ботов с удобными элементами управления для редактирования их настроек.
- /mygames — делает то же самое для ваших игр
Команды редактирования Telegram бота:
- /setname — изменить имя вашего бота.
- /setdescription — изменить описание бота, текст до 512 символов, описывающий бота. Пользователи увидят этот текст в начале разговора с ботом, озаглавленный «What can this bot do?».
- /setabouttext — изменить информацию о боте, более короткий текст до 120 символов. Пользователи увидят этот текст на странице профиля бота. Когда они делятся вашим ботом с кем-то, этот текст отправляется вместе со ссылкой.
- /setuserpic — изменить фото профиля бота.
- /setcommands — изменить список команд, поддерживаемых ботом. Пользователи будут видеть список команд всякий раз, когда они набирают ‘/’ в разговоре с вашим ботом. Каждая команда имеет имя (должно начинаться с косой черты ‘/’ , буквенно-цифровое значение плюс подчеркивание, не более 32 символов, без учета регистра), параметры и текстовое описание.
- /deletebot — команда удаляет бота и освобождает его логин.
Команды изменения настроек Telegram бота.
- /setinline — переключает встроенный режим запросов для бота.
- /setinlinegeo — запрашивает данные о местоположении для предоставления встроенных результатов на основе местоположения.
- /setjoingroups — переключатель, который отвечает за то, можно ли добавлять бота в группы или нет. Любой бот должен уметь обрабатывать личные сообщения, но если создаваемый бот не предназначен для работы в группах, то можно отключить этот режим.
- /setprivacy — установить, какие сообщения будет получать бот при добавлении в группу. Если режим конфиденциальности отключен, то бот будет получать все сообщения. Мы рекомендуем оставить режим конфиденциальности включенным. Вам нужно будет повторно добавить бота в существующие группы, чтобы это изменение вступило в силу.
Команды управления играми.
- /newgame — создать новую игру.
- /listgames — получить список ваших игр.
- /editgame — редактировать игру.
- /deletegame — удалить существующую игру.
Обратите внимание, что изменения вступят в силу не сразу, а через несколько минут.
Ограничения и предупреждения о статусе Telegram бота.
Миллионы выбирают Telegram за его скорость. Чтобы оставаться конкурентоспособным в этой среде, ваш бот также должен быть быстрым. Чтобы помочь разработчикам поддерживать своих ботов в форме, @BotFather отправляет оповещения о статусе, если видит, что что-то не так.
Telegram будет проверять количество ответов и коэффициент конверсии запросов/ответов для популярных ботов (300 запросов в минуту: это значение может измениться в будущем). Если имеем аномально низкие показания, то получим уведомление от @BotFather .
Ответы на предупреждения.
По умолчанию вы будете получать только одно предупреждение на одного бота в час. Каждое предупреждение имеет следующие кнопки:
- Fixed . Используйте эту кнопку, если обнаружили проблему с вашим ботом и исправили ее. Если нажать на кнопку Fixed , то отправку предупреждений в обычном режиме возобновится, для того чтобы увидеть, сработало ли исправление в течение 5–10 минут, вместо того, чтобы ждать час.
- Support . Используйте эту кнопку, чтобы открыть чат с @BotSupport , если не видите проблем с ботом или считаете, что проблема на стороне Telegram.
- Mute for 8h/1w . Используйте кнопку, если нет возможности исправить бота в данный момент. Это отключит все предупреждения для рассматриваемого бота за указанный период времени. Мы не рекомендуем использовать эту опцию, поскольку пользователи могут перейти на более стабильный бот. Вы можете включить оповещения в настройках своего бота через @Botfather .
Отслеживаемые проблемы Telegram бота.
В настоящее время Telegram будет уведомлять о следующих проблемах:
- Too few private messages are sent compared to previous weeks: . Бот отправляет гораздо меньше сообщений, чем в предыдущие недели. Такие уведомления полезны для ботов в стиле новостной рассылки, которые рассылают сообщения без возможности получения ответов от пользователей. Чем больше значение, тем значительнее разница.
- Too few replies to incoming private messages. Conversion rate: . Бот не отвечает на все сообщения, которые ему отправляются (коэффициент конверсии запроса/ответа для бота был слишком низким по крайней мере в течение двух из последних трех 5-минутных периодов). Чтобы обеспечить хороший пользовательский опыт, пожалуйста, отвечайте на все сообщения, которые отправляются вашему боту.
- Too few answers to inline queries. Conversion rate: . Бот не отвечает на все встроенные запросы, которые ему посылаются, рассчитанные таким же образом, как и выше. Отвечайте на обновления inline_query , вызывая answerInlineQuery .
- Too few answers to callback queries. Conversion rate: или Too few answers to callback game queries. Conversion rate: . Бот не отвечает на все запросы обратного вызова, которые ему посылаются (с играми или без них), рассчитанные таким же образом, как и выше. Отвечайте на сообщения callback_query , вызывая answerCallbackQuery .
Обратите внимание, что функция оповещения о состоянии все еще тестируется и будет улучшена в будущем.
- КРАТКИЙ ОБЗОР МАТЕРИАЛА.
- Переход на асинхронный python-telegram-bot версии 20.x
- Чистый интерфейс Python для Telegram Bot API
- Команды и оповещения @BotFather в Telegram
- Обработка сообщений модулем python-telegram-bot
- Фильтры сообщений модуля python-telegram-bot
- Хранение временных данных модулем python-telegram-bot
- Настройки по умолчанию модуля python-telegram-bot
- Планировщик сообщений модуля python-telegram-bot
- Форматирование и отправка сообщений в python-telegram-bot
- Работа с файлами/media, модуль python-telegram-bot
- Меню из кнопок, модуль python-telegram-bot
- Объект CallbackContext модуля python-telegram-bot
- Подключения Telegram-бота через webhook
- Обработка исключений модуля python-telegram-bot
- Создание Inline-бота, модуль python-telegram-bot
- Работа с опросами в модуле python-telegram-bot
- Создание разговоров ConversationHandler в python-telegram-bot
- Перезапуск телеграмм-бота в случае ошибки
- Декоратор-обработчик сообщений в python-telegram-bot
- Авторизация на сайте через Telegram Passport
- Ведение публикаций в Telegram-канале с python-telegram-bot
- UTF коды emoji/эмодзи для отправки в Telegram из Python
Как написать Telegram бота: практическое руководство
6 Апрель 2016 , Python, 455365 просмотров, How To Create a Telegram Bot Using Python
В последнее время Telegram у всех на слуху. Нужно отдать должное отделу маркетинга этого приложения, шумиху подняли на славу. Одной из основных «фишек» Telegram является его якобы защищённость — по словам Павла Дурова вся переписка между пользователями шифруется. Более того, ни одна спец.служба мира не будет иметь доступ к вашим сообщениям. Но в данной статье речь не об этом. Сегодня хотелось бы поговорить о не менее крутой фишке в Telegram, а именно о ботах. Помимо того, что в сети уже полно информации о различного рода Telegram ботах (github бот, например), мессенджер открыл своё API для разработчиков, и теперь каждый может создать своего собственного бота с блэкджеком и плюшками.
В статье я приведу пример написания онлайн бота с использованием Python и Django фреймворка. То есть мы «запилим» полноценное веб-приложение, которое будет крутиться на удалённом хосте и принимать команды от пользователей. Весь исходный текст доступен в моём github репозитории.
Документация, описывающая процесс взаимодействия с ботами Telegram находится тут. Чтобы не изобретать велосипед, я нашел неплохую Python библиотеку, реализующую все основные функции ботов — telepot. Как я уже упоминал ранее, для того, чтобы обслуживать пользователей нашего бота мы будет разрабатывать веб-приложение, используя Django фреймворк.
Как создать Telegram бота?
Для начала нам необходимо зарегистрировать в Telegram нашего будущего бота. Это делается следующим образом:
- Необходимо установить приложение Telegram на телефон или компьютер. Скачать приложение можно тут
- Добавляем к себе в контакт-лист бота с именем BotFather
- Запускаем процедуру «общения» с ботом нажатием кнопки Start. Далее перед нами предстанет список команд точно как на скриншоте.
- Для того, чтобы создать нового бота необходимо выполнить команду /newbot и следовать инструкциям. Обратите внимание, что username для бота должен всегда содержать в конце слово bot. Например, DjangoBot или Django_bot.

- Для нашего бота я выбрал имя PythonPlanetBot, так как его основная функция заключается в парсинге RSS feed сайта Python Planet и выдача информации о последних постах пользователю 🙂

После создания бота, обратите внимание на строку с текстом:
Use this token to access the HTTP API:
За которой следует т.н. token по которому мы будем манипулировать нашим ботом. Помимо функции создания telegram бота, BotFather также имеет ряд других возможностей:
- Присвоить боту описание
- Установить аватар
- Поменять token
и так далее. Полное описание доступных команд можно увидеть на первом скриншоте.
Приступаем к кодированию
Как я ранее уже упоминал, мы будем писать веб-приложение на Django. Но стоит отметить, что это делать необязательно. Можно обойтись и обычным Python скриптом, правда в этом случае необходимо будет периодически опрашивать Telegram на предмет новых запросов от пользователей бота (используя метод getUpdates) и увеличивая offset для получения самых последних данных без повторений. В Telegram существует два взаимоисключающих метода получения команд/сообщений для вашего бота.
- Использование вызова API метода getUpdates
- Установка Webhook
Установка Webhook заключается в передаче боту специального URL адреса на который будет поступать POST запрос каждый раз, когда кто-то начнёт посылать сообщения боту. Именно этот вариант мы и будем использовать для взаимодействия между ботом и его пользователем. Для того, чтобы задать URL, необходимо использовать API метод setWebhook. Отмечу, что URL должен начинаться с https, то есть иметь защищённое SSL соединение с валидным сертификатом. Telegram разрешает использовать самоподписанный сертификат, правда для этого необходимо в методе setWebhook передавать также публичный ключ в PEM формате (ASCII base64). Либо же можно получить валидный бесплатный SSL сертификат от Let’s Encrypt.
Подробнее о getUpdates и setWebhook можно почитать соответственно здесь и тут.
Итак, вернёмся к python библиотеке для работы с Telegram — telepot. На текущий момент самой последней её версий является 6.7. Устанавливаем её в виртуальное окружение python virtualenv:
pip install telepot
Самый простой вариант взаимодействия с Telegram ботом на Python выглядит следующим образом:
import telepot token = '123456' TelegramBot = telepot.Bot(token) print TelegramBot.getMe()
Переменной token присваиваем значение токена, полученного при создании бота через BotFather. В итоге после выполнения этих команд мы получим:
Поздравляю! Мы вызывали самый простой API запрос getMe, который возвращает информацию о боте: username, id, first_name.
Добавим нашего бота к себе в контакт-лист и пошлём ему первую стандартную команду /start

TelegramBot.getUpdates() [, u'message_id': 1, u'chat': >, u'update_id': 649179764>]
Процесс общения с telegram ботом происходит по HTTPS; для передачи данных используется JSON. Метод getUpdates возвращает список/массив из объектов типа Update. Внутри Update находится объект Message. Для стандартного взаимодействия с ботом нас фактически интересует именно объект Message, у которого мы считываем атрибут text, хранящий в себе текст, переданный боту и объект chat, в котором лежит информация о пользователе, инициировавшем общение с нашим Telegram ботом. Также имеется параметр update_id, который служит в качестве offset параметра при вызове метода getUpdates. То есть update_id+1 вернёт все сообщения, поступившие после последнего update_id, при этом все предыдущие сообщения будут удалены.
TelegramBot.getUpdates(649179764+1) [, u'message_id': 13, u'chat': >, u'update_id': 649179765>]
На этапе написания простейшего Telegram бота нам этих вызовов достаточно. Приступим к написанию Django приложения для обслуживания наших пользователей.
Простая функция парсинга RSS фида Planet Python выглядит вот так:
# -*- coding: utf8 -*- from xml.etree import cElementTree import requests def parse_planetpy_rss(): """Parses first 10 items from http://planetpython.org/rss20.xml """ response = requests.get('http://planetpython.org/rss20.xml') parsed_xml = cElementTree.fromstring(response.content) items = [] for node in parsed_xml.iter(): if node.tag == 'item': item = <> for item_node in list(node): if item_node.tag == 'title': item['title'] = item_node.text if item_node.tag == 'link': item['link'] = item_node.text items.append(item) return items[:10]
Здесь я использую python библиотеку requests для работы с HTTP в самом простейшем варианте без обработки ошибок. Django «вьюшка» выглядит следующим образом:
TOKEN = '' TelegramBot = telepot.Bot(TOKEN) def _display_help(): return render_to_string('help.md') def _display_planetpy_feed(): return render_to_string('feed.md', ) class CommandReceiveView(View): def post(self, request, bot_token): if bot_token != TOKEN: return HttpResponseForbidden('Invalid token') commands = < '/start': _display_help, 'help': _display_help, 'feed': _display_planetpy_feed, >try: payload = json.loads(request.body.decode('utf-8')) except ValueError: return HttpResponseBadRequest('Invalid request body') else: chat_id = payload['message']['chat']['id'] cmd = payload['message'].get('text') # command func = commands.get(cmd.split()[0].lower()) if func: TelegramBot.sendMessage(chat_id, func(), parse_mode='Markdown') else: TelegramBot.sendMessage(chat_id, 'I do not understand you, Sir!') return JsonResponse(<>, status=200) @method_decorator(csrf_exempt) def dispatch(self, request, *args, **kwargs): return super(CommandReceiveView, self).dispatch(request, *args, **kwargs)
CommandReceiveView ждёт POST запрос на себя, парсит его и отвечает исходя из заданной команды. Полноценное Django приложение можно найти по этой ссылке. Стоит отметить в коде использование ещё одного API вызова — sendMessage. Этот метод отправляет сообщение заданному пользователю, используя при этом chat_id и сам текст сообщения. Chat_id — это уникальный идентификатор чата между пользователем и ботом (его идентификатор есть в ответе на запрос getUpdates). У Telegram ботов есть одно ограничение, они не могут посылать сообщения пользователям, которые предварительно не инициировали общение с ним. По-видимому это сделано дабы избежать массового создания спам-ботов.
Я предполагаю, что вы уже клонировали мой репозиторий, настроили окружение и установили все необходимые зависимости: Django, requests, telepot. Если же вы не знаете как это сделать, то совсем скоро я напишу цикл статей о разработке веб-приложений на Python, включая разбор экосистемы: разработка, настройка, деплой. Если вам это интересно, то отпишитесь, пожалуйста, в комментариях к этой статье. Хочется получить обратную связь 🙂
Итак, веб-приложение на Django запущено. Как же начать тестировать бота? А всё очень просто — необходимо симулировать действия Telegram сервиса. Для этого нам понадобится HTTP клиент и тело запроса. В качестве HTTP клиента я часто использую Chrome плагин под названием Postman, а тело запроса мы возьмём напрямую из данных, полученных с помощью API вызова getUpdates.
После запуска runserver, URL на который необходимо посылать запрос выглядит следующим образом:
http://127.0.0.1:8000/planet/b. BOT_TOKEN/
где BOT_TOKEN — это токен нашего бота. Смотрим скриншот:


А давайте-ка отправим команду feed для получения списка новостей из Planet Python:


На скриншотах видно, что бот адекватно отреагировал на нашу команду вывести список последних 10 постов.
Следующим шагом является деплой нашего Django приложения на удалённый хост и последующий вызов метода setWebhook для передачи URL на который будет посылаться POST запрос от сервиса Telegram каждый раз при поступлении команд боту от пользователей. Об этом мы поговорим в следующей заметке.
Интересные записи:
- Руководство по работе с HTTP в Python. Библиотека requests
- Обзор Python 3.9
- Что нового появилось в Django Channels?
- Работа с MySQL в Python
- Почему Python?
- Celery: начинаем правильно
- Введение в logging на Python
- Django Channels: работа с WebSocket и не только
- FastAPI, asyncio и multiprocessing
- Pyenv: удобный менеджер версий python
- Авторизация через Telegram в Django и Python
- Разворачиваем Django приложение в production на примере Telegram бота
- Python-RQ: очередь задач на базе Redis
- Введение в pandas: анализ данных на Python
- Работа с PostgreSQL в Python
- Django, RQ и FakeRedis
- Итоги первой встречи Python программистов в Алматы
- Обзор Python 3.8
- Интеграция Trix editor в Django
- Участие в подкасте TalkPython
- Строим Data Pipeline на Python и Luigi
- Авторизация через Telegram в Django приложении
- Видео презентации ETL на Python
Создаём Telegram-бота на Python с помощью pyTelegramBotAPI (telebot)

Сегодня будем учиться создавать ботов в Telegram с помощью Python.
Попробуем заставить бота присылать сводку погоды по нашему городу.
Нам потребуется:
- Компьютер или ноутбук (При должном усердии можно попробовать на телефоне).
- Python 3 (Мы будем работать на версии 3.10).
- Редактор кода (Я использую PyCharm).
- Соединение с интернетом.
У всех на слуху две библиотеки для разработки telegram-ботов, это:
— telebot (он же pyTelegramBotAPI),
— aiogram.
Мы будем использовать telebot как более простой инструмент для личного пользования. Посмотрим как запустить первого бота, что для этого нужно и на что он способен.
Как и aiogram, telebot является адаптацией API telegram для взаимодействия с ответами от сайта. Со справкой API telegram можно ознакомиться тут https://core.telegram.org/. Там же вы сможете узнать подробнее об ответах API.
Получение токена для Telegram-бота
Чтобы создать нашего первого бота на Python надо обратиться к официальному боту от Telegram — BotFather. Там можно создать бота и получить его токен. Токен – это аналог пароля, который позволит нам управлять ботом изнутри и программировать его ответы.
Переходим в BotFather — https://t.me/BotFather и нажимаем «Запустить»:

Дальше выбираем команду /newbot и следуем всем указанием, и в конце мы получаем токен нашего бота:

Установка библиотеки telebot и знакомство с pyTelegramBotAPI
После получения токена нужно скачать библиотеку telebot:
pip install pyTelegramBotAPI
если вы на macOS, то:
pip3 install pyTelegramBotAPI
Мы не будем раскладывать проект по модулям, поэтому у нас будет один исполнимый файл main.py. После создания файла надо импортировать библиотеку и наш токен:
import telebot api_token = 'Ваш токен вставлять сюда'
Первым делом следует инициализировать бота, передав в него токен, полученный от BotFather:
bot = telebot.TeleBot(api_token)
Дальше убедимся, что все корректно работает и заставим отправлять полученное сообщение обратно:
@bot.message_handler(content_types=['text']) def echo(message): bot.send_message(message.chat.id, text=f"")
Бот работает за cчёт декораторов, которые указывают, что мы хотим от него. Message handler – это обработчик всех сообщений, которые отправляет пользователь. В списке content_types перечисляем типы сообщений, которые хотим принимать. Можно указать text, audio, image и document.
У объекта bot есть множество методов, частью которых мы будем пользоваться. Основной из них — send message.
Чтобы заставить бота принимать сообщение, в конце файла пропишем:
bot.polling(none_stop=True)
Параметр none_stop указывает, что мы хотим принимать сообщения постоянно.
В стандартном положении параметр равен False, но мы ставим True.
После всех манипуляций получаем свое же сообщение:

Работа с API Яндекс Погоды
Перейдем к добавлению нужных функций — получению данных о погоде.
Для погоды мы будем пользоваться услугами бесплатного API от Яндекс Погоды:
https://yandex.ru/dev/weather/. Следует отметить, что бесплатный API от Яндекса ограничен 50 запросам в сутки. Если вас такое количество не устраивает, можно воспользоваться OpenWeather.
Запрос будет выглядеть так:
https://api.weather.yandex.ru/v2/informers?lat=55.75222&lon=37.61556
Запрос состоит из местоположения — в данном случае указаны координаты Москвы. Далее можно просить у пользователя геолокацию и присылать ему погоду по его координатам.
Для отправки GET-запроса к API Яндекс.Погоды нам поможет библиотека requests, а для обработки ответа — библиотека json.
pip install requests
pip3 install requests
Библиотека requests предназначена для работы с GET и POST запросами, которые обычный пользователь делает через браузер. Теперь же мы можем общаться с сервером через python оставляя браузер за скобками. Часто используют requests вместе с BS4 (beautiful soup 4), чтобы удобно получать и анализировать информацию из html кода. Но в наш случае другая задача.
API Яндекс.Погоды отдаёт данные в формате JSON, поэтому библиотека json подойдёт лучше всего. JSON основан на JavaScript объекте и часто используется при обмене данными. Раньше он использовался только на сайтаx для работы с текстовыми данными. Сейчас его используют почти везде для удобного обмена данными. JSON принимают все языки программирования, что является его большим плюсом. В python библиотека json уже установлена и не требует отдельной команды.
Добавляем импорт нужных библиотек:
import requests import json
До этого мы не затрагивали тему, как именно обрабатывать команды через слеш. Для этого у декоратора есть метод message_handlers, внутрь которого мы передаем название команд:
@bot.message_handler(commands=['get_weather', 'weather', 'pogoda']): def get_weather(message): pass
Для удобства выносим токен Яндекс.Погоды и ссылку в отдельные переменные:
url = "https://api.weather.yandex.ru/v2/informers?lat=55.75222&lon=37.61556" headers =
Отправим себе в Telegram полный ответ от API Яндекс.Погоды и проверим что все работает:
@bot.message_handler(commands=['get_weather', 'weather', 'pogoda']) def get_weather(message): r = requests.get(url=url, headers=headers) bot.send_message(message.chat.id, r.text)

После получения ответа сформируем нормальный ответ для пользователя. Сразу сделаем проверку на status_code, чтобы оповестить пользователя, если проблемы на стороне API. После получения ответа от API в текстовом формате, надо перевести его в словарь. Для этого подключаем библиотеку json — в функцию loads мы передаем текст ответа, а на выходе получаем объект типа dict (словарь):
@bot.message_handler(commands=['get_weather', 'weather', 'pogoda']) def get_weather(message): r = requests.get(url=url, headers=headers) bot.send_message(message.chat.id, r.text) if r.status_code == 200: data = json.loads(r.text) fact = data["fact"] bot.send_message(message.chat.id, text=f'Now in Moscow °, feels like °. Now on the street ') else: bot.send_message(message.chat.id, 'Problems on weather API')
Теперь бот отправляет температуру, как она ощущается и какая сейчас погода:

Настройка команд для telegram-бота
Нам осталось сделать реакцию на команду /start. Она будет выводить команду для получения данных о погоде:
@bot.message_handler(commands=['start']) def get_weather(message): bot.send_message(message.chat.id, text=f'Hello, ! \n\nI can show you the weather with: \n/weather\n/pogoda\n/get_weather')
Мы обращаемся к информации, которая приходит нам в сообщении пользователя, чтобы получить из нее имя пользователя. Подробнее узнать о сообщениях пользователей можно тут https://core.telegram.org/constructor/message.
Теперь создадим подсказки для пользователей. Библиотека pyTElegramBotAPI не позволяет из кода редактировать подсказки для написания команды. Чтобы это сделать нам потребуется несколько операций в BotFather:

- кликаем на меню
- выбираем команду /mybots
- ищем нашего бота
- edit bot
- и выбираем edit commands
- дальше вводим нашу команду (Пример: команда – описание)
После всех манипуляций у нас появится всплывающая менюшка с командами:

Финальный код Telegram-бота на Python
Мы с вами затронули лишь малу часть того, что можно сделать с помощью python и Telegram. Telebot — не самая лучшая библиотека для создания ботов под большую аудитории. Если вы хотите писать бот для магазинов, вам потребуется более сильные инструменты разработки, которые есть в aiogram.
Если вам хочется потренироваться самостоятельно — попробуйте написать бота со следующими функциями: конвертор валюты, сводка по курсу валюты.
Весь код из урока:
import telebot import requests import json api_token = '5347819163:********lZu1qWQc5f55DPk' url = "https://api.weather.yandex.ru/v2/informers?lat=55.75222&lon=37.61556" headers = bot = telebot.TeleBot(api_token) @bot.message_handler(commands=['start']) def get_weather(message): bot.send_message(message.chat.id, text=f'Hello, ! \n\nI can show you the weather with: \n/weather\n/pogoda\n/get_weather') @bot.message_handler(commands=['get_weather', 'weather', 'pogoda']) def get_weather(message): r = requests.get(url=url, headers=headers) bot.send_message(message.chat.id, r.text) if r.status_code == 200: data = json.loads(r.text) fact = data["fact"] bot.send_message(message.chat.id, text=f'Now in Moscow °, feels like °. Now on the street ') else: bot.send_message(message.chat.id, 'Problems on weather API') bot.polling(none_stop=True)
Как создать 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
Зарегистрируйтесь в панели управления
И уже через пару минут сможете арендовать сервер, развернуть базы данных или обеспечить быструю доставку контента.
