Из этой статьи вы узнаете, как создать Telegram бот, который будет отправлять вам сообщения о ходе выполнения вашего кода. Это удобно, когда вы запускаете скрипты, которые будут работать довольно долго: вам не придется постоянно проверять, отработал уже скрипт или еще нет.
Долгое время у меня в голове был маленький проект: я хотел найти простой способ получать уведомления о ходе выполнения моих пайплайнов на Python. Я был уверен, что существует быстрое и надежное решение. Однако тогда я не был знаком с API и уж точно не ожидал, что некоторые из них настолько легки в использовании. В этом посте я хочу показать вам возможности API и вдохновить вас, представив этот небольшой, но значимый проект.
Скачивайте книги ТОЛЬКО на русском языке у нас в телеграм канале: PythonBooksRU
Сначала мы поговорим об API. В частности, мы обсудим, зачем они нужны и как они создаются. Затем мы погрузимся в сам проект и его этапы.
Примечание редакции. У нас есть еще одна статья о создании Telegram бота на Python.
Что такое API?
За время работы в качестве специалиста по анализу данных я узнал много вещей. Возможно, одной из наиболее значимых является понимание важности API.
API – это аббревиатура от Application Programming Interface, что означает программный интерфейс, который позволяет двум приложениям взаимодействовать друг с другом. Другими словами, эти программные компоненты дают вам доступ к множеству приложений, таким как Telegram, Facebook, Twitter, а также к большим базам данных.
API имеют четкую структуру, для легкой масштабируемости и понятности. Они обычно используют протоколы и методы HTTP (т.е. GET, POST, DELETE).
Отличный способ разобраться в этой теме – начать работу с API, разработанным для Telegram. API Telegram – это простой способ получать крутые уведомления без необходимости использовать сторонние решения и сложные процессы. Здесь я буду использовать простой метод POST из пакета Python requests.
Как создать Telegram бот с использованием Telegram API
Поскольку API Telegram дружелюбен к использованию, мы можем быстро создавать увлекательные проекты. В этой статье я разберу создание небольшого проекта. Его суть – в уведомлениях о ходе выполнения вашего кода! Вы можете установить этот проект с помощью pip, и нет необходимости разворачивать его на сервере. Вам нужно только настроить телеграм-бота и найти свой идентификатор пользователя (UserID).
Начало работы
Настройка Telegram-бота
Задача состоит в том, чтобы создать нового бота со своими функциями. Я описываю наиболее важные из них, но вы можете легко расширить функциональность бота, используя документацию.
Откройте Telegram, найдите при помощи строки поиска BotFather и нажмите кнопку Start.
Щелкните на /newbot
.
Вы можете назвать своего бота как угодно. Но будьте осторожны с именем пользователя! Оно должно заканчиваться на “bot” и быть уникальным.
На этом этапе Telegram создает для вас бота и предоставляет доступ к вашему токену. Это позволит вам отдавать команды через API.
Найдите свой идентификатор пользователя
Найдите userinfobot (так же, как и на предыдущем этапе – через строку поиска).
И нажмите /start
.
Теперь вы получите доступ к своему идентификатору пользователя (userId), который позволит боту отправлять сообщения непосредственно вам.
Немного Python
В этом примере я использую модуль requests из Python. Он надежен и стабилен, за ним стоит сильное сообщество. Как уже упоминалось, для отправки данных в API я использую метод POST, в отличие от метода GET, который позволяет запрашивать доступ к данным.
В приведенном ниже фрагменте кода показано, как отправить сообщение от бота на наш аккаунт в Telegram. Но перед началом обязательно провзаимодействуйте с вашим ботом, нажав Start
. Можно также отправить любое текстовое сообщение.
import requests token = 'nnnnnn:xxxxxxxxxxxxx' userID = 'nnnnnn' message = 'Here is my first message' # Create url url = f'https://api.telegram.org/bot{token}/sendMessage' # Create json link with message data = {'chat_id': userID, 'text': message} # POST the message requests.post(url, data)
Ксли вы хотите отправлять изображения с локальной машины, следующий код прекрасно справится с этой задачей.
import requests token = 'nnnnnn:xxxxxxxxxxxxx' userID = 'nnnnnn' caption = 'Some image' photoPath = 'image.png' # Create url url = f'https://api.telegram.org/bot{token}/sendPhoto' # Create json link with message data = {'chat_id': userID, 'caption': caption} # POST the image requests.post(url, data, files={'photo': open(photoPath, 'rb')})
Мой проект
Поиграв с API, я вспомнил простую идею, возникшую год назад. Я просматривал результаты соревнований Kaggle, и сидящий рядом со мной друг решил, что я получаю результаты от своего кода, который только что закончил выполняться. Помню, я подумал: “Как было бы здорово создать что-то, что отправляло бы сообщения о ходе выполнения кода с текстом и картинками”.
Основная часть кода моего проекта довольно проста. Этот код позволяет отправлять информацию не только мне, но и другим людям, если они также сообщат свой userID. Это позволяет заниматься чем-то другим, пока выполняется длинный код. Больше не придется каждую минуту проверять, работает ли еще код.
Основной модуль пакета прост в обращении и даст вам лучшее представление о его структуре.
class TelegramBot: """Telegram Bot """ def __init__(self, token, destinationID): self.token = token self.destinationID = destinationID def send_image(self, photoPath, caption='Here is the image send from the code'): """ It takes the bot token, an ID destination (should be yours if you want to receive the image) and your image path. The function interact with telebot API to send you a private image """ # Create url url = f'https://api.telegram.org/bot{self.token}/sendPhoto' # Create json link with message data = {'chat_id': self.destinationID, 'caption': caption} # POST the image requests.post(url, data, files={'photo': open(photoPath, 'rb')}) def send_message(self, message): """ It takes the bot token, an ID destination (should be yours if you want to receive the message) and your message. The function interact with telebot API to send you a private message """ # Create url url = f'https://api.telegram.org/bot{self.token}/sendMessage' # Create message message = Message(message).compute_message() # Create json link with message data = {'chat_id': self.destinationID, 'text': message} # POST the message requests.post(url, data) def send_error_message(self, message): """ It takes the bot token, an ID destination (should be yours if you want to receive the message) and your message. The function interact with telebot API to send you a private message """ # Create url url = f'https://api.telegram.org/bot{self.token}/sendMessage' # Create message message = Message(message).compute_error_message() # Create json link with message data = {'chat_id': self.destinationID, 'text': message} # POST the message requests.post(url, data)
Как использовать этот проект
Позвольте мне показать, как вы сможете использовать мой проект.
Сначала установите его пакет с помощью pip.
pip install telegram-coffee-break
И вы можете использовать его следующим образом, чтобы также получать уведомления о проблемах, возникающих в процессе работы вашего кода.
def train_model(): ## do something ## results = { 'train accuracy' : train_acc, 'test accuracy' : test_acc } return results from telegrambotalarm import TelegramBot import traceback TOKEN = 'nnnnnnnnnn:xxxxxxxxxxxxxxxxxxxxx' MYID = 'nnnnnnnn' bot = TelegramBot(TOKEN, MYID) # Run this try: results = train_model() # If error occurs, send the error with its trace except Exception as e: print(traceback.format_exc()) bot.send_error_message(traceback.format_exc()) bot.send_message(results) bot.send_image('decision_tree.png', caption='here is the image of the results')
Пример сообщений от бота в Telegram:
Если вы хотите поближе познакомиться с кодом или что-то добавить, пожалуйста, зайдите на его страницу GitHub.
Заключение
Я надеюсь, что вам понравилась эта небольшая статья, и вы узнали кое-что об API и их удивительных возможностях. Не забывайте, что здесь мы говорим только о методе POST, но я думаю, что вы сможете экстраполировать свои знания на использование других методов.
Я постарался познакомить вас с их структурой без использования сложных оберток. Но если вы считаете, что готовы идти дальше, то можете взглянуть на наиболее известные библиотеки для Telegram API:
В качестве следующего шага вы можете найти лучший способ обработки токена и ID получателя, чтобы не передавать их каждый раз в функцию. Также можно разработать функцию для отправки уведомлений нескольким userID для распространения информации в группе программистов.
Перевод статьи «Create a simple Bot with Telegram that notifies you about the progress of your code.».