Logo TelegramTelegramTélécharger
Développement de bots Telegram

Comment créer un bot Telegram avec Python pour automatiser des tâches ?

Par Telegram Équipe technique
créer un bot Telegram, automatiser des tâches avec Telegram, API Telegram Bot, configuration webhook bot Telegram, dépannage bot Telegram, sécuriser un bot Telegram, Python bot Telegram, différence bot Telegram WhatsApp, bonnes pratiques bot Telegram

Introduction : pourquoi automatiser avec un bot Telegram ?

Créer un bot Telegram avec Python est l'une des façons les plus efficaces d'automatiser des tâches répétitives dans votre messagerie. Que ce soit pour envoyer des rappels quotidiens, surveiller des prix, récupérer des données depuis une API externe ou simplement répondre automatiquement à des commandes, un bot bien conçu peut vous faire gagner des heures chaque semaine. Dans ce tutoriel, nous allons parcourir les étapes concrètes pour coder, déployer et maintenir un bot Telegram en Python, en couvrant à la fois les bases et les subtilités de la production. L'API Telegram Bot est mature, bien documentée, et la bibliothèque python-telegram-bot (PTB) en simplifie énormément l'usage. Nous utiliserons la version stable la plus récente au moment de la rédaction de cet article. Avant de commencer, assurez-vous d'avoir un compte Telegram, Python 3.8 ou supérieur installé, et un éditeur de code de votre choix.

💡 Conseil

Si vous débutez avec les bots Telegram, commencez par le bot officiel @BotFather pour créer votre premier bot et obtenir un token. C'est la seule manière officielle d'enregistrer un bot.

Introduction : pourquoi automatiser avec un bot Telegram ?
Introduction : pourquoi automatiser avec un bot Telegram ?

Prérequis et configuration initiale

Créer le bot via BotFather

Ouvrez Telegram, recherchez le contact @BotFather et démarrez une conversation. Envoyez la commande /newbot puis suivez les instructions : choisissez un nom d'affichage (par exemple « MonAssistant ») et un nom d'utilisateur unique se terminant par bot (par exemple mon_assistant_bot). BotFather vous répondra avec un token HTTP API, une chaîne de caractères du type 1234567890:ABCdefGHIjklMNOpqrsTUVwxyz. Conservez ce token dans un endroit sûr, car il permet de contrôler votre bot.

Mettre en place l'environnement Python

Créez un dossier de travail, par exemple mon_bot_telegram, et à l'intérieur ouvrez un terminal. Initialisez un environnement virtuel Python :

python -m venv venv
source venv/bin/activate  # Sur Linux/macOS
# ou venv\Scripts\activate sur Windows

Ensuite, installez la bibliothèque PTB :

pip install python-telegram-bot

Vérifiez que l'installation a réussi en important le module dans un interpréteur Python : import telegram ne doit pas lever d'erreur.

Créer un bot minimal : le mode polling

La méthode la plus simple pour faire fonctionner un bot est le polling : le bot interroge régulièrement les serveurs Telegram pour voir s'il y a de nouveaux messages. C'est parfait pour le développement local et les tests. Une fois que vous maîtrisez ce mécanisme, vous pourrez passer à des configurations plus avancées.

Écrire le script echo_bot.py

Créez un fichier echo_bot.py avec le contenu suivant :

import logging
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes

# Active le logging
logging.basicConfig(format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=logging.INFO)

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    await update.message.reply_text("Bonjour ! Je suis un bot. Envoyez-moi un message, je le répète.")

async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE):
    await update.message.reply_text(update.message.text)

def main():
    # Remplacez par votre token réel
    token = "VOTRE_TOKEN_ICI"
    application = Application.builder().token(token).build()

    application.add_handler(CommandHandler("start", start))
    application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))

    application.run_polling()

if __name__ == "__main__":
    main()

Remplacez VOTRE_TOKEN_ICI par le token fourni par BotFather. Lancez le script : python echo_bot.py. Envoyez /start à votre bot sur Telegram, puis un message quelconque. Le bot doit répondre en répétant votre message.

⚠️ Attention

Ne partagez jamais votre token publiquement. Si vous utilisez un dépôt Git, ajoutez le token dans un fichier .env et utilisez python-dotenv pour le charger.

Définir des commandes personnalisées

Au-delà de /start et /help, vous pouvez créer vos propres commandes. Par exemple, ajoutons une commande /heure qui renvoie l'heure courante. Cela permet d'illustrer comment étendre les fonctionnalités de votre bot avec des réponses dynamiques.

from datetime import datetime

async def heure(update: Update, context: ContextTypes.DEFAULT_TYPE):
    now = datetime.now().strftime("%H:%M:%S")
    await update.message.reply_text(f"Il est {now}")

# Dans main()
application.add_handler(CommandHandler("heure", heure))

Pensez à enregistrer vos commandes auprès de BotFather avec /setcommands pour que les utilisateurs voient la liste en tapant /. Cette étape améliore l'expérience utilisateur en rendant les commandes découvrables.

Automatiser des tâches : exemples concrets

Un bot Telegram devient vraiment utile lorsqu'il exécute des actions périodiques ou déclenchées par des événements. Voici deux scénarios typiques qui montrent comment transformer votre bot en un assistant personnel.

Envoi de rappels quotidiens

Supposons que vous vouliez recevoir un message chaque matin à 8h pour vous rappeler de boire de l'eau. Vous pouvez utiliser APScheduler avec PTB, ou bien laisser le bot tourner en continu et utiliser une boucle asynchrone. Voici une approche simple avec asyncio :

import asyncio
from datetime import time

async def rappel_quotidien(application: Application):
    while True:
        now = datetime.now()
        target = time(8, 0)  # 8h00
        if now.time() >= target:
            # Envoyer le message à un chat spécifique (ex: votre ID utilisateur)
            await application.bot.send_message(chat_id=YOUR_CHAT_ID, text="Pensez à boire de l'eau !")
            # Attendre 24h avant le prochain envoi
            await asyncio.sleep(86400)
        else:
            # Calculer le temps jusqu'à 8h
            seconds = (datetime.combine(now.date(), target) - now).total_seconds()
            await asyncio.sleep(seconds)

Remarque : en production, préférez une solution comme JobQueue intégrée à PTB ou un cron externe pour éviter les bugs de redémarrage. Ces mécanismes offrent une meilleure gestion des tâches planifiées.

Récupérer des données depuis une API

Imaginons que vous souhaitiez connaître le prix du Bitcoin. Ajoutez une commande /bitcoin qui interroge une API publique :

import requests

async def bitcoin(update: Update, context: ContextTypes.DEFAULT_TYPE):
    try:
        response = requests.get("https://api.coindesk.com/v1/bpi/currentprice.json")
        data = response.json()
        price = data["bpi"]["USD"]["rate"]
        await update.message.reply_text(f"Bitcoin : ${price}")
    except Exception as e:
        await update.message.reply_text("Impossible de récupérer le prix.")

Attention : les API externes peuvent avoir des limites de débit. Ajoutez une gestion d'erreur robuste et éventuellement un cache pour éviter de solliciter inutilement le service distant.

Déploiement : webhook vs polling

Pour un usage permanent, le polling n'est pas idéal car il consomme des ressources inutiles. La méthode recommandée en production est le webhook : Telegram envoie directement les mises à jour à votre serveur via une requête HTTP POST. Cela réduit la latence et le nombre de requêtes.

Mettre en place un webhook

Vous avez besoin d'un serveur avec une adresse publique et un certificat SSL (HTTPS). Une solution simple est d'utiliser un serveur VPS ou un service comme Heroku (jusqu'à sa fin de vie gratuite) ou Railway. Voici les étapes génériques :

  1. Déployez votre application Python sur un serveur accessible depuis Internet.
  2. Dans le script principal, utilisez application.run_webhook() au lieu de run_polling().
  3. Définissez les paramètres : listen, port, url_path (par défaut votre token).
  4. Définissez le webhook auprès de Telegram en appelant l'API : https://api.telegram.org/botTOKEN/setWebhook?url=https://votresite.com/TOKEN.
# Exemple d'initialisation webhook
application.run_webhook(
    listen="0.0.0.0",
    port=8443,
    url_path=token,
    webhook_url="https://votresite.com/" + token
)

Vérifiez que le webhook est actif avec getWebhookInfo. En cas de problème, assurez-vous que votre serveur écoute bien sur le port configuré et que le certificat SSL est valide.

💡 Conseil

Si vous développez derrière un NAT, utilisez des outils comme ngrok pour exposer votre serveur local en HTTPS temporairement. Cela permet de tester les webhooks sans déploiement.

Gestion des erreurs et des limites de l'API

L'API Telegram impose des limites : 30 messages par seconde par chat, 1 message par seconde par chat pour les messages en masse, etc. Si votre bot doit envoyer des notifications à plusieurs utilisateurs, prévoyez un délai entre les envois. Utilisez asyncio.sleep(1) après chaque lot de 20 messages. Pour les erreurs réseau, utilisez le mécanisme de retry intégré de PTB ou un décorateur de réessai. Enregistrez toutes les exceptions dans un fichier de log pour faciliter le débogage.

Gestion des erreurs et des limites de l'API
Gestion des erreurs et des limites de l'API

Bonnes pratiques et sécurité

Stocker les secrets

Ne codez jamais en dur le token. Utilisez des variables d'environnement :

import os
from dotenv import load_dotenv
load_dotenv()
token = os.getenv("BOT_TOKEN")

Créez un fichier .env avec BOT_TOKEN=xxx et ajoutez-le à .gitignore.

Limiter les commandes à certains utilisateurs

Si votre bot est privé, vous pouvez restreindre l'accès en vérifiant l'ID de l'utilisateur :

ALLOWED_USERS = [123456789]  # Votre ID Telegram

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if update.effective_user.id not in ALLOWED_USERS:
        await update.message.reply_text("Accès refusé.")
        return
    await update.message.reply_text("Bienvenue !")

Utiliser les logs pour le monitoring

Configurez un logging avec rotation des fichiers pour suivre les erreurs. En production, surveillez les métriques de base : nombre de messages traités, latence, erreurs. Un service comme Sentry peut être intégré pour une détection proactive des incidents.

Dépannage courant

Voici quelques problèmes fréquents et leurs solutions :

Symptôme Cause probable Solution
Le bot ne répond pas Token invalide ou bot non démarré Vérifiez le token, lancez le script, vérifiez les logs.
Le webhook ne fonctionne pas URL non accessible, certificat SSL manquant Testez avec curl, utilisez un certificat Let's Encrypt.
Erreur "Conflict: terminated by other getUpdates request" Polling et webhook actifs en même temps Supprimez le webhook avec deleteWebhook ou arrêtez l'autre instance.

FAQ

Puis-je héberger mon bot gratuitement ?

Oui, des services comme Railway (offre gratuite limitée), PythonAnywhere (plan gratuit avec limitations) ou Koyeb permettent d'héberger un petit bot. Cependant, les contraintes de temps d'exécution et de bande passante peuvent être restrictives. Pour un usage sérieux, un VPS à 5 €/mois est plus fiable.

Quelle est la différence entre polling et webhook ?

Le polling fait que le client interroge régulièrement les serveurs Telegram pour les nouvelles mises à jour. Le webhook, lui, pousse les mises à jour vers une URL que vous fournissez. Le webhook est plus efficace et recommandé pour la production, car il évite des appels API inutiles et réduit la latence.

Comment gérer plusieurs utilisateurs ?

Le bot traite chaque mise à jour indépendamment. Utilisez context.user_data pour stocker des informations par utilisateur. Pour des tâches planifiées, utilisez JobQueue et associez chaque job à un chat_id.

Le bot peut-il envoyer des messages à des groupes sans y être invité ?

Non, un bot ne peut pas envoyer de messages à un groupe à moins d'en être membre. Il doit d'abord être ajouté par un administrateur du groupe. Une fois dans le groupe, il peut parler librement via send_message avec le chat_id du groupe.

Scénarios quand vous ne devriez pas utiliser un bot Telegram

Les bots Telegram ne sont pas adaptés à tous les cas. Ne les utilisez pas pour :

  • Envoyer des messages transactionnels critiques (paiements, alertes de sécurité) – la fiabilité dépend de la disponibilité du serveur et de Telegram.
  • Traiter de gros volumes de données en temps réel – les limites de débit sont restrictives.
  • Stocker des données sensibles à long terme – les messages ne sont pas chiffrés de bout en bout pour les bots (seulement pour les chats privés entre humains).
  • Remplacer une application web complète – l'interface utilisateur d'un bot reste limitée aux commandes textuelles.

Ces scénarios soulignent l'importance d'évaluer les contraintes techniques avant de choisir un bot Telegram comme solution.

Conclusion et prochaines étapes

Vous avez maintenant les bases pour créer un bot Telegram avec Python, le personnaliser avec des commandes, l'automatiser pour des tâches récurrentes et le déployer en production. N'oubliez pas de consulter la documentation officielle de l'API pour explorer toutes les possibilités : clavier inline, conversations, webhooks avancés, etc.

Pour aller plus loin, envisagez d'ajouter une base de données (SQLite, PostgreSQL) pour persister les données utilisateur, ou d'intégrer des services externes comme Google Calendar, Trello ou des API météo. Le potentiel d'automatisation est immense. Avec les évolutions récentes de PTB, l'utilisation de Application et ContextTypes facilite la maintenance et la montée en charge.

Enfin, partagez votre bot avec vos proches ou votre communauté, et n'oubliez pas de respecter les conditions d'utilisation de Telegram et les lois sur la protection des données (RGPD, etc.). Bon code !