Mainstream messaging

Telegram

PrĂȘt pour la production pour les messages privĂ©s et les groupes de bots via grammY. L’interrogation longue est le transport par dĂ©faut ; le mode Webhook est facultatif.

Configuration rapide

  • CrĂ©er le jeton du bot dans BotFather

    Les deux mĂ©thodes fournissent un jeton Ă  coller dans OpenClaw — choisissez-en une :

    • MĂ©thode par discussion : ouvrez Telegram, discutez avec @BotFather (vĂ©rifiez que l’identifiant est exactement @BotFather), exĂ©cutez /newbot, suivez les instructions et enregistrez le jeton.
    • MĂ©thode web : ouvrez l’application web de BotFather — elle fonctionne dans tous les clients Telegram, notamment web.telegram.org — crĂ©ez le bot dans l’interface et copiez son jeton.
  • Configurer le jeton et la politique des messages privĂ©s

    json5
    {channels: {telegram: {  enabled: true,  botToken: "123:abc",  dmPolicy: "pairing",  groups: { "*": { requireMention: true } },},},}

    Variable d’environnement de secours : TELEGRAM_BOT_TOKEN (compte par dĂ©faut uniquement ; les comptes nommĂ©s doivent utiliser botToken ou tokenFile). Telegram n’utilise pas openclaw channels login telegram ; dĂ©finissez le jeton dans la configuration ou l’environnement, puis dĂ©marrez le Gateway.

  • DĂ©marrer le Gateway et approuver le premier message privĂ©

    bash
    openclaw gatewayopenclaw pairing list telegramopenclaw pairing approve telegram <CODE>

    Les codes d’association expirent aprùs 1 heure.

  • Ajouter le bot Ă  un groupe

    Ajoutez le bot Ă  votre groupe, puis rĂ©cupĂ©rez les deux identifiants nĂ©cessaires Ă  l’accĂšs au groupe :

    • votre identifiant utilisateur Telegram, pour allowFrom / groupAllowFrom
    • l’identifiant de discussion du groupe Telegram, utilisĂ© comme clĂ© sous channels.telegram.groups

    RĂ©cupĂ©rez l’identifiant de discussion du groupe Ă  partir de openclaw logs --follow, d’un bot d’identification des messages transfĂ©rĂ©s ou de getUpdates dans l’API Bot. Une fois le groupe autorisĂ©, /whoami@<bot_username> confirme les identifiants de l’utilisateur et du groupe.

    Les identifiants négatifs de supergroupes commençant par -100 sont des identifiants de discussion de groupe. Ils doivent figurer sous channels.telegram.groups, et non dans groupAllowFrom.

  • ParamĂštres cĂŽtĂ© Telegram

    Mode de confidentialité et visibilité dans les groupes

    Les bots Telegram utilisent par dĂ©faut le mode de confidentialitĂ©, qui limite les messages de groupe qu’ils reçoivent.

    Pour voir tous les messages de groupe, vous pouvez :

    • dĂ©sactiver le mode de confidentialitĂ© avec /setprivacy, ou
    • nommer le bot administrateur du groupe.

    AprÚs avoir modifié le mode de confidentialité, supprimez puis rajoutez le bot dans chaque groupe afin que Telegram applique la modification.

    Autorisations de groupe

    Le statut d’administrateur se gùre dans les paramùtres du groupe Telegram. Les bots administrateurs reçoivent tous les messages du groupe, ce qui est utile pour un fonctionnement permanent dans les groupes.

    Options BotFather utiles
    • /setjoingroups — autoriser ou refuser l’ajout aux groupes
    • /setprivacy — comportement de visibilitĂ© dans les groupes

    Les mĂȘmes paramĂštres sont disponibles dans l’application web de BotFather si vous prĂ©fĂ©rez une interface aux commandes de discussion.

    Mini App du tableau de bord

    Exécutez /dashboard dans un message privé avec le bot pour ouvrir le tableau de bord OpenClaw dans Telegram.

    Prérequis :

    • gateway.tailscale.mode: "serve" ou "funnel" pour l’URL HTTPS publiĂ©e de la Mini App.
    • Votre identifiant utilisateur Telegram numĂ©rique doit figurer dans la valeur effective de allowFrom du compte sĂ©lectionnĂ© ou dans commands.ownerAllowFrom.
    • Utilisez un message privĂ©. Dans les groupes, /dashboard rĂ©pond avec open this in a DM with the bot et n’envoie aucun bouton.
    • Installations Docker : les modes Serve/Funnel exigent que le Gateway se lie Ă  l’interface de bouclage Ă  cĂŽtĂ© de tailscaled, ce que la mise en rĂ©seau par pont avec des ports publiĂ©s ne permet pas. ExĂ©cutez le conteneur du Gateway avec network_mode: host et montez dans le conteneur le socket tailscaled de l’hĂŽte (/var/run/tailscale) ainsi que la CLI tailscale.

    La Mini App est un chemin v1 rĂ©servĂ© Ă  Tailscale et ne prend pas en charge l’iframe Telegram Web.

    Contrîle d’accùs et activation

    Identité du bot dans les groupes

    Dans les groupes et les sujets de forum, une mention explicite de l’identifiant configurĂ© du bot (par exemple @my_bot) s’adresse Ă  l’agent OpenClaw sĂ©lectionnĂ©, mĂȘme si le nom de persona de l’agent diffĂšre du nom d’utilisateur Telegram. La politique de silence dans les groupes continue de s’appliquer au trafic sans rapport, mais l’identifiant du bot n’est jamais « quelqu’un d’autre ».

    Politique des messages privés

    channels.telegram.dmPolicy contrĂŽle l’accĂšs aux messages privĂ©s :

    • pairing (par dĂ©faut)
    • allowlist (nĂ©cessite au moins un ID d’expĂ©diteur dans allowFrom)
    • open (nĂ©cessite que allowFrom contienne "*")
    • disabled

    dmPolicy: "open" avec allowFrom: ["*"] permet Ă  tout compte Telegram qui trouve ou devine le nom d’utilisateur du bot de lui envoyer des commandes. Utilisez cette configuration uniquement pour des bots volontairement publics dont les outils sont strictement restreints ; les bots Ă  propriĂ©taire unique doivent utiliser allowlist avec des ID utilisateur numĂ©riques.

    channels.telegram.allowFrom accepte les ID utilisateur numĂ©riques de Telegram. Les prĂ©fixes telegram: / tg: sont acceptĂ©s et normalisĂ©s. Dans les configurations multicomptes, une valeur restrictive de channels.telegram.allowFrom au niveau supĂ©rieur constitue une limite de sĂ©curitĂ© : une valeur allowFrom: ["*"] au niveau d’un compte ne rend pas ce compte public, sauf si la liste d’autorisation effective aprĂšs fusion contient toujours explicitement un caractĂšre gĂ©nĂ©rique. dmPolicy: "allowlist" avec une valeur allowFrom vide bloque tous les messages privĂ©s et est rejetĂ© par la validation de la configuration. La configuration initiale demande uniquement des ID utilisateur numĂ©riques. Si votre configuration contient des entrĂ©es de liste d’autorisation sous la forme @username provenant d’une ancienne configuration initiale, exĂ©cutez openclaw doctor --fix pour les convertir en ID numĂ©riques (dans la mesure du possible ; nĂ©cessite un jeton de bot Telegram). Si vous utilisiez auparavant les fichiers de liste d’autorisation du magasin d’appairage, openclaw doctor --fix peut rĂ©cupĂ©rer les entrĂ©es dans channels.telegram.allowFrom pour les flux utilisant une liste d’autorisation (par exemple, lorsque dmPolicy: "allowlist" ne contient encore aucun ID explicite).

    Pour les bots Ă  propriĂ©taire unique, prĂ©fĂ©rez dmPolicy: "allowlist" avec des ID numĂ©riques explicites dans allowFrom plutĂŽt que de dĂ©pendre d’approbations d’appairage antĂ©rieures.

    Confusion frĂ©quente : l’approbation d’un appairage par message privĂ© ne signifie pas « cet expĂ©diteur est autorisĂ© partout ». L’appairage accorde uniquement l’accĂšs aux messages privĂ©s. S’il n’existe encore aucun propriĂ©taire de commandes, le premier appairage approuvĂ© dĂ©finit Ă©galement commands.ownerAllowFrom, ce qui attribue les commandes rĂ©servĂ©es au propriĂ©taire et les approbations d’exĂ©cution Ă  un compte opĂ©rateur explicite. L’autorisation des expĂ©diteurs dans les groupes provient toujours de listes d’autorisation explicites dans la configuration. Pour ĂȘtre autorisĂ© avec une mĂȘme identitĂ© Ă  la fois dans les messages privĂ©s et pour les commandes de groupe : ajoutez votre ID utilisateur numĂ©rique Telegram Ă  channels.telegram.allowFrom et, pour les commandes rĂ©servĂ©es au propriĂ©taire, vĂ©rifiez que commands.ownerAllowFrom contient telegram:<your user id>.

    Trouver votre ID utilisateur Telegram

    Méthode plus sûre (sans bot tiers) : envoyez un message privé à votre bot, exécutez openclaw logs --follow, puis consultez from.id.

    MĂ©thode officielle de l’API Bot :

    bash
    curl "https://api.telegram.org/bot<bot_token>/getUpdates"

    Services tiers (moins confidentiels) : @userinfobot ou @getidsbot.

    Politique de groupe et listes d’autorisation

    Deux contrîles s’appliquent conjointement :

    1. Quels groupes sont autorisés (channels.telegram.groups)

      • aucune configuration groups, groupPolicy: "open" : tous les groupes passent les vĂ©rifications d’ID de groupe
      • aucune configuration groups, groupPolicy: "allowlist" (par dĂ©faut) : tous les groupes sont bloquĂ©s jusqu’à l’ajout d’entrĂ©es dans groups (ou de "*")
      • groups configurĂ© : agit comme une liste d’autorisation (ID explicites ou "*")
    2. Quels expéditeurs sont autorisés dans les groupes (channels.telegram.groupPolicy)

      • open / allowlist (par dĂ©faut) / disabled

    groupAllowFrom filtre les expĂ©diteurs des groupes ; s’il n’est pas dĂ©fini, Telegram se rabat sur allowFrom (et non sur le magasin d’appairage — l’autorisation des expĂ©diteurs de groupe n’hĂ©rite jamais des approbations du magasin d’appairage des messages privĂ©s, une limite de sĂ©curitĂ© depuis 2026.2.25). Les entrĂ©es de groupAllowFrom doivent ĂȘtre des ID utilisateur numĂ©riques de Telegram (les prĂ©fixes telegram: / tg: sont normalisĂ©s) ; les entrĂ©es non numĂ©riques sont ignorĂ©es. N’y placez pas d’ID de discussion de groupe ou de supergroupe : les ID de discussion nĂ©gatifs doivent ĂȘtre placĂ©s sous channels.telegram.groups. ModĂšle pratique pour les bots Ă  propriĂ©taire unique : dĂ©finissez votre ID utilisateur dans channels.telegram.allowFrom, laissez groupAllowFrom non dĂ©fini et autorisez les groupes cibles sous channels.telegram.groups. Si channels.telegram est entiĂšrement absent de la configuration, l’environnement d’exĂ©cution utilise par dĂ©faut le mode fermĂ© groupPolicy="allowlist", sauf si channels.defaults.groupPolicy est explicitement dĂ©fini.

    Configuration d’un groupe rĂ©servĂ© au propriĂ©taire :

    json5
    {channels: {telegram: {  enabled: true,  dmPolicy: "pairing",  allowFrom: ["&lt;YOUR_TELEGRAM_USER_ID&gt;"],  groupPolicy: "allowlist",  groups: {    "&lt;GROUP_CHAT_ID&gt;": {      requireMention: true,    },  },},},}

    Testez depuis le groupe avec @<bot_username> ping. Les messages de groupe ordinaires ne déclenchent pas le bot tant que requireMention: true.

    Autoriser tous les membres dans un groupe précis :

    json5
    {channels: {telegram: {  groups: {    "-1001234567890": {      groupPolicy: "open",      requireMention: false,    },  },},},}

    Autoriser uniquement certains utilisateurs dans un groupe précis :

    json5
    {channels: {telegram: {  groups: {    "-1001234567890": {      requireMention: true,      allowFrom: ["8734062810", "745123456"],    },  },},},}

    Comportement des mentions

    Par défaut, les réponses dans les groupes nécessitent une mention. Une mention peut provenir :

    • d’une mention native @botusername, ou
    • d’un modĂšle de mention dans agents.list[].groupChat.mentionPatterns ou messages.groupChat.mentionPatterns

    Options au niveau de la session (état uniquement, non persistant) : /activation always, /activation mention. Utilisez la configuration pour rendre ce réglage persistant :

    json5
    {channels: {telegram: {  groups: {    "*": { requireMention: false },  },},},}

    Le contexte de l’historique du groupe est toujours activĂ© et limitĂ© par historyLimit. DĂ©finissez channels.telegram.historyLimit: 0 pour dĂ©sactiver la fenĂȘtre d’historique du groupe. openclaw doctor --fix supprime la clĂ© retirĂ©e includeGroupHistoryContext.

    Pour obtenir l’ID de discussion du groupe : transfĂ©rez un message du groupe Ă  @userinfobot / @getidsbot, consultez chat.id dans openclaw logs --follow, inspectez getUpdates dans l’API Bot ou, une fois le groupe autorisĂ©, exĂ©cutez /whoami@<bot_username>.

    Comportement de l’environnement d’exĂ©cution

    • Telegram s’exĂ©cute dans le processus du Gateway.
    • Le routage est dĂ©terministe : les rĂ©ponses aux messages entrants de Telegram sont renvoyĂ©es Ă  Telegram (le modĂšle ne choisit pas les canaux).
    • Les messages entrants sont normalisĂ©s dans l’enveloppe de canal partagĂ©e, avec les mĂ©tadonnĂ©es de rĂ©ponse, les espaces rĂ©servĂ©s aux mĂ©dias et le contexte persistant de la chaĂźne de rĂ©ponses pour les rĂ©ponses observĂ©es par le Gateway.
    • Les sessions de groupe sont isolĂ©es par ID de groupe. Les sujets de forum ajoutent :topic:<threadId>.
    • Les messages privĂ©s peuvent contenir message_thread_id ; OpenClaw le conserve pour les rĂ©ponses. Les sessions de sujets en message privĂ© ne sont sĂ©parĂ©es que lorsque getMe de Telegram indique has_topics_enabled: true pour le bot ; sinon, les messages privĂ©s restent dans la session non segmentĂ©e.
    • L’interrogation longue utilise le runner grammY avec un sĂ©quençage par discussion et par fil. La concurrence du rĂ©cepteur du runner utilise agents.defaults.maxConcurrent.
    • Au dĂ©marrage avec plusieurs comptes, le nombre de sondes getMe simultanĂ©es est limitĂ© afin que les grandes flottes de bots ne lancent pas toutes les sondes de compte en mĂȘme temps.
    • Chaque processus du Gateway protĂšge l’interrogation longue afin qu’un seul poller actif puisse utiliser un jeton de bot Ă  la fois. Des conflits getUpdates 409 persistants indiquent qu’un autre Gateway OpenClaw, un script ou un poller externe utilise le mĂȘme jeton.
    • Par dĂ©faut, le mĂ©canisme de surveillance de l’interrogation redĂ©marre aprĂšs 120 secondes sans signe de fonctionnement de getUpdates terminĂ©. Augmentez channels.telegram.pollingStallThresholdMs (30000-600000, remplacements par compte pris en charge) uniquement si votre dĂ©ploiement subit de faux redĂ©marrages pour blocage de l’interrogation pendant des tĂąches de longue durĂ©e.
    • L’API Telegram Bot ne prend pas en charge les accusĂ©s de lecture (sendReadReceipts ne s’applique pas).

    Référence des fonctionnalités

    Aperçu du flux en direct (modifications de message)

    OpenClaw diffuse les rĂ©ponses partielles en temps rĂ©el dans les discussions directes, les groupes et les sujets : il envoie un message d’aperçu, puis appelle editMessageText Ă  plusieurs reprises avant de finaliser le message sur place.

    • channels.telegram.streaming accepte off | partial | block | progress (valeur par dĂ©faut : partial)
    • les courts aperçus initiaux de rĂ©ponse sont temporisĂ©s, puis matĂ©rialisĂ©s aprĂšs un dĂ©lai limitĂ© si l’exĂ©cution est toujours active
    • progress conserve un seul brouillon d’état modifiable pour la progression des outils, affiche le libellĂ© d’état stable lorsque l’activitĂ© de rĂ©ponse arrive avant la progression des outils, l’efface Ă  la fin et envoie la rĂ©ponse finale comme un message normal
    • streaming.preview.toolProgress dĂ©termine si les mises Ă  jour des outils/de progression rĂ©utilisent le mĂȘme message d’aperçu modifiĂ© (valeur par dĂ©faut : true lorsque la diffusion de l’aperçu est active)
    • streaming.preview.commandText contrĂŽle les dĂ©tails des commandes/exĂ©cutions dans ces lignes : raw (valeur par dĂ©faut) ou status (libellĂ© de l’outil uniquement)
    • streaming.progress.commentary (valeur par dĂ©faut : false) permet d’inclure les commentaires/prĂ©ambules de l’assistant dans le brouillon de progression temporaire
    • les anciennes clĂ©s channels.telegram.streamMode, les valeurs boolĂ©ennes de streaming et les clĂ©s retirĂ©es de l’aperçu natif des brouillons sont dĂ©tectĂ©es ; exĂ©cutez openclaw doctor --fix pour les migrer

    Les lignes de progression des outils sont les courtes mises Ă  jour d’état affichĂ©es pendant l’exĂ©cution des outils (exĂ©cution de commandes, lecture de fichiers, mises Ă  jour de planification, rĂ©sumĂ©s de correctifs, prĂ©ambule/commentaires de Codex en mode serveur d’application). Telegram les conserve activĂ©es par dĂ©faut (ce qui correspond au comportement publiĂ© depuis v2026.4.22+).

    Conservez les modifications de l’aperçu de rĂ©ponse, mais masquez les lignes de progression des outils :

    json
    {  "channels": {    "telegram": {      "streaming": {        "mode": "partial",        "preview": { "toolProgress": false }      }    }  }}

    Conservez la progression des outils visible, mais masquez le texte des commandes/exécutions :

    json
    {  "channels": {    "telegram": {      "streaming": {        "mode": "partial",        "preview": { "commandText": "status" }      }    }  }}

    Le mode progress affiche la progression des outils sans modifier ce message pour y insérer la réponse finale. Placez la stratégie relative au texte des commandes sous streaming.progress :

    json
    {  "channels": {    "telegram": {      "streaming": {        "mode": "progress",        "progress": {          "toolProgress": true,          "commandText": "status"        }      }    }  }}

    streaming.mode: "off" dĂ©sactive les modifications de l’aperçu et supprime les messages gĂ©nĂ©riques liĂ©s aux outils/Ă  la progression au lieu de les envoyer comme messages d’état autonomes ; les demandes d’approbation, les mĂ©dias et les erreurs suivent toujours le processus normal de livraison finale. streaming.preview.toolProgress: false conserve uniquement les modifications de l’aperçu de rĂ©ponse.

    Pour les rĂ©ponses textuelles uniquement : les aperçus courts reçoivent la modification finale sur place ; les rĂ©ponses finales longues divisĂ©es en plusieurs messages rĂ©utilisent l’aperçu comme premier segment, puis envoient uniquement le reste ; les rĂ©ponses finales en mode progression effacent le brouillon d’état et utilisent la livraison finale normale ; si la modification finale Ă©choue avant que son achĂšvement soit confirmĂ©, OpenClaw revient Ă  la livraison finale normale et nettoie l’aperçu obsolĂšte. Pour les rĂ©ponses complexes (charges utiles multimĂ©dias), OpenClaw revient toujours Ă  la livraison finale normale et nettoie l’aperçu.

    La diffusion de l’aperçu et la diffusion par blocs sont mutuellement exclusives — lorsque la diffusion par blocs est explicitement activĂ©e, OpenClaw ignore le flux d’aperçu afin d’éviter une double diffusion.

    Raisonnement : /reasoning stream diffuse le raisonnement dans l’aperçu en direct pendant la gĂ©nĂ©ration, puis supprime l’aperçu du raisonnement aprĂšs la livraison finale (utilisez /reasoning on pour le garder visible). La rĂ©ponse finale est envoyĂ©e sans le texte du raisonnement.

    Mise en forme enrichie des messages

    Par dĂ©faut, le texte sortant utilise les messages HTML standard de Telegram, lisibles sur les clients actuels : gras, italique, liens, code, divulgĂącheurs, citations — et non les blocs enrichis exclusifs de l’API Bot 10.1 (tableaux natifs, dĂ©tails, mĂ©dias enrichis, formules).

    Activez les messages enrichis de l’API Bot 10.1 :

    json5
    {channels: {telegram: {  richMessages: true,},},}

    Lorsque cette option est activĂ©e : l’agent est informĂ© que les messages enrichis sont disponibles pour ce bot/compte ; le texte Markdown est rendu sous forme de HTML enrichi Telegram au moyen de la reprĂ©sentation intermĂ©diaire Markdown d’OpenClaw ; les charges utiles HTML enrichies explicites conservent les balises prises en charge par l’API Bot 10.1 (titres, tableaux, dĂ©tails, mĂ©dias enrichis, formules) ; les lĂ©gendes des mĂ©dias utilisent toujours les lĂ©gendes HTML de Telegram (les messages enrichis ne remplacent pas les lĂ©gendes, qui restent limitĂ©es Ă  1024 caractĂšres).

    Cela évite que le texte du modÚle soit interprété selon les marqueurs Markdown enrichis de Telegram, afin que des montants comme $400-600K ne soient pas analysés comme des expressions mathématiques. Le texte enrichi long est automatiquement divisé selon les limites de Telegram. Les tableaux dépassant la limite de 20 colonnes sont convertis en bloc de code.

    Valeur par dĂ©faut : dĂ©sactivĂ©, pour assurer la compatibilitĂ© avec les clients — certains clients actuels pour ordinateur, Web, Android et tiers affichent les messages enrichis acceptĂ©s comme non pris en charge. Laissez cette option dĂ©sactivĂ©e sauf si tous les clients utilisĂ©s avec le bot peuvent afficher ces messages. /status indique si les messages enrichis sont activĂ©s ou dĂ©sactivĂ©s pour la session actuelle.

    Les aperçus de liens sont activés par défaut. channels.telegram.linkPreview: false désactive la détection automatique des entités dans le texte enrichi.

    Commandes natives et commandes personnalisées

    Le menu des commandes de Telegram est enregistré au démarrage avec setMyCommands. commands.native: "auto" active les commandes natives pour Telegram.

    Ajoutez des entrées personnalisées au menu des commandes :

    json5
    {channels: {telegram: {  customCommands: [    { command: "backup", description: "Sauvegarde Git" },    { command: "generate", description: "Créer une image" },  ],},},}

    RÚgles : les noms sont normalisés (suppression du / initial, conversion en minuscules) ; motif valide : a-z, 0-9, _ ; longueur de 1 à 32 ; les commandes personnalisées ne peuvent pas remplacer les commandes natives ; les conflits et doublons sont ignorés et consignés dans les journaux.

    Les commandes personnalisĂ©es sont uniquement des entrĂ©es de menu : elles n’implĂ©mentent pas automatiquement de comportement. Les commandes de Plugin/Skills peuvent toujours fonctionner lorsqu’elles sont saisies, mĂȘme si elles ne figurent pas dans le menu Telegram. Si les commandes natives sont dĂ©sactivĂ©es, les commandes intĂ©grĂ©es sont supprimĂ©es ; les commandes personnalisĂ©es ou de Plugin peuvent toujours ĂȘtre enregistrĂ©es si elles sont configurĂ©es.

    Échecs de configuration courants :

    • setMyCommands failed avec BOT_COMMANDS_TOO_MUCH aprĂšs une nouvelle tentative de rĂ©duction signifie que le menu dĂ©borde toujours ; rĂ©duisez les commandes de plugins, de Skills ou personnalisĂ©es, ou dĂ©sactivez channels.telegram.commands.native.
    • L’échec de deleteWebhook, deleteMyCommands ou setMyCommands avec 404: Not Found, alors que les commandes curl directes de la Bot API fonctionnent, signifie gĂ©nĂ©ralement que channels.telegram.apiRoot a Ă©tĂ© dĂ©fini sur le point de terminaison /bot&lt;TOKEN&gt; complet. apiRoot doit uniquement ĂȘtre la racine de la Bot API ; openclaw doctor --fix supprime un /bot&lt;TOKEN&gt; final ajoutĂ© par erreur.
    • getMe returned 401 signifie que Telegram a rejetĂ© le jeton de bot configurĂ©. Mettez Ă  jour botToken, tokenFile ou TELEGRAM_BOT_TOKEN (compte par dĂ©faut) avec le jeton BotFather actuel ; OpenClaw s’arrĂȘte avant l’interrogation, ce qui Ă©vite de signaler cette erreur comme un Ă©chec du nettoyage du Webhook.
    • setMyCommands failed accompagnĂ© d’erreurs rĂ©seau ou de rĂ©cupĂ©ration signifie gĂ©nĂ©ralement que les connexions DNS/HTTPS sortantes vers api.telegram.org sont bloquĂ©es.

    Commandes d’association d’appareils (plugin device-pair)

    Lorsqu’il est installĂ© :

    1. /pair génÚre un code de configuration
    2. collez le code dans l’application iOS
    3. /pair pending répertorie les demandes en attente (y compris le rÎle et les périmÚtres)
    4. approuvez : /pair approve <requestId>, /pair approve (s’il n’y a qu’une seule demande en attente) ou /pair approve latest

    Si un appareil rĂ©essaie avec des informations d’authentification modifiĂ©es (rĂŽle, pĂ©rimĂštres, clĂ© publique), la demande prĂ©cĂ©dente en attente est remplacĂ©e par une nouvelle demande dotĂ©e d’un nouveau requestId ; exĂ©cutez Ă  nouveau /pair pending avant de l’approuver.

    Plus de détails : Association.

    Boutons intégrés

    Configurez la portée du clavier intégré :

    json5
    {channels: {telegram: {  capabilities: {    inlineButtons: "allowlist",  },},},}

    Remplacement par compte :

    json5
    {channels: {telegram: {  accounts: {    main: {      capabilities: {        inlineButtons: "allowlist",      },    },  },},},}

    PortĂ©es : off, dm, group, all, allowlist (par dĂ©faut). L’ancienne syntaxe capabilities: ["inlineButtons"] correspond Ă  "all".

    Exemple d’action de message :

    json5
    {action: "send",channel: "telegram",to: "123456789",message: "Choisissez une option :",buttons: [[  { text: "Oui", callback_data: "yes" },  { text: "Non", callback_data: "no" },],[{ text: "Annuler", callback_data: "cancel" }],],}

    Exemple de bouton de mini-application :

    json5
    {action: "send",channel: "telegram",to: "123456789",message: "Ouvrir l’application :",presentation: {blocks: [  {    type: "buttons",    buttons: [{ label: "Lancer", web_app: { url: "https://example.com/app" } }],  },],},}

    Les boutons web_app fonctionnent uniquement dans les discussions privées entre un utilisateur et le bot.

    Les clics de rappel qui ne sont pas pris en charge par un gestionnaire interactif de Plugin enregistrĂ© sont transmis Ă  l’agent sous forme de texte : callback_data: <value>.

    Actions de message Telegram pour les agents et l’automatisation

    Actions :

    • sendMessage (to, content, mediaUrl facultatif, replyToMessageId, messageThreadId)
    • react (chatId, messageId, emoji)
    • deleteMessage (chatId, messageId)
    • editMessage (chatId, messageId, content ou caption, boutons intĂ©grĂ©s presentation facultatifs ; les modifications portant uniquement sur les boutons mettent Ă  jour le balisage de rĂ©ponse)
    • createForumTopic (chatId, name, iconColor facultatif, iconCustomEmojiId)

    Alias ergonomiques : send, react, delete, edit, sticker, sticker-search, topic-create.

    Activation : channels.telegram.actions.sendMessage, deleteMessage, reactions, sticker (par dĂ©faut : dĂ©sactivĂ©). edit, createForumTopic et editForumTopic sont activĂ©s par dĂ©faut, sans option dĂ©diĂ©e. Les envois Ă  l’exĂ©cution utilisent l’instantanĂ© actif de la configuration et des secrets issu du dĂ©marrage ou du rechargement ; les chemins d’action ne rĂ©solvent donc pas Ă  nouveau les valeurs SecretRef Ă  chaque envoi.

    Sémantique de suppression des réactions : /tools/reactions.

    Balises de fil de réponses

    Balises explicites de fil de réponses dans la sortie générée :

    • [[reply_to_current]] — rĂ©pond au message dĂ©clencheur
    • [[reply_to:<id>]] — rĂ©pond Ă  un ID de message prĂ©cis

    channels.telegram.replyToMode : off (par défaut), first, all.

    Lorsque le fil de rĂ©ponses est activĂ© et que le texte ou la lĂ©gende d’origine est disponible, OpenClaw ajoute automatiquement un extrait sous forme de citation native. Telegram limite le texte des citations natives Ă  1024 unitĂ©s de code UTF-16 ; les messages plus longs sont citĂ©s Ă  partir du dĂ©but et utilisent une rĂ©ponse simple si Telegram rejette la citation.

    off désactive uniquement le fil de réponses implicite ; les balises explicites [[reply_to_*]] restent prises en compte.

    Sujets de forum et comportement des fils

    Supergroupes de forum : les clĂ©s de session des sujets ajoutent :topic:<threadId> ; les rĂ©ponses et l’indicateur de saisie ciblent le fil du sujet ; le chemin de configuration du sujet est channels.telegram.groups.<chatId>.topics.<threadId>.

    Le sujet gĂ©nĂ©ral (threadId=1) constitue un cas particulier : les envois de messages omettent message_thread_id (Telegram rejette sendMessage(...thread_id=1) avec « fil introuvable »), mais les actions de saisie incluent toujours message_thread_id (nĂ©cessaire empiriquement pour que l’indicateur de saisie apparaisse).

    Les entrĂ©es de sujet hĂ©ritent des paramĂštres du groupe, sauf remplacement (requireMention, allowFrom, skills, systemPrompt, enabled, groupPolicy). agentId est propre au sujet et n’hĂ©rite pas des valeurs par dĂ©faut du groupe. topics."*" dĂ©finit les valeurs par dĂ©faut de chaque sujet de ce groupe ; les ID de sujet exacts restent prioritaires sur "*".

    Routage de l’agent par sujet : chaque sujet peut ĂȘtre routĂ© vers un agent diffĂ©rent au moyen de agentId dans la configuration du sujet, ce qui lui attribue son propre espace de travail, sa propre mĂ©moire et sa propre session :

    json5
    {  channels: {    telegram: {      groups: {        "-1001234567890": {          topics: {            "1": { agentId: "main" },      // Sujet général -> agent principal            "3": { agentId: "zu" },        // Sujet de développement -> agent zu            "5": { agentId: "coder" }      // Revue de code -> agent coder          }        }      }    }  }}

    Chaque sujet dispose alors de sa propre clé de session, par exemple agent:zu:telegram:group:-1001234567890:topic:3.

    Liaison persistante d’un sujet ACP : les sujets de forum peuvent Ă©pingler des sessions de harnais ACP au moyen de liaisons typĂ©es de premier niveau (bindings[] avec type: "acp", match.channel: "telegram", peer.kind: "group" et un ID qualifiĂ© par sujet tel que -1001234567890:topic:42). Actuellement limitĂ© aux sujets de forum dans les groupes et supergroupes. Consultez Agents ACP.

    CrĂ©ation d’une session ACP liĂ©e au fil depuis la discussion : /acp spawn <agent> --thread here|auto lie le sujet actuel Ă  une nouvelle session ACP ; les messages suivants y sont routĂ©s directement et OpenClaw Ă©pingle la confirmation de crĂ©ation dans le sujet. NĂ©cessite channels.telegram.threadBindings.spawnSessions (par dĂ©faut : true).

    Le contexte de modĂšle expose MessageThreadId et IsForum. Les discussions en message privĂ© comportant message_thread_id conservent les mĂ©tadonnĂ©es de rĂ©ponse, mais n’utilisent des clĂ©s de session tenant compte du fil que lorsque getMe de Telegram indique has_topics_enabled: true. Les anciens remplacements dm.threadReplies et direct.*.threadReplies ont Ă©tĂ© supprimĂ©s ; le mode avec fils de BotFather constitue l’unique source de vĂ©ritĂ©. ExĂ©cutez openclaw doctor --fix pour supprimer les clĂ©s de configuration obsolĂštes.

    Audio, vidéo et autocollants

    Messages audio

    Telegram distingue les messages vocaux des fichiers audio. Par dĂ©faut : comportement de fichier audio ; ajoutez la balise [[audio_as_voice]] dans la rĂ©ponse de l’agent pour forcer l’envoi sous forme de message vocal. Les transcriptions de messages vocaux entrants sont prĂ©sentĂ©es comme du texte gĂ©nĂ©rĂ© par une machine et non fiable dans le contexte de l’agent, mais la dĂ©tection des mentions utilise toujours la transcription brute afin que les messages vocaux soumis Ă  l’exigence de mention continuent de fonctionner.

    json5
    {action: "send",channel: "telegram",to: "123456789",media: "https://example.com/voice.ogg",asVoice: true,}

    Messages vidéo

    Telegram distingue les fichiers vidéo des messages vidéo. Les messages vidéo ne prennent pas en charge les légendes ; le texte de message fourni est envoyé séparément.

    json5
    {action: "send",channel: "telegram",to: "123456789",media: "https://example.com/video.mp4",asVideoNote: true,}

    Emplacements et lieux

    Utilisez l’action send existante avec un objet location autonome. Les coordonnĂ©es envoient une Ă©pingle native ; l’ajout de name et de address envoie une fiche de lieu native. Les envois d’emplacement ne peuvent pas ĂȘtre combinĂ©s avec du texte de message ou un mĂ©dia.

    json5
    {action: "send",channel: "telegram",to: "123456789",location: {latitude: 48.858844,longitude: 2.294351,accuracy: 12,name: "Tour Eiffel",address: "Champ de Mars, Paris",},}

    Autocollants

    Entrants : le format WEBP statique est téléchargé et traité (espace réservé <media:sticker>) ; les formats TGS animés et WEBM vidéo sont ignorés.

    Champs de contexte des stickers : Sticker.emoji, Sticker.setName, Sticker.fileId, Sticker.fileUniqueId, Sticker.cachedDescription. Les descriptions sont mises en cache dans l’état SQLite du Plugin OpenClaw afin de rĂ©duire les appels rĂ©pĂ©tĂ©s au service de vision.

    Activez les actions sur les stickers :

    json5
    {channels: {telegram: {  actions: {    sticker: true,  },},},}

    Envoyez :

    json5
    {action: "sticker",channel: "telegram",to: "123456789",fileId: "CAACAgIAAxkBAAI...",}

    Recherchez dans les stickers mis en cache :

    json5
    {action: "sticker-search",channel: "telegram",query: "chat qui fait signe",limit: 5,}
    Notifications de réactions

    Les rĂ©actions Telegram arrivent sous forme de mises Ă  jour message_reaction, distinctes des charges utiles des messages. Lorsqu’elles sont activĂ©es, OpenClaw met en file d’attente des Ă©vĂ©nements systĂšme tels que Telegram reaction added: 👍 by Alice (@alice) on msg 42.

    • channels.telegram.reactionNotifications: off | own | all (par dĂ©faut : own)
    • channels.telegram.reactionLevel: off | ack | minimal | extensive (par dĂ©faut : minimal)

    own dĂ©signe uniquement les rĂ©actions des utilisateurs aux messages envoyĂ©s par le bot (au mieux, via un cache des messages envoyĂ©s). Les Ă©vĂ©nements de rĂ©action respectent toujours les contrĂŽles d’accĂšs Telegram (dmPolicy, allowFrom, groupPolicy, groupAllowFrom) ; les expĂ©diteurs non autorisĂ©s sont ignorĂ©s.

    Telegram ne fournit pas d’identifiants de fil de discussion dans les mises Ă  jour de rĂ©actions : les groupes sans forum sont acheminĂ©s vers la session de discussion du groupe ; les groupes avec forum sont acheminĂ©s vers la session du sujet gĂ©nĂ©ral (:topic:1), et non vers le sujet d’origine exact.

    Les allowed_updates pour l’interrogation pĂ©riodique/le Webhook incluent automatiquement message_reaction.

    RĂ©actions d’accusĂ© de rĂ©ception

    ackReaction envoie un Ă©moji d’accusĂ© de rĂ©ception pendant qu’OpenClaw traite un message entrant. messages.ackReactionScope dĂ©termine quand il est envoyĂ©.

    Ordre de rĂ©solution de l’émoji :

    • channels.telegram.accounts.<accountId>.ackReaction
    • channels.telegram.ackReaction
    • messages.ackReaction
    • emoji de secours de l’identitĂ© de l’agent (agents.list[].identity.emoji, sinon "👀")

    Telegram attend un emoji Unicode (par exemple "👀") ; utilisez "" pour dĂ©sactiver la rĂ©action pour un canal ou un compte.

    Portée (messages.ackReactionScope, valeur par défaut "group-mentions" ; aucune substitution par compte ou canal Telegram à ce jour) :

    all (messages privĂ©s + groupes, y compris les Ă©vĂ©nements ambiants du salon), direct (messages privĂ©s uniquement), group-all (tous les messages de groupe sauf les Ă©vĂ©nements ambiants du salon, aucun message privĂ©), group-mentions (groupes lorsque le bot est mentionnĂ© ; aucun message privĂ© — valeur par dĂ©faut), off / none (dĂ©sactivĂ©).

    Écritures de configuration depuis les Ă©vĂ©nements et commandes Telegram

    Les Ă©critures de configuration du canal sont activĂ©es par dĂ©faut (configWrites !== false). Les Ă©critures dĂ©clenchĂ©es par Telegram comprennent les Ă©vĂ©nements de migration de groupe (migrate_to_chat_id, met Ă  jour channels.telegram.groups) et /config set / /config unset (nĂ©cessite l’activation des commandes).

    Pour désactiver :

    json5
    {channels: {telegram: {  configWrites: false,},},}
    Interrogation longue ou Webhook

    Le mode par dĂ©faut est l’interrogation longue. Pour le mode Webhook, dĂ©finissez channels.telegram.webhookUrl et channels.telegram.webhookSecret ; les options sont webhookPath (valeur par dĂ©faut /telegram-webhook), webhookHost (valeur par dĂ©faut 127.0.0.1), webhookPort (valeur par dĂ©faut 8787) et webhookCertPath (certificat PEM auto-signĂ© pour les configurations avec adresse IP directe ou sans nom de domaine).

    En mode d’interrogation longue, OpenClaw ne conserve son repĂšre de redĂ©marrage qu’aprĂšs la transmission rĂ©ussie d’une mise Ă  jour ; en cas d’échec d’un gestionnaire, cette mise Ă  jour reste rĂ©essayable dans le mĂȘme processus au lieu d’ĂȘtre marquĂ©e comme terminĂ©e.

    Par dĂ©faut, l’écouteur local se lie Ă  127.0.0.1:8787. Pour une entrĂ©e publique, placez un proxy inverse devant le port local ou dĂ©finissez intentionnellement webhookHost: "0.0.0.0".

    Le mode Webhook valide les contrĂŽles de la requĂȘte, le jeton secret Telegram et le corps JSON, puis enregistre la mise Ă  jour dans sa file d’entrĂ©e durable avant de renvoyer une rĂ©ponse 200 vide. Une prise en charge durable rĂ©ussie inclut x-openclaw-delivery-accepted: durable ; les rĂ©ponses de contrĂŽle d’intĂ©gritĂ©, de routage, d’authentification, de validation et d’erreur de stockage omettent cet en-tĂȘte. Les proxys inverses et les contrĂŽleurs d’hĂŽte peuvent exiger cet en-tĂȘte pour distinguer la prise en charge par OpenClaw d’une rĂ©ponse 200 vide gĂ©nĂ©rique, sans dĂ©duire l’acceptation du dĂ©lai de rĂ©ponse.

    OpenClaw traite ensuite la mise Ă  jour de maniĂšre asynchrone via les mĂȘmes files du bot par discussion et par sujet que celles utilisĂ©es par l’interrogation longue, afin que les traitements lents de l’agent ne retardent pas l’accusĂ© de rĂ©ception de Telegram.

    Limites, nouvelles tentatives et cibles de la CLI
    • channels.telegram.textChunkLimit vaut 4000 par dĂ©faut ; streaming.chunkMode="newline" privilĂ©gie les limites de paragraphe (lignes vides) avant le dĂ©coupage selon la longueur.
    • channels.telegram.mediaMaxMb (valeur par dĂ©faut : 100) limite la taille des mĂ©dias entrants et sortants.
    • channels.telegram.mediaGroupFlushMs (valeur par dĂ©faut : 500, plage : 10-60000) dĂ©termine la durĂ©e de mise en mĂ©moire tampon des albums/groupes de mĂ©dias avant qu’OpenClaw ne les transmette sous forme d’un seul message entrant. Augmentez-la si des Ă©lĂ©ments d’un album arrivent en retard ; rĂ©duisez-la pour diminuer la latence de rĂ©ponse aux albums.
    • channels.telegram.timeoutSeconds remplace le dĂ©lai d’expiration du client API (la valeur par dĂ©faut de grammY s’applique s’il n’est pas dĂ©fini). Les clients de bot ajustent les valeurs configurĂ©es infĂ©rieures Ă  la limite de 60 secondes applicable aux requĂȘtes sortantes de texte/indication de saisie, afin que grammY n’interrompe pas la remise d’une rĂ©ponse visible avant que la limite de transport et le mĂ©canisme de repli d’OpenClaw puissent s’exĂ©cuter. L’interrogation longue utilise toujours une limite de requĂȘte getUpdates de 45 secondes afin que les interrogations inactives ne soient pas abandonnĂ©es indĂ©finiment.
    • channels.telegram.pollingStallThresholdMs vaut 120000 par dĂ©faut ; ne choisissez une valeur comprise entre 30000 et 600000 que pour Ă©viter les redĂ©marrages dus Ă  de faux positifs de blocage de l’interrogation.
    • l’historique du contexte de groupe utilise channels.telegram.historyLimit ou messages.groupChat.historyLimit (valeur par dĂ©faut : 50) ; 0 le dĂ©sactive.
    • le contexte supplĂ©mentaire des rĂ©ponses/citations/transferts est normalisĂ© dans une seule fenĂȘtre de contexte de conversation sĂ©lectionnĂ©e lorsque le Gateway a observĂ© les messages parents ; le cache des messages observĂ©s rĂ©side dans l’état SQLite du plugin OpenClaw, et openclaw doctor --fix importe les fichiers annexes hĂ©ritĂ©s. Telegram n’inclut qu’un seul reply_to_message superficiel par mise Ă  jour ; les chaĂźnes antĂ©rieures au cache sont donc limitĂ©es Ă  cette charge utile.
    • les listes d’autorisation Telegram dĂ©terminent principalement qui peut dĂ©clencher l’agent ; elles ne constituent pas une limite complĂšte de masquage du contexte supplĂ©mentaire.
    • historique des messages privĂ©s : channels.telegram.dmHistoryLimit, channels.telegram.dms["<user_id>"].historyLimit.
    • channels.telegram.retry s’applique aux utilitaires d’envoi Telegram (CLI/outils/actions) pour les erreurs rĂ©cupĂ©rables de l’API sortante. La remise de la rĂ©ponse finale entrante utilise un nombre limitĂ© de nouvelles tentatives d’envoi sĂ©curisĂ© pour les Ă©checs antĂ©rieurs Ă  la connexion, mais ne rĂ©essaie pas les enveloppes rĂ©seau ambiguĂ«s postĂ©rieures Ă  l’envoi qui pourraient dupliquer des messages visibles.

    Les cibles d’envoi de la CLI et de l’outil de messagerie acceptent un identifiant numĂ©rique de discussion, un nom d’utilisateur ou une cible de sujet de forum :

    bash
    openclaw message send --channel telegram --target 123456789 --message "bonjour"openclaw message send --channel telegram --target @name --message "bonjour"openclaw message send --channel telegram --target -1001234567890:topic:42 --message "bonjour sujet"

    Les sondages utilisent openclaw message poll et prennent en charge les sujets de forum :

    bash
    openclaw message poll --channel telegram --target 123456789 \--poll-question "Le publier ?" --poll-option "Oui" --poll-option "Non"openclaw message poll --channel telegram --target -1001234567890:topic:42 \--poll-question "Choisissez une heure" --poll-option "10 h" --poll-option "14 h" \--poll-duration-seconds 300 --poll-public

    Options de sondage propres Ă  Telegram : --poll-duration-seconds (5-600), --poll-anonymous, --poll-public, --thread-id (ou une cible :topic:). --poll-option est rĂ©pĂ©tĂ©e 2-12 fois (limite d’options de Telegram).

    L’envoi Telegram prend Ă©galement en charge --presentation avec des blocs buttons pour les claviers intĂ©grĂ©s (lorsque channels.telegram.capabilities.inlineButtons l’autorise), --pin ou --delivery '{"pin":true}' pour demander l’épinglage lors de la remise lorsque le bot peut Ă©pingler des messages dans cette discussion, ainsi que --force-document pour envoyer les images, GIF et vidĂ©os sortants sous forme de documents plutĂŽt que de tĂ©lĂ©versements compressĂ©s, animĂ©s ou vidĂ©o.

    ContrÎle des actions : channels.telegram.actions.sendMessage=false désactive tous les messages sortants, y compris les sondages ; channels.telegram.actions.poll=false désactive la création de sondages tout en laissant les envois ordinaires activés.

    Approbations d’exĂ©cution dans Telegram

    Telegram prend en charge les approbations d’exĂ©cution dans les messages privĂ©s des approbateurs et peut facultativement publier les invites dans la discussion ou le sujet d’origine. Les approbateurs doivent ĂȘtre identifiĂ©s par des identifiants numĂ©riques d’utilisateur Telegram.

    • channels.telegram.execApprovals.enabled ("auto" active la fonctionnalitĂ© lorsqu’au moins un approbateur peut ĂȘtre rĂ©solu)
    • channels.telegram.execApprovals.approvers (utilise Ă  dĂ©faut les identifiants numĂ©riques des propriĂ©taires provenant de commands.ownerAllowFrom)
    • channels.telegram.execApprovals.target : dm (valeur par dĂ©faut) | channel | both
    • agentFilter, sessionFilter

    channels.telegram.allowFrom, groupAllowFrom et defaultTo dĂ©terminent qui peut communiquer avec le bot et oĂč il envoie les rĂ©ponses ordinaires ; ils ne confĂšrent pas le rĂŽle d’approbateur d’exĂ©cution. Le premier appairage approuvĂ© par message privĂ© initialise commands.ownerAllowFrom lorsqu’aucun propriĂ©taire de commande n’existe encore, de sorte que les configurations Ă  propriĂ©taire unique fonctionnent sans dupliquer les identifiants sous execApprovals.approvers.

    La remise dans le canal affiche le texte de la commande dans la discussion ; n’activez channel ou both que dans des groupes/sujets de confiance. Lorsque l’invite arrive dans un sujet de forum, OpenClaw conserve le sujet pour l’invite d’approbation et le suivi. Par dĂ©faut, les approbations d’exĂ©cution expirent aprĂšs 30 minutes.

    Les boutons d’approbation intĂ©grĂ©s exigent Ă©galement que channels.telegram.capabilities.inlineButtons autorise la surface cible (dm, group ou all). Les identifiants d’approbation prĂ©fixĂ©s par plugin: sont rĂ©solus par les approbations de plugin ; les autres sont d’abord rĂ©solus par les approbations d’exĂ©cution.

    Consultez Approbations d’exĂ©cution.

    ContrĂŽle des rĂ©ponses d’erreur

    Lorsque l’agent rencontre une erreur de remise ou de fournisseur, la politique d’erreur dĂ©termine si les messages d’erreur parviennent Ă  la discussion Telegram :

    Clé Valeurs Valeur par défaut Description
    channels.telegram.errorPolicy always, once, silent always always envoie chaque message d’erreur dans la discussion. once envoie chaque message d’erreur unique une fois par fenĂȘtre de temporisation (et supprime les erreurs identiques rĂ©pĂ©tĂ©es). silent n’envoie jamais de message d’erreur dans la discussion.
    channels.telegram.errorCooldownMs nombre (ms) 14400000 (4h) FenĂȘtre de temporisation de la politique once. AprĂšs l’envoi d’une erreur, le mĂȘme message est supprimĂ© jusqu’à l’expiration de cet intervalle. Évite la prolifĂ©ration des erreurs pendant les interruptions de service.

    Les remplacements par compte, par groupe et par sujet sont pris en charge (mĂȘme hĂ©ritage que pour les autres clĂ©s de configuration Telegram).

    json5
    {  channels: {    telegram: {      errorPolicy: "always",      errorCooldownMs: 120000,      groups: {        "-1001234567890": {          errorPolicy: "silent", // supprimer les erreurs dans ce groupe        },      },    },  },}

    Résolution des problÚmes

    Le bot ne répond pas aux messages de groupe qui ne le mentionnent pas
    • Si requireMention=false, le mode de confidentialitĂ© de Telegram doit permettre une visibilitĂ© complĂšte : BotFather /setprivacy -> Disable, puis retirez le bot du groupe et ajoutez-le de nouveau.
    • openclaw channels status affiche un avertissement lorsque la configuration attend des messages de groupe sans mention.
    • openclaw channels status --probe vĂ©rifie les identifiants numĂ©riques explicites des groupes ; l’appartenance ne peut pas ĂȘtre vĂ©rifiĂ©e avec le caractĂšre gĂ©nĂ©rique "*".
    • Test rapide de la session : /activation always.
    Le bot ne reçoit aucun message de groupe
    • Lorsque channels.telegram.groups existe, le groupe doit ĂȘtre rĂ©pertoriĂ© (ou inclure "*").
    • VĂ©rifiez que le bot appartient au groupe.
    • Consultez openclaw logs --follow pour connaĂźtre les raisons des omissions.
    Les commandes fonctionnent partiellement ou pas du tout
    • Autorisez l’identitĂ© de l’expĂ©diteur (appairage et/ou valeur numĂ©rique dans allowFrom) ; l’autorisation des commandes reste applicable mĂȘme lorsque la politique du groupe est open.
    • setMyCommands failed avec BOT_COMMANDS_TOO_MUCH signifie que le menu natif comporte trop d’entrĂ©es ; rĂ©duisez le nombre de commandes de plugins, de Skills ou personnalisĂ©es, ou dĂ©sactivez les menus natifs.
    • Les appels de dĂ©marrage deleteMyCommands / setMyCommands et les appels d’indication de saisie sendChatAction sont limitĂ©s dans le temps et font l’objet d’une nouvelle tentative via le mĂ©canisme de repli du transport Telegram en cas d’expiration de la requĂȘte. Des erreurs rĂ©seau/de rĂ©cupĂ©ration persistantes indiquent gĂ©nĂ©ralement que l’accĂšs DNS/HTTPS Ă  api.telegram.org est impossible.
    Le démarrage signale un jeton non autorisé
    • getMe returned 401 indique un Ă©chec d’authentification Telegram pour le jeton de bot configurĂ©. Copiez de nouveau ou rĂ©gĂ©nĂ©rez le jeton dans BotFather, puis mettez Ă  jour channels.telegram.botToken, tokenFile, accounts.<id>.botToken ou TELEGRAM_BOT_TOKEN (compte par dĂ©faut).
    • deleteWebhook 401 Unauthorized au dĂ©marrage indique Ă©galement un Ă©chec d’authentification ; le traiter comme si « aucun webhook n’existait » ne ferait que reporter le mĂȘme Ă©chec dĂ» au jeton incorrect Ă  un appel API ultĂ©rieur.
    InstabilitĂ© de l’interrogation ou du rĂ©seau
    • Node 22+ avec une implĂ©mentation fetch/un proxy personnalisĂ© peut dĂ©clencher un abandon immĂ©diat si les types AbortSignal ne correspondent pas.
    • Certains hĂŽtes rĂ©solvent d’abord api.telegram.org en IPv6 ; une sortie IPv6 dĂ©faillante provoque des Ă©checs intermittents de l’API.
    • Les journaux contenant TypeError: fetch failed ou Network request for 'getUpdates' failed! entraĂźnent de nouvelles tentatives, car ces erreurs rĂ©seau sont considĂ©rĂ©es comme rĂ©cupĂ©rables.
    • Au dĂ©marrage de l’interrogation, OpenClaw rĂ©utilise pour grammY la sonde getMe rĂ©ussie du dĂ©marrage, afin que le processus d’exĂ©cution n’ait pas besoin d’un second getMe avant le premier getUpdates.
    • Si deleteWebhook Ă©choue Ă  cause d’une erreur rĂ©seau transitoire au dĂ©marrage de l’interrogation, OpenClaw passe Ă  l’interrogation longue au lieu d’effectuer un autre appel de plan de contrĂŽle avant l’interrogation. Un webhook encore actif se manifeste alors par un conflit getUpdates ; OpenClaw reconstruit le transport et rĂ©essaie de supprimer le webhook.
    • Si les sockets Telegram sont renouvelĂ©s selon une cadence fixe et courte, recherchez une faible valeur de channels.telegram.timeoutSeconds : les clients de bot ajustent les valeurs configurĂ©es infĂ©rieures aux limites des requĂȘtes sortantes et getUpdates, mais les anciennes versions pouvaient interrompre chaque interrogation ou rĂ©ponse lorsque cette valeur Ă©tait infĂ©rieure Ă  ces limites.
    • Polling stall detected dans les journaux signifie qu’OpenClaw redĂ©marre l’interrogation et reconstruit le transport aprĂšs 120 secondes sans signe d’activitĂ© d’interrogation longue terminĂ©e par dĂ©faut.
    • openclaw channels status --probe et openclaw doctor affichent un avertissement lorsqu’un compte d’interrogation en cours d’exĂ©cution n’a pas terminĂ© getUpdates aprĂšs le dĂ©lai de grĂące du dĂ©marrage, lorsqu’un compte webhook en cours d’exĂ©cution n’a pas terminĂ© setWebhook aprĂšs ce dĂ©lai, ou lorsque la derniĂšre activitĂ© rĂ©ussie du transport d’interrogation est obsolĂšte.
    • Augmentez channels.telegram.pollingStallThresholdMs uniquement lorsque les appels getUpdates de longue durĂ©e sont sains, mais que votre hĂŽte signale toujours de faux redĂ©marrages dus Ă  un blocage de l’interrogation. Des blocages persistants indiquent gĂ©nĂ©ralement des problĂšmes de proxy, de DNS, d’IPv6 ou de sortie TLS vers api.telegram.org.
    • Telegram respecte les variables d’environnement de proxy du processus pour le transport de l’API Bot : HTTP_PROXY, HTTPS_PROXY, ALL_PROXY et leurs variantes en minuscules. NO_PROXY / no_proxy peuvent toujours contourner le proxy pour api.telegram.org.
    • Si OPENCLAW_PROXY_URL est dĂ©fini dans un environnement de service et qu’aucune variable d’environnement de proxy standard n’est prĂ©sente, Telegram utilise Ă©galement cette URL pour le transport de l’API Bot.
    • Sur les hĂŽtes VPS dont la sortie directe/TLS est instable, acheminez les appels Ă  l’API Telegram via un proxy :
    yaml
    channels:telegram:proxy: socks5://<user>:<password>@proxy-host:1080
    • Node 22+ utilise autoSelectFamily=true par dĂ©faut (sauf sous WSL2). L’ordre des rĂ©sultats DNS de Telegram respecte d’abord OPENCLAW_TELEGRAM_DNS_RESULT_ORDER, puis channels.telegram.network.dnsResultOrder, puis la valeur par dĂ©faut du processus (par exemple NODE_OPTIONS=--dns-result-order=ipv4first) ; si aucune de ces valeurs ne s’applique, il utilise ipv4first sous Node 22+.
    • Sous WSL2, ou lorsque le fonctionnement en IPv4 uniquement est prĂ©fĂ©rable, imposez la sĂ©lection de famille :
    yaml
    channels:telegram:network:  autoSelectFamily: false
    • Les rĂ©ponses de la plage de rĂ©fĂ©rence RFC 2544 (198.18.0.0/15) sont dĂ©jĂ  autorisĂ©es par dĂ©faut pour les tĂ©lĂ©chargements de mĂ©dias Telegram. Si un proxy fake-IP ou transparent de confiance réécrit api.telegram.org vers une autre adresse privĂ©e/interne/Ă  usage spĂ©cial pendant les tĂ©lĂ©chargements de mĂ©dias, activez explicitement le contournement rĂ©servĂ© Ă  Telegram :
    yaml
    channels:telegram:network:  dangerouslyAllowPrivateNetwork: true
    • La mĂȘme activation explicite est disponible pour chaque compte dans channels.telegram.accounts.<accountId>.network.dangerouslyAllowPrivateNetwork.
    • Si votre proxy rĂ©sout les hĂŽtes de mĂ©dias Telegram en 198.18.x.x, laissez d’abord l’indicateur dangereux dĂ©sactivĂ© — cette plage est dĂ©jĂ  autorisĂ©e par dĂ©faut.
    • Remplacements temporaires par variables d’environnement : OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1, OPENCLAW_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY=1, OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first.
    • Validez les rĂ©ponses DNS :
    bash
    dig +short api.telegram.org Adig +short api.telegram.org AAAA

    Aide supplémentaire : Dépannage des canaux.

    Référence de configuration

    Référence principale : Référence de configuration - Telegram.

    Champs Telegram Ă  forte valeur diagnostique
    • dĂ©marrage/authentification : enabled, botToken, tokenFile (doit ĂȘtre un fichier ordinaire ; les liens symboliques sont refusĂ©s), accounts.*
    • contrĂŽle d’accĂšs : dmPolicy, allowFrom, groupPolicy, groupAllowFrom, groups, groups.*.topics.*, bindings[] au niveau supĂ©rieur (type: "acp")
    • valeurs par dĂ©faut des sujets : groups.<chatId>.topics."*" s’applique aux sujets de forum sans correspondance ; les identifiants de sujet exacts prĂ©valent
    • approbations d’exĂ©cution : execApprovals, accounts.*.execApprovals
    • commandes/menu : commands.native, commands.nativeSkills, customCommands
    • fils de discussion/rĂ©ponses : replyToMode, threadBindings
    • diffusion en continu : streaming (modes off | partial | block | progress), streaming.preview.toolProgress
    • formatage/distribution : textChunkLimit, streaming.chunkMode, richMessages, markdown.tables (off | bullets | code | block), linkPreview, responsePrefix
    • mĂ©dias/rĂ©seau : mediaMaxMb, mediaGroupFlushMs, timeoutSeconds, pollingStallThresholdMs, retry, network.autoSelectFamily, network.dangerouslyAllowPrivateNetwork, proxy
    • racine d’API personnalisĂ©e : apiRoot (racine de la Bot API uniquement ; n’incluez pas /bot&lt;TOKEN&gt;), trustedLocalFileRoots (racines absolues file_path de la Bot API auto-hĂ©bergĂ©e)
    • Webhook : webhookUrl, webhookSecret, webhookPath, webhookHost, webhookPort, webhookCertPath
    • actions/capacitĂ©s : capabilities.inlineButtons, actions.sendMessage|editMessage|deleteMessage|reactions|sticker|createForumTopic|editForumTopic
    • rĂ©actions : reactionNotifications, reactionLevel
    • erreurs : errorPolicy, errorCooldownMs, silentErrorReplies
    • Ă©critures/historique : configWrites, historyLimit, dmHistoryLimit, dms.*.historyLimit

    Pages connexes

    Was this useful?
    On this page

    On this page