Hachther Blog > Développement Web  > Recevez une notification par Telegram en cas d’erreur sur votre application Django

Recevez une notification par Telegram en cas d’erreur sur votre application Django

Comme vous le savez déjà (ou pas  ) je suis fan de Django et j’ai construit beaucoup de mes projets avec. Entre autres choses, ils ont un bon mécanisme de journalisation qui vous permet de gérer différents types et niveaux de journaux. Un de mes projets devait être capable de notifier un groupe de personnes en cas d’erreur. Django a déjà la possibilité de notifier par email mais le courrier électronique n’était pas assez bon. J’ai donc décidé de mettre en place un module qui peut notifier mais en utilisant Telegram. Le but de cet article est d’expliquer comment vous pouvez être averti par Telegram en cas d’erreur sur votre application Django.

Pour mettre en œuvre cela, la clé est d’avoir un bot Telegram.

Telegam Bot

Telegram est une application de messagerie pour tous les ordinateurs de bureau et mobiles. Il est basé sur le cloud, rapide, sécurisé … et l’essentiel pour nous est le fait qu’il soit ouvert et qu’il permette au développeur d’interagir avec lui en utilisant l’API. Dans notre cas, nous allons créer un chat bot et utiliser API pour interagir avec lui.

Vous pouvez en apprendre sur les bots de Telegram et sur la façon de les créer en suivant ce lien. En cas de problème il suffit de laisser un commentaire ou de nous contacter cela peut faire l’objet d’un autre article.

Une fois votre bot créé, vous devriez avoir le jeton de votre bot: quelque chose comme ça: 345725234:AADFFN31nk5uQ99HncL … stocker ce jeton, il sera utilisé dans les parties suivantes.

Maintenant, allons sur Django et implémentons la notification.

Configurer Django pour envoyer un message Telegram

Si vous aviez lu à propos de bot sur Telegram, vous devriez savoir qu’un bot ne peut initier une conversation avec un humain. L’humain doit commencer la conversation afin de permettre au bot de commencer à lui envoyer des messages.

Obtenir l’ID du chat

Vous devez obtenir une identification de chat qui est l’identification de la conversation entre un utilisateur et le bot. Ensuite, cet ID sera utilisé par Django pour envoyer un message à l’utilisateur. Pour ce faire, l’utilisateur doit d’abord rechercher le bot dans ses contacts Telegram et une fois fait, il doit cliquer sur le bouton Démarrer pour lancer la conversation.

Pour capturer votre chat ID, envoyez un message dans le chat (“Test” par exemple) puis appelez ce lien https://api.telegram.org/bot[BOT_TOKEN]/getUpdates dans votre navigateur et vous aurez une sortie comme celle ci-dessous:

{
  "ok": true,
  "result": [
    {
      "update_id": 58256111,
      "message": {
        "message_id": 167,
        "from": {
          "id": 209871203,
          "is_bot": false,
          "first_name": "Daniel",
          "last_name": "De Vigny",
          "username": "devigny",
          "language_code": "en"
        },
        "chat": {
          "id": 209871203,
          "first_name": "Daniel",
          "last_name": "De Vigny",
          "username": "devigny",
          "type": "private"
        },
        "date": 1513775515,
        "text": "Test"
      }
    }
  ]
}

Dans la sortie, vous pouvez obtenir le chat ID à partir de la valeur de la propriété id dans l’objet chat (209871203).

Maintenant, nous avons notre ID de chat, nous pouvons commencer à envoyer des messages.

Envoyer une erreur avec Telegram

Telegram fournit déjà une API REST qui peut être utilisée pour interagir avec votre bot. Vous pouvez donc l’utiliser directement (trouvez le ici) ou vous pouvez utiliser une librairie de télégrammes python qui est l’option que nous avons utilisée ici.

La bibliothèque que nous avons utilisée est telepot. pour l’installer c’est très simple: pip install telepot.

Une fois que vous avez installé vous devez maintenant configurer votre système de journalisation pour envoyer l’erreur par le télégramme. Vous trouverez ci-dessous un exemple de code à utiliser pour ajouter ou modifier vos paramètres de Django.

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    ...
    'handlers': {
        ...
        'hlogging': {
            'level': 'ERROR',
            'class': 'hlogging.handlers.HLoggingHandler',
            'formatter': 'verbose',
        },
    },
    'loggers': {
        ...
        'django.request': {
            'handlers': ['hlogging'],
            'level': 'ERROR',
            'propagate': False,
        },
    },
}

Vous pouvez suivre ce doc pour voir comment vous pouvez personnaliser davantage la journalisation pour vos besoins. Mais la chose la plus importante ici est la classe dans le gestionnaire hlogging (hlogging.handlers.HLoggingHandler). Parce que c’est là que le code pour envoyer des messages Telegram sera écrit.

Retrouvez ci-dessous le code de HLoggingHandler:

import logging

from django.utils.module_loading import import_string
from django.views.debug import ExceptionReporter

class HLoggingHandler(logging.Handler):
    def __init__(self):
        logging.Handler.__init__(self)

    def emit(self, record):
        try:
            request = record.request
        except Exception:
            request = None

        if record.exc_info:
            exc_info = record.exc_info
        else:
            exc_info = (None, record.getMessage(), None)

        text = self.format(record)
        levelname = record.levelname
        for type in self.types:
            message = LoggingMessage(level=levelname, text=text, html=html)
            bot = telepot.Bot([BOT_TOKEN])
            bot.sendMessage([chat_id], text[:4095])

Comme vous pouvez le voir dans le code ci-dessus, vous devez avoir l’ID de chat et le jeton de bot et selon le niveau que vous avez définit dans votre configuration de log (dans ce cas ERROR) chaque fois que l’application enregistre un événement ERROR, cet événement sera envoyé par Telegram. Vous pouvez donc être immédiatement au courant en cas de problème sur votre application.

Ceci est juste un exemple pour expliquer le principe mais au cas où vous êtes intéressé, vous pouvez cloner ce dépôt qui est un module Django que j’ai développé à cet effet. Vous pouvez même participer au développement pour intégrer d’autres chaînes pourquoi pas.

Merci de votre lecture

No Comments

Leave a reply