Agent Telegram — notifications et commandes depuis son téléphone
Déployer un agent OpenClaw accessible via Telegram ou WhatsApp pour interagir avec son écosystème IA depuis son téléphone.
⚠️ Archivé — Ce tuto documente OpenClaw, framework remplacé par Hermes Agent (Nous Research, MIT License) depuis mai 2026. Contenu conservé à titre de référence historique. Voir 20-hermes/architecture pour l’écosystème actuel.
Temps estimé : 45 min
Résultat final : Un agent OpenClaw répond à tes messages Telegram, exécute des actions domotiques sur validation humaine, et ignore silencieusement tout compte non-autorisé.
Prérequis :
- TUTO-03 complété — OpenClaw opérationnel, agent
telegram-agentconfiguré - TUTO-05 complété — OpenClaw connecté à Home Assistant via Tailscale
- Un compte Telegram actif
- Variables d’environnement prêtes :
TELEGRAM_BOT_TOKEN,TELEGRAM_CHAT_ID
Objectif
Connecter OpenClaw à Telegram pour :
- Envoyer et recevoir des messages via un bot dédié
- Déclencher des actions domotiques (HA) par commande textuelle
- Bloquer toute interaction depuis un compte non-autorisé
- Appliquer une validation humaine avant toute action irréversible
Étape 1 : Créer le bot Telegram via BotFather
- Ouvre Telegram → recherche
@BotFather - Envoie
/newbot - Suis les instructions :
- Nom du bot : ex.
MonAssistant IA - Username : ex.
mon_assistant_ocbot(doit se terminer parbot)
- Nom du bot : ex.
- BotFather retourne un token de la forme
123456789:AAHxxxxxxxxxxxxxxxxxxxxxx
# Ajouter le token dans les variables d'environnement
echo 'export TELEGRAM_BOT_TOKEN="123456789:AAHxxxxxxxxxxxxxxxxxxxxxx"' >> ~/.openclaw.env
source ~/.openclaw.env
ne jamais écrire ce token en dur dans un fichier de config.
Ne jamais le commiter dans un repo, même privé.
Si le token est exposé : BotFather → /revoke immédiat, puis /newbot.
# Vérifier que la variable est chargée
echo "${TELEGRAM_BOT_TOKEN:0:10}..."
# Doit afficher les 10 premiers caractères du token
- Récupérer ton
chat_idpersonnel :- Envoie un message quelconque à ton bot
- Puis exécute :
curl -s "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/getUpdates" \
| jq '.result[0].message.chat.id'
# Ajouter le chat_id dans les variables d'environnement
echo 'export TELEGRAM_CHAT_ID="TON_CHAT_ID"' >> ~/.openclaw.env
source ~/.openclaw.env
si getUpdates retourne un tableau vide, envoie un message au bot
puis relance la commande. Le chat_id ne change jamais pour un compte Telegram donné.
Checklist étape 1 :
- Bot créé via BotFather
-
TELEGRAM_BOT_TOKENdans~/.openclaw.env -
TELEGRAM_CHAT_IDdans~/.openclaw.env - Variables sourcées et vérifiées
Étape 2 : Configurer l’allowlist Telegram dans openclaw.json
Sans allowlist, n’importe qui connaissant le username de ton bot peut interagir avec ton agent.
# Ouvrir openclaw.json
nano ~/.openclaw/openclaw.json
Section à configurer pour telegram-agent :
{
"agents": {
"telegram-agent": {
"transport": "telegram",
"telegram": {
"botToken": "${TELEGRAM_BOT_TOKEN}",
"allowedChatIds": ["${TELEGRAM_CHAT_ID}"],
"silentRejectUnknown": true,
"webhookMode": false
},
"tools": {
"exec": {"security": "none"},
"web_search": {"security": "read"},
"ha_api": {"security": "read"}
}
}
}
}
"botToken": "${TELEGRAM_BOT_TOKEN}" — la syntaxe ${VAR} est
interprétée par OpenClaw au démarrage depuis les variables d’environnement.
Jamais la valeur en dur. Si tu vois le token brut dans openclaw.json : rotation immédiate.
"silentRejectUnknown": true est non négociable.
Un rejet verbeux ("Tu n'es pas autorisé") confirme l’existence du bot à l’attaquant.
Silence total = le bot semble inexistant pour les comptes non listés.
vérifier que "tools": {"exec": {"security": "none"}} est présent
pour telegram-agent. Cet agent NE DOIT PAS avoir accès à exec.
L’accès exec est réservé au shell interactif local uniquement (cf. TUTO-02d Vecteur 2).
# Vérifier que la config JSON est valide
cat ~/.openclaw/openclaw.json | jq '.agents["telegram-agent"]'
# Recharger OpenClaw pour appliquer la config
openclaw restart telegram-agent
Checklist étape 2 :
-
botToken="${TELEGRAM_BOT_TOKEN}"(jamais la valeur brute) -
allowedChatIdscontient uniquement"${TELEGRAM_CHAT_ID}" -
silentRejectUnknown=true -
exec="none"pourtelegram-agent -
openclaw restart telegram-agent→ pas d’erreur
Étape 3 : Configurer WhatsApp Business API (optionnel — avancé)
⚠️ Niveau avancé : cette étape nécessite un numéro de téléphone dédié, un compte Meta Business vérifié, et ~30 min supplémentaires. Telegram est suffisant pour 95% des cas d’usage. Passer à l’étape 4 si non nécessaire.
Prérequis WhatsApp
- Compte Meta Business Manager vérifié
- Numéro de téléphone dédié (pas ton numéro personnel)
- Token d’accès permanent WhatsApp Cloud API
# Ajouter le token WhatsApp dans les variables d'environnement
echo 'export WHATSAPP_TOKEN="EAAxxxxx..."' >> ~/.openclaw.env
echo 'export WHATSAPP_PHONE_ID="1234567890"' >> ~/.openclaw.env
source ~/.openclaw.env
un token WhatsApp Cloud API compromis permet d’envoyer des messages depuis ton numéro professionnel à tous tes contacts Business. Rotation via Meta → Business Manager → System Users → Revoke token.
Configuration dans openclaw.json :
{
"agents": {
"whatsapp-agent": {
"transport": "whatsapp",
"whatsapp": {
"accessToken": "${WHATSAPP_TOKEN}",
"phoneNumberId": "${WHATSAPP_PHONE_ID}",
"allowedNumbers": ["+33XXXXXXXXX"],
"webhookVerifyToken": "${WHATSAPP_WEBHOOK_SECRET}"
}
}
}
}
allowedNumbers doit contenir uniquement ton numéro personnel au format international.
Le webhookVerifyToken est un secret aléatoire — générer avec :
openssl rand -hex 32
Checklist étape 3 (WhatsApp) :
- Compte Meta Business vérifié
- Numéro dédié (pas perso)
-
WHATSAPP_TOKENetWHATSAPP_PHONE_IDdans~/.openclaw.env -
allowedNumbersconfiguré avec ton seul numéro -
webhookVerifyTokengénéré viaopenssl rand -hex 32
Étape 4 : Tests de messagerie bidirectionnelle
Test 1 — Réception de message
# Vérifier que le bot répond à un message simple
# Envoie "ping" depuis Telegram → le bot doit répondre
curl -s "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/getUpdates" \
| jq '.result[-1] | {from: .message.from.username, text: .message.text}'
Test 2 — Envoi depuis OpenClaw vers Telegram
# Tester l'envoi d'un message depuis le VPS
curl -s -X POST \
"https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-H "Content-Type: application/json" \
-d "{
\"chat_id\": \"${TELEGRAM_CHAT_ID}\",
\"text\": \"✅ Test OpenClaw → Telegram OK\"
}" | jq '.ok'
# Attendu : true
si .ok est false, vérifier le token et le chat_id.
Ne jamais logger les réponses complètes de l’API Telegram dans des fichiers publics —
elles contiennent les métadonnées de tous les messages reçus.
Test 3 — Rejet d’un compte non-autorisé (cf. TUTO-02d Vecteur 3)
# Demander à un ami (ou utiliser un compte test) d'envoyer un message au bot
# ✅ Attendu : aucune réponse du bot
# ❌ Si le bot répond : silentRejectUnknown non appliqué — revoir étape 2
# Vérifier dans les logs OpenClaw que le rejet est loggé en interne
tail -20 ~/.openclaw/logs/telegram-agent.log | grep "rejected\|unauthorized"
Checklist étape 4 :
- Message “ping” → réponse reçue depuis ton compte
- Envoi VPS → Telegram :
.ok = true - Test compte tiers : aucune réponse
- Log de rejet présent dans
telegram-agent.log
Étape 5 : Sécuriser — rate limiting, allowlist, validation humaine pour actions HA
Rate limiting
nano ~/.openclaw/openclaw.json
Ajouter dans la config telegram-agent :
"rateLimit": {
"messagesPerMinute": 10,
"actionsPerHour": 20,
"onExceeded": "silent_drop"
}
sans rate limiting, un flood de messages peut déclencher des centaines
d’appels API Home Assistant en quelques secondes. "silent_drop" est préférable à
une erreur verbeux qui confirme l’existence de la limite à un attaquant.
Validation humaine avant actions HA
Ajouter dans la config telegram-agent :
"humanValidation": {
"enabled": true,
"requiredFor": [
"ha.services.call",
"ha.states.set",
"file.delete",
"git.push",
"git.merge"
],
"confirmationTimeout": 60,
"confirmationKeyword": "oui",
"cancellationKeyword": "non",
"logFile": "~/.openclaw/logs/human-validation.log"
}
"confirmationTimeout": 60 — une action sans confirmation dans les 60s
est annulée automatiquement. Évite les actions fantômes si tu ne vois pas le message.
Tester avec une commande HA bénigne (ex. light.turn_on) pour valider le flux complet.
Vérification finale de la config exec
# Vérifier que exec est bien désactivé pour telegram-agent
cat ~/.openclaw/openclaw.json | jq '.agents["telegram-agent"].tools.exec'
# Attendu : "none"
# ❌ Si absent ou différent : corriger AVANT de connecter Telegram à HA
un agent Telegram avec exec activé = shell distant via Telegram.
Si ton token bot est compromis, l’attaquant a un accès shell à ton VPS.
Cette vérification est bloquante — ne pas continuer si exec != "none".
# Recharger la config
openclaw restart telegram-agent
# Test de validation humaine
# Envoie depuis Telegram : "allume la lumière du salon"
# → L'agent doit répondre : "Action prévue : ha.services.call light.turn_on salon. Confirmer ? (oui/non)"
# → Réponds "oui" → l'action s'exécute
# → Réponds "non" → l'action est annulée et loggée
Checklist étape 5 :
- Rate limiting configuré (
messagesPerMinute: 10) -
humanValidation.enabled: true - Actions HA dans
requiredFor -
exec = "none"pourtelegram-agent— vérifié via jq - Test validation humaine : oui → exécution, non → annulation
- Log
human-validation.logactif
Checklist finale TUTO-06
Bot et authentification
- Bot Telegram créé via BotFather
-
TELEGRAM_BOT_TOKENdans~/.openclaw.env(jamais en dur) -
TELEGRAM_CHAT_IDdans~/.openclaw.env
Sécurité agent
-
allowedChatIds= uniquement ton chat_id -
silentRejectUnknown: true -
exec: "none"pourtelegram-agent— vérifié - Rate limiting actif
- Validation humaine pour toutes les actions HA
Tests validés
- Message reçu depuis ton compte → réponse
- Envoi VPS → Telegram :
.ok = true - Compte tiers → aucune réponse (rejet silencieux)
- Action HA via Telegram avec confirmation humaine : fonctionnelle
Dépannage
Le bot ne répond pas à mes messages
# Vérifier que le token est valide
curl -s "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/getMe" | jq '.ok, .result.username'
# Attendu : true + le username du bot
# Vérifier les logs OpenClaw
tail -50 ~/.openclaw/logs/telegram-agent.log
getUpdates retourne un tableau vide
Envoie d’abord un message au bot depuis Telegram, puis relance. Le polling getUpdates n’a pas de backfill.
chat_id retourne null avec jq
# Afficher le retour complet pour diagnostic
curl -s "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/getUpdates" | jq '.'
# Si .result est vide : envoyer un message au bot d'abord
Validation humaine ne se déclenche pas
# Vérifier la config humanValidation dans openclaw.json
cat ~/.openclaw/openclaw.json | jq '.agents["telegram-agent"].humanValidation'
# Vérifier que openclaw a bien rechargé la config
openclaw status telegram-agent
Références
- Telegram BotFather : https://core.telegram.org/bots#botfather
- Telegram Bot API : https://core.telegram.org/bots/api
- WhatsApp Cloud API : https://developers.facebook.com/docs/whatsapp/cloud-api
- TUTO-02d Vecteur 3 — Allowlist Telegram : TUTO-02d
Tuto suivant : TUTO-07