Read this article in english

J’ai pris quelques semaines Ă  faire un robot sur Telegram pour un trĂšs cher ami. Il rĂ©alisait jusqu’ici la tĂąche redondante de poster du contenu sur les rĂ©seaux sociaux avec le mĂȘme modĂšle, crĂ©Ă© avec Canva. Ce dernier Ă©tant trĂšs facile d’accĂšs, Canva implique quand mĂȘme des Ă©tapes redondantes qui peuvent ĂȘtre facilement Ă©vitĂ©es. Les chatbots et Telegram faisant la une des mĂ©dias en ce moment, j’ai trouvĂ© que c’Ă©tait une bonne idĂ©e de lancer mon propre chatbot. Voici comment j’ai fait.


Illustration rouge-orange d'un robot octopus sur un ordinateur portable avec une bulle conteneur les logos de Python et Telegram

BanniÚre "Octobot" générée par Flux avec Perplexity



Prérequis

Avant de commencer, assurez-vous d’avoir les bons outils de dĂ©veloppement:

  • Python et Docker installĂ©s
  • Un compte Azure
  • Un compte Telegram


Création du bot Telegram

Pour commencer du cĂŽtĂ© Telegram, il vous faudra une clĂ© d’API. C’est simple et gratuit

  1. Ouvrez Telegram et recherchez “BotFather”
  2. Envoyez la commande /newbot et suivez les instructions
  3. Notez le token API (il reste dans la conversation si jamais vous l’oubliez)

Capture d'Ă©cran du compte Telegram de BotFather

BotFather



DĂ©veloppement du bot en Python

Créez un nouveau fichier mon_bot.py.

Pour la base, il vous faut au moins ça :

import os
import telebot
import threading

TOKEN = os.environ.get('TELEGRAM_TOKEN')
bot = telebot.TeleBot(TOKEN, parse_mode=None)

# Choisissez les commandes pour commencer. Ici /start et /help
@bot.message_handler(commands=['start', 'help'])
def send_welcome(message):
    chat_id = message.chat.id
    bot.reply_to(message, f"Coucou toi 🐍 Ton chat.id est { chat_id }")

# GĂ©rer les autres messages
@bot.message_handler(func=lambda message: True)
def handle_message(message):
    if message.content_type == 'text':
        bot.reply_to(message.text, f"Ton message Ă  l'envers : { message[::-1] }")
    elif message.content_type == 'photo':
        bot.reply_to(message, "Sympa la photo")
        with open('path/to/shrek.png', 'rb') as photo:
            bot.send_photo(message, photo)

# Pour que le conteneur ne s'arrĂȘte pas
def heartbeat():
    while True:
        logging.info("Ping")
        time.sleep(600)

def main():
    threading.Thread(target=heartbeat, daemon=True).start()

    while True:
    try:
        bot.polling(none_stop=True, interval=0, timeout=300)
    except Exception as e:
        # Si pas de réponse du serveur Telegram
        time.sleep(15)

if __name__ == '__main__':
    main()

Maintenant, il faut faire en sorte que les librairies soient téléchargeables par le conteneur Docker. Créez un fichier requirement.txt avec cette ligne

pyTelegramBotAPI==4.20.0


Dockerisation du bot

Ici nous faisons appel Ă  des variables d’environnement. Pour tester, c’est mieux de le faire directement avec Docker en local.

Créez un fichier Dockerfile :

FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "mon_bot.py"]

Et pour tester, lancez cette commande (en remplaçant le token par le bon)

docker build -t mon_bot_python . && docker run -d --name mon_bot_python -e TELEGRAM_BOT_TOKEN="1234567890:AABBCCDDEEFF-gghhiijjkkllmmnnoo123"  mon_bot_python

Maintenant, recherchez le nom de votre bot, celui que vous avez entrĂ© avec BotFather. Envoyez-lui un message et voyez par vous-mĂȘme !



CI/CD pour builder l’image et la push sur GitHub Container Registry

Il vous faudra builder l’image et l’hĂ©berger sur un registre de conteneurs. Je choisis GHCR, le registre de GitHub, car je le connais bien.

J’utiliserai aussi la CI/CD de GitHub actions pour lancer ça. Dans le fichier .github/workflows/build.yml, il vous faudra au moins ces Ă©tapes :

name: Builder et Pusher l'image du conteneur

on:
  push:
    branches: [ 'master', 'main' ] 
  workflow_dispatch:

permissions:
  contents: read
  packages: write

jobs:
  build-and-push:
    runs-on: ubuntu-latest

    steps:
    - name: Récupérer le code
      uses: actions/checkout@v4
      with:
        submodules: 'true'

    - name: Configurer Docker Buildx
      uses: docker/setup-buildx-action@v3.6.1 

    - name: Se connecter au GitHub Container Registry
      uses: docker/login-action@v3.3.0
      with:
        registry: ghcr.io
        username: ${{ github.actor }}
        password: ${{ github.token }}

    - name: Récupérer le nom du repository en minuscules
      run: echo "REPO=${GITHUB_REPOSITORY,,}" >>${GITHUB_ENV}

    - name: Builder et Pusher l'image sur GHCR
      uses: docker/build-push-action@v6.5.0
      with:
        context: .
        push: true
        tags: |
          ghcr.io/${{ github.repository }}:latest
          ghcr.io/${{ github.repository }}:${{ github.sha }}          

Ensuite, sur GitHub (en admettant que vous avez mis les fichiers sur un repository dans GitHub), vous verrez que lors du push de votre commit, le build va automatiquement se lancer.



DĂ©ploiement sur une VM

Pour ma part, j’ai rĂ©ussi de le dĂ©ployer sur le service PaaS Azure Web Services, mais j’ai prĂ©fĂ©rĂ© au final mettre Docker dans une VM. J’ai fait ça pour avoir le contrĂŽle sur l’exĂ©cution de Docker. Voici comment j’ai fait

  1. CrĂ©ez une machine virtuelle Azure, pour ma part avec Rocky Linux 9.2 comme OS et Standard B2s comme SKU (33€/mois aujourd’hui en rĂ©gion France centrale)
  2. SSH sur la VM pour installer Podman ou Docker (Podman pour ma part, car c’est open-source et qu’on aime ça)
    sudo dnf update -y
    sudo dnf install podman -y
    podman --version
    sudo systemctl enable podman
    sudo systemctl start podman
    
  3. Lancez le conteneur pour qu’il tourne Ă  l’infini
    # Se connecter au registry si votre repository GHCR est privé
    echo "ghp_personal_access_token_à_générer" | podman login ghcr.io -u mon_utilisateur --password-stdin
    # Lancer le conteneur qui se relancera en cas de problĂšme
    podman run -d --replace --restart unless-stopped --name mon_robot_telegram -e TELEGRAM_BOT_TOKEN="1234567890:AABBCCDDEEFF-gghhiijjkkllmmnnoo123" ghcr.io/mon_utilisateur/mon_robot_telegram:latest
    
  4. (Si jamais le conteneur s’arrĂȘte tout seul) Ajoutez le conteneur Ă  systemd :
    podman generate systemd --new --files --name mon_robot_telegram.service
    


Conclusion

Pour ce qui est du dĂ©veloppement, un robot Telegram ne demande pas beaucoup de compĂ©tences. Utiliser Python et Telebot est certainement la mĂ©thode la plus simple pour y parvenir, et moi j’adore la simplicitĂ©.

Il y a beaucoup de moyens bien coĂ»teux pour hĂ©berger un robot Telegram. Je n’ai pas choisi la maniĂšre la plus Ă©conomique mais ça m’a permis d’apprendre pas mal de choses.

Gardez bien Ă  l’esprit qu’il n’est pas possible d’hĂ©berger deux instances de robots Telegram en parallĂšle, donc pas de redondance acceptable hĂ©las


Si vous avez des questions ou des suggestions, n’hĂ©sitez pas Ă  me contacter par mail, sur LinkedIn ou directement en envoyant une issue sur GitHub