Coder et hĂ©berger un bot Telegram avec Python đ
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.
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
- Ouvrez Telegram et recherchez “BotFather”
- Envoyez la commande
/newbot
et suivez les instructions - Notez le token API (il reste dans la conversation si jamais vous l’oubliez)
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
- 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)
- 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
- 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
- (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