Простой Telegram бот для логирования

Из этой статьи вы узнаете, как создать 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.

Окно бота BotFather

Щелкните на /newbot.

Окно BotFather со списком возможных команд

Вы можете назвать своего бота как угодно. Но будьте осторожны с именем пользователя! Оно должно заканчиваться на “bot” и быть уникальным.

Окно BotFather с нашим токеном

На этом этапе Telegram создает для вас бота и предоставляет доступ к вашему токену. Это позволит вам отдавать команды через API.

Найдите свой идентификатор пользователя

Найдите userinfobot (так же, как и на предыдущем этапе – через строку поиска).

Поиск своего бота в Телеграме

И нажмите /start.

Отправка команды 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.».

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *