Mainstream messaging

Telegram

Pronto per la produzione per DM e gruppi bot tramite grammY. Il long polling è la modalità predefinita; la modalità webhook è opzionale.

Configurazione rapida

  • Crea il token del bot in BotFather

    Apri Telegram e avvia una chat con @BotFather (verifica che l'handle sia esattamente @BotFather).

    Esegui /newbot, segui le istruzioni e salva il token.

  • Configura token e policy DM

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

    Fallback env: TELEGRAM_BOT_TOKEN=... (solo account predefinito). Telegram non usa openclaw channels login telegram; configura il token in config/env, quindi avvia il gateway.

  • Avvia il gateway e approva il primo DM

    openclaw gateway
    openclaw pairing list telegram
    openclaw pairing approve telegram <CODE>
    

    I codici di associazione scadono dopo 1 ora.

  • Aggiungi il bot a un gruppo

    Aggiungi il bot al tuo gruppo, quindi imposta channels.telegram.groups e groupPolicy in modo che corrispondano al tuo modello di accesso.

  • Impostazioni lato Telegram

    Modalità Privacy e visibilità dei gruppi

    I bot Telegram usano per impostazione predefinita la Modalità Privacy, che limita i messaggi di gruppo che ricevono.

    Se il bot deve vedere tutti i messaggi di gruppo, puoi:

    • disabilitare la modalità privacy tramite /setprivacy, oppure
    • rendere il bot amministratore del gruppo.

    Quando modifichi la modalità privacy, rimuovi e riaggiungi il bot in ogni gruppo affinché Telegram applichi la modifica.

    Autorizzazioni del gruppo

    Lo stato di amministratore è controllato nelle impostazioni del gruppo Telegram.

    I bot amministratori ricevono tutti i messaggi di gruppo, il che è utile per un comportamento di gruppo sempre attivo.

    Interruttori utili di BotFather
    • /setjoingroups per consentire/negare l'aggiunta ai gruppi
    • /setprivacy per il comportamento di visibilità nei gruppi

    Controllo degli accessi e attivazione

    Policy DM

    channels.telegram.dmPolicy controlla l'accesso ai messaggi diretti:

    • pairing (predefinito)
    • allowlist (richiede almeno un ID mittente in allowFrom)
    • open (richiede che allowFrom includa "*")
    • disabled

    dmPolicy: "open" con allowFrom: ["*"] consente a qualsiasi account Telegram che trovi o indovini il nome utente del bot di comandare il bot. Usalo solo per bot intenzionalmente pubblici con strumenti strettamente limitati; i bot con un solo proprietario dovrebbero usare allowlist con ID utente numerici.

    channels.telegram.allowFrom accetta ID utente Telegram numerici. I prefissi telegram: / tg: sono accettati e normalizzati. Nelle configurazioni multi-account, un channels.telegram.allowFrom di livello superiore restrittivo viene trattato come limite di sicurezza: le voci allowFrom: ["*"] a livello di account non rendono pubblico quell'account a meno che l'allowlist effettiva dell'account contenga ancora un wildcard esplicito dopo l'unione. dmPolicy: "allowlist" con allowFrom vuoto blocca tutti i DM e viene rifiutato dalla validazione della configurazione. La configurazione richiede solo ID utente numerici. Se hai eseguito l'upgrade e la tua configurazione contiene voci allowlist @username, esegui openclaw doctor --fix per risolverle (best effort; richiede un token bot Telegram). Se in precedenza usavi file allowlist dello store di associazione, openclaw doctor --fix può recuperare le voci in channels.telegram.allowFrom nei flussi allowlist (per esempio quando dmPolicy: "allowlist" non ha ancora ID espliciti).

    Per i bot con un solo proprietario, preferisci dmPolicy: "allowlist" con ID numerici espliciti in allowFrom per mantenere durevole la policy di accesso nella configurazione (invece di dipendere dalle approvazioni di associazione precedenti).

    Confusione comune: l'approvazione dell'associazione DM non significa "questo mittente è autorizzato ovunque". L'associazione concede accesso ai DM. Se non esiste ancora un proprietario dei comandi, la prima associazione approvata imposta anche commands.ownerAllowFrom in modo che i comandi riservati al proprietario e le approvazioni exec abbiano un account operatore esplicito. L'autorizzazione dei mittenti nei gruppi proviene comunque dalle allowlist esplicite in configurazione. Se vuoi "sono autorizzato una volta e funzionano sia i DM sia i comandi nei gruppi", inserisci il tuo ID utente Telegram numerico in channels.telegram.allowFrom; per i comandi riservati al proprietario, assicurati che commands.ownerAllowFrom contenga telegram:<your user id>.

    Trovare il tuo ID utente Telegram

    Più sicuro (nessun bot di terze parti):

    1. Invia un DM al tuo bot.
    2. Esegui openclaw logs --follow.
    3. Leggi from.id.

    Metodo ufficiale Bot API:

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

    Metodo di terze parti (meno privato): @userinfobot o @getidsbot.

    Policy di gruppo e allowlist

    Due controlli si applicano insieme:

    1. Quali gruppi sono consentiti (channels.telegram.groups)

      • nessuna configurazione groups:
        • con groupPolicy: "open": qualsiasi gruppo può superare i controlli degli ID gruppo
        • con groupPolicy: "allowlist" (predefinito): i gruppi sono bloccati finché non aggiungi voci groups (o "*")
      • groups configurato: agisce come allowlist (ID espliciti o "*")
    2. Quali mittenti sono consentiti nei gruppi (channels.telegram.groupPolicy)

      • open
      • allowlist (predefinito)
      • disabled

    groupAllowFrom viene usato per filtrare i mittenti di gruppo. Se non è impostato, Telegram ripiega su allowFrom. Le voci groupAllowFrom dovrebbero essere ID utente Telegram numerici (i prefissi telegram: / tg: sono normalizzati). Non inserire ID chat di gruppi o supergruppi Telegram in groupAllowFrom. Gli ID chat negativi appartengono a channels.telegram.groups. Le voci non numeriche vengono ignorate per l'autorizzazione dei mittenti. Limite di sicurezza (2026.2.25+): l'autenticazione dei mittenti nei gruppi non eredita le approvazioni dello store di associazione DM. L'associazione resta solo per i DM. Per i gruppi, imposta groupAllowFrom o allowFrom per gruppo/per topic. Se groupAllowFrom non è impostato, Telegram ripiega su allowFrom della configurazione, non sullo store di associazione. Pattern pratico per bot con un solo proprietario: imposta il tuo ID utente in channels.telegram.allowFrom, lascia groupAllowFrom non impostato e consenti i gruppi di destinazione in channels.telegram.groups. Nota runtime: se channels.telegram manca completamente, il runtime usa per impostazione predefinita groupPolicy="allowlist" fail-closed, a meno che channels.defaults.groupPolicy sia impostato esplicitamente.

    Esempio: consentire qualsiasi membro in un gruppo specifico:

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

    Esempio: consentire solo utenti specifici all'interno di un gruppo specifico:

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

    Comportamento delle menzioni

    Per impostazione predefinita, le risposte nei gruppi richiedono una menzione.

    La menzione può provenire da:

    • menzione nativa @botusername, oppure
    • pattern di menzione in:
      • agents.list[].groupChat.mentionPatterns
      • messages.groupChat.mentionPatterns

    Interruttori di comando a livello di sessione:

    • /activation always
    • /activation mention

    Questi aggiornano solo lo stato della sessione. Usa la configurazione per la persistenza.

    Esempio di configurazione persistente:

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

    Ottenere l'ID della chat di gruppo:

    • inoltra un messaggio di gruppo a @userinfobot / @getidsbot
    • oppure leggi chat.id da openclaw logs --follow
    • oppure ispeziona getUpdates della Bot API

    Comportamento runtime

    • Telegram è di proprietà del processo gateway.
    • Il routing è deterministico: le risposte in ingresso da Telegram tornano a Telegram (il modello non sceglie i canali).
    • I messaggi in ingresso vengono normalizzati nell'envelope di canale condiviso con metadati di risposta e placeholder multimediali.
    • Le sessioni di gruppo sono isolate per ID gruppo. I topic dei forum aggiungono :topic:<threadId> per mantenere i topic isolati.
    • I messaggi DM possono contenere message_thread_id; OpenClaw conserva l'ID del thread per le risposte ma mantiene i DM nella sessione piatta per impostazione predefinita. Configura channels.telegram.dm.threadReplies: "inbound", channels.telegram.direct.<chatId>.threadReplies: "inbound", requireTopic: true o una configurazione topic corrispondente quando vuoi intenzionalmente l'isolamento della sessione topic nei DM.
    • Il long polling usa grammY runner con sequenziamento per chat/per thread. La concorrenza complessiva del sink del runner usa agents.defaults.maxConcurrent.
    • Il long polling è protetto all'interno di ogni processo gateway in modo che un solo poller attivo possa usare un token bot alla volta. Se vedi ancora conflitti getUpdates 409, è probabile che un altro gateway OpenClaw, script o poller esterno stia usando lo stesso token.
    • I riavvii del watchdog del long polling si attivano per impostazione predefinita dopo 120 secondi senza liveness getUpdates completata. Aumenta channels.telegram.pollingStallThresholdMs solo se il tuo deployment continua a vedere falsi riavvii per polling bloccato durante lavori di lunga durata. Il valore è in millisecondi ed è consentito da 30000 a 600000; sono supportati override per account.
    • La Telegram Bot API non supporta le conferme di lettura (sendReadReceipts non si applica).

    Riferimento delle funzionalità

    Anteprima streaming live (modifiche ai messaggi)

    OpenClaw può trasmettere risposte parziali in tempo reale:

    • chat dirette: messaggio di anteprima + editMessageText
    • gruppi/topic: messaggio di anteprima + editMessageText

    Requisito:

    • channels.telegram.streaming è off | partial | block | progress (predefinito: partial)
    • progress mantiene una bozza di stato modificabile per l'avanzamento degli strumenti, la cancella al completamento e invia la risposta finale come messaggio normale
    • streaming.preview.toolProgress controlla se gli aggiornamenti degli strumenti/di avanzamento riutilizzano lo stesso messaggio di anteprima modificato (predefinito: true quando lo streaming di anteprima è attivo)
    • streaming.preview.commandText controlla il dettaglio command/exec all'interno di quelle righe di avanzamento strumenti: raw (predefinito, conserva il comportamento rilasciato) o status (solo etichetta dello strumento)
    • i valori legacy channels.telegram.streamMode e booleani streaming vengono rilevati; esegui openclaw doctor --fix per migrarli a channels.telegram.streaming.mode

    Gli aggiornamenti di anteprima dell'avanzamento strumenti sono le brevi righe di stato mostrate mentre gli strumenti sono in esecuzione, per esempio esecuzione di comandi, letture di file, aggiornamenti di pianificazione o riepiloghi di patch. Telegram li mantiene abilitati per impostazione predefinita per corrispondere al comportamento rilasciato di OpenClaw da v2026.4.22 e versioni successive. Per mantenere l'anteprima modificata per il testo della risposta ma nascondere le righe di avanzamento strumenti, imposta:

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

    Per mantenere visibile l'avanzamento strumenti ma nascondere il testo command/exec, imposta:

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

    Usa la modalità progress quando vuoi un avanzamento degli strumenti visibile senza modificare la risposta finale nello stesso messaggio. Inserisci la policy del testo del comando sotto streaming.progress:

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

    Usa streaming.mode: "off" solo quando vuoi una consegna solo finale: le modifiche dell'anteprima di Telegram sono disabilitate e le comunicazioni generiche su strumenti/avanzamento vengono soppresse invece di essere inviate come messaggi di stato autonomi. Le richieste di approvazione, i payload multimediali e gli errori passano comunque attraverso la normale consegna finale. Usa streaming.preview.toolProgress: false quando vuoi solo mantenere le modifiche dell'anteprima della risposta nascondendo al contempo le righe di stato dell'avanzamento degli strumenti.

    Per risposte solo testo:

    • anteprime brevi in DM/gruppo/topic: OpenClaw mantiene lo stesso messaggio di anteprima ed esegue la modifica finale sul posto
    • i finali di testo lunghi che si dividono in più messaggi Telegram riutilizzano l'anteprima esistente come primo blocco finale quando possibile, poi inviano solo i blocchi rimanenti
    • i finali in modalità progress cancellano la bozza di stato e usano la normale consegna finale invece di modificare la bozza nella risposta
    • se la modifica finale fallisce prima che il testo completato sia confermato, OpenClaw usa la normale consegna finale e ripulisce l'anteprima obsoleta

    Per risposte complesse (per esempio payload multimediali), OpenClaw ripiega sulla normale consegna finale e poi ripulisce il messaggio di anteprima.

    Lo streaming dell'anteprima è separato dallo streaming a blocchi. Quando lo streaming a blocchi è abilitato esplicitamente per Telegram, OpenClaw salta il flusso di anteprima per evitare un doppio streaming.

    Flusso di ragionamento solo Telegram:

    • /reasoning stream invia il ragionamento all'anteprima live durante la generazione
    • l'anteprima del ragionamento viene eliminata dopo la consegna finale; usa /reasoning on quando il ragionamento deve rimanere visibile
    • la risposta finale viene inviata senza testo di ragionamento
    Formattazione e fallback HTML

    Il testo in uscita usa Telegram parse_mode: "HTML".

    • Il testo in stile Markdown viene renderizzato in HTML sicuro per Telegram.
    • L'HTML grezzo del modello viene sottoposto a escape per ridurre gli errori di parsing di Telegram.
    • Se Telegram rifiuta l'HTML parsato, OpenClaw riprova come testo normale.

    Le anteprime dei link sono abilitate per impostazione predefinita e possono essere disabilitate con channels.telegram.linkPreview: false.

    Comandi nativi e comandi personalizzati

    La registrazione del menu comandi di Telegram viene gestita all'avvio con setMyCommands.

    Valori predefiniti dei comandi nativi:

    • commands.native: "auto" abilita i comandi nativi per Telegram

    Aggiungi voci di menu per comandi personalizzati:

    {
    channels: {
    telegram: {
      customCommands: [
        { command: "backup", description: "Git backup" },
        { command: "generate", description: "Create an image" },
      ],
    },
    },
    }
    

    Regole:

    • i nomi vengono normalizzati (rimozione di / iniziale, minuscole)
    • pattern valido: a-z, 0-9, _, lunghezza 1..32
    • i comandi personalizzati non possono sovrascrivere i comandi nativi
    • conflitti/duplicati vengono saltati e registrati nei log

    Note:

    • i comandi personalizzati sono solo voci di menu; non implementano automaticamente un comportamento
    • i comandi di plugin/skill possono comunque funzionare quando digitati anche se non sono mostrati nel menu Telegram

    Se i comandi nativi sono disabilitati, quelli integrati vengono rimossi. I comandi personalizzati/plugin possono comunque registrarsi se configurati.

    Errori comuni di configurazione:

    • setMyCommands failed con BOT_COMMANDS_TOO_MUCH significa che il menu Telegram è ancora andato oltre il limite dopo il taglio; riduci i comandi plugin/skill/personalizzati o disabilita channels.telegram.commands.native.
    • deleteWebhook, deleteMyCommands o setMyCommands che falliscono con 404: Not Found mentre i comandi curl diretti della Bot API funzionano possono indicare che channels.telegram.apiRoot è stato impostato sull'endpoint completo /bot&lt;TOKEN&gt;. apiRoot deve essere solo la root della Bot API, e openclaw doctor --fix rimuove un /bot&lt;TOKEN&gt; finale accidentale.
    • getMe returned 401 significa che Telegram ha rifiutato il token bot configurato. Aggiorna botToken, tokenFile o TELEGRAM_BOT_TOKEN con il token BotFather corrente; OpenClaw si arresta prima del polling, quindi questo non viene riportato come errore di pulizia del Webhook.
    • setMyCommands failed con errori di rete/fetch di solito significa che DNS/HTTPS in uscita verso api.telegram.org è bloccato.

    Comandi di abbinamento dispositivo (plugin device-pair)

    Quando il plugin device-pair è installato:

    1. /pair genera il codice di configurazione
    2. incolla il codice nell'app iOS
    3. /pair pending elenca le richieste in sospeso (inclusi ruolo/ambiti)
    4. approva la richiesta:
      • /pair approve <requestId> per approvazione esplicita
      • /pair approve quando c'è una sola richiesta in sospeso
      • /pair approve latest per la più recente

    Il codice di configurazione trasporta un token di bootstrap a breve durata. Il passaggio di bootstrap integrato mantiene il token del nodo primario a scopes: []; qualsiasi token operatore passato resta limitato a operator.approvals, operator.read, operator.talk.secrets e operator.write. I controlli degli ambiti di bootstrap sono prefissati dal ruolo, quindi quella lista consentita per l'operatore soddisfa solo richieste operatore; i ruoli non operatore hanno comunque bisogno di ambiti sotto il proprio prefisso di ruolo.

    Se un dispositivo ritenta con dettagli di autenticazione modificati (per esempio ruolo/ambiti/chiave pubblica), la richiesta in sospeso precedente viene sostituita e la nuova richiesta usa un requestId diverso. Riesegui /pair pending prima di approvare.

    Maggiori dettagli: Abbinamento.

    Pulsanti inline

    Configura l'ambito della tastiera inline:

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

    Override per account:

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

    Ambiti:

    • off
    • dm
    • group
    • all
    • allowlist (predefinito)

    capabilities: ["inlineButtons"] legacy viene mappato a inlineButtons: "all".

    Esempio di azione messaggio:

    {
    action: "send",
    channel: "telegram",
    to: "123456789",
    message: "Choose an option:",
    buttons: [
    [
      { text: "Yes", callback_data: "yes" },
      { text: "No", callback_data: "no" },
    ],
    [{ text: "Cancel", callback_data: "cancel" }],
    ],
    }
    

    I clic di callback vengono passati all'agente come testo: callback_data: <value>

    Azioni dei messaggi Telegram per agenti e automazione

    Le azioni degli strumenti Telegram includono:

    • sendMessage (to, content, opzionale mediaUrl, replyToMessageId, messageThreadId)
    • react (chatId, messageId, emoji)
    • deleteMessage (chatId, messageId)
    • editMessage (chatId, messageId, content)
    • createForumTopic (chatId, name, opzionale iconColor, iconCustomEmojiId)

    Le azioni dei messaggi di canale espongono alias ergonomici (send, react, delete, edit, sticker, sticker-search, topic-create).

    Controlli di gating:

    • channels.telegram.actions.sendMessage
    • channels.telegram.actions.deleteMessage
    • channels.telegram.actions.reactions
    • channels.telegram.actions.sticker (predefinito: disabilitato)

    Nota: edit e topic-create sono attualmente abilitati per impostazione predefinita e non hanno toggle channels.telegram.actions.* separati. Gli invii runtime usano lo snapshot attivo di configurazione/segreti (avvio/ricaricamento), quindi i percorsi di azione non eseguono una nuova risoluzione ad hoc di SecretRef per ogni invio.

    Semantica della rimozione delle reazioni: /tools/reactions

    Tag di threading delle risposte

    Telegram supporta tag espliciti di threading delle risposte nell'output generato:

    • [[reply_to_current]] risponde al messaggio che ha attivato l'azione
    • [[reply_to:<id>]] risponde a uno specifico ID messaggio Telegram

    channels.telegram.replyToMode controlla la gestione:

    • off (predefinito)
    • first
    • all

    Quando il threading delle risposte è abilitato e il testo o la didascalia Telegram originale è disponibile, OpenClaw include automaticamente un estratto nativo della citazione Telegram. Telegram limita il testo delle citazioni native a 1024 unità di codice UTF-16, quindi i messaggi più lunghi vengono citati dall'inizio e ripiegano su una risposta semplice se Telegram rifiuta la citazione.

    Nota: off disabilita il threading implicito delle risposte. I tag espliciti [[reply_to_*]] vengono comunque rispettati.

    Topic dei forum e comportamento dei thread

    Supergruppi forum:

    • le chiavi di sessione dei topic aggiungono :topic:<threadId>
    • le risposte e la digitazione mirano al thread del topic
    • percorso di configurazione del topic: channels.telegram.groups.<chatId>.topics.<threadId>

    Caso speciale topic generale (threadId=1):

    • gli invii di messaggi omettono message_thread_id (Telegram rifiuta sendMessage(...thread_id=1))
    • le azioni di digitazione includono comunque message_thread_id

    Ereditarietà del topic: le voci topic ereditano le impostazioni del gruppo salvo override (requireMention, allowFrom, skills, systemPrompt, enabled, groupPolicy). agentId è solo del topic e non eredita dai valori predefiniti del gruppo.

    Routing degli agenti per topic: Ogni topic può instradare a un agente diverso impostando agentId nella configurazione del topic. Questo dà a ogni topic il proprio workspace, la propria memoria e la propria sessione isolati. Esempio:

    {
      channels: {
        telegram: {
          groups: {
            "-1001234567890": {
              topics: {
                "1": { agentId: "main" },      // General topic → main agent
                "3": { agentId: "zu" },        // Dev topic → zu agent
                "5": { agentId: "coder" }      // Code review → coder agent
              }
            }
          }
        }
      }
    }
    

    Ogni topic ha quindi la propria chiave di sessione: agent:zu:telegram:group:-1001234567890:topic:3

    Binding persistente dei topic ACP: I topic dei forum possono fissare sessioni harness ACP tramite binding ACP tipizzati di primo livello (bindings[] con type: "acp" e match.channel: "telegram", peer.kind: "group" e un ID qualificato dal topic come -1001234567890:topic:42). Attualmente è limitato ai topic dei forum in gruppi/supergruppi. Vedi Agenti ACP.

    Spawn ACP vincolato al thread dalla chat: /acp spawn <agent> --thread here|auto associa il topic corrente a una nuova sessione ACP; i follow-up vengono instradati direttamente lì. OpenClaw fissa la conferma dello spawn nel topic. Richiede che channels.telegram.threadBindings.spawnSessions resti abilitato (predefinito: true).

    Il contesto del template espone MessageThreadId e IsForum. Le chat DM con message_thread_id mantengono per impostazione predefinita il routing DM e i metadati di risposta nelle sessioni piatte; usano chiavi di sessione consapevoli dei thread solo quando sono configurate con threadReplies: "inbound", threadReplies: "always", requireTopic: true o una configurazione di argomento corrispondente. Usa channels.telegram.dm.threadReplies di primo livello per l'impostazione predefinita dell'account, oppure direct.<chatId>.threadReplies per un DM.

    Audio, video e sticker

    Messaggi audio

    Telegram distingue le note vocali dai file audio.

    • predefinito: comportamento da file audio
    • tag [[audio_as_voice]] nella risposta dell'agente per forzare l'invio come nota vocale
    • le trascrizioni delle note vocali in ingresso sono incorniciate come testo generato da macchina e non attendibile nel contesto dell'agente; il rilevamento delle menzioni usa comunque la trascrizione grezza, quindi i messaggi vocali soggetti a menzione continuano a funzionare.

    Esempio di azione messaggio:

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

    Messaggi video

    Telegram distingue i file video dalle note video.

    Esempio di azione messaggio:

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

    Le note video non supportano le didascalie; il testo del messaggio fornito viene inviato separatamente.

    Sticker

    Gestione degli sticker in ingresso:

    • WEBP statico: scaricato ed elaborato (segnaposto <media:sticker>)
    • TGS animato: saltato
    • WEBM video: saltato

    Campi del contesto sticker:

    • Sticker.emoji
    • Sticker.setName
    • Sticker.fileId
    • Sticker.fileUniqueId
    • Sticker.cachedDescription

    File della cache sticker:

    • ~/.openclaw/telegram/sticker-cache.json

    Gli sticker vengono descritti una volta (quando possibile) e memorizzati nella cache per ridurre le chiamate di visione ripetute.

    Abilita le azioni sticker:

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

    Azione di invio sticker:

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

    Cerca sticker nella cache:

    {
    action: "sticker-search",
    channel: "telegram",
    query: "cat waving",
    limit: 5,
    }
    
    Notifiche di reazione

    Le reazioni di Telegram arrivano come aggiornamenti message_reaction (separati dai payload dei messaggi).

    Quando abilitate, OpenClaw accoda eventi di sistema come:

    • Telegram reaction added: 👍 by Alice (@alice) on msg 42

    Configurazione:

    • channels.telegram.reactionNotifications: off | own | all (predefinito: own)
    • channels.telegram.reactionLevel: off | ack | minimal | extensive (predefinito: minimal)

    Note:

    • own significa solo reazioni degli utenti ai messaggi inviati dal bot (best-effort tramite cache dei messaggi inviati).
    • Gli eventi di reazione rispettano comunque i controlli di accesso di Telegram (dmPolicy, allowFrom, groupPolicy, groupAllowFrom); i mittenti non autorizzati vengono scartati.
    • Telegram non fornisce ID di thread negli aggiornamenti di reazione.
      • i gruppi non forum vengono instradati alla sessione della chat di gruppo
      • i gruppi forum vengono instradati alla sessione dell'argomento generale del gruppo (:topic:1), non all'argomento esatto di origine

    allowed_updates per polling/webhook include automaticamente message_reaction.

    Reazioni di ack

    ackReaction invia un'emoji di conferma mentre OpenClaw elabora un messaggio in ingresso.

    Ordine di risoluzione:

    • channels.telegram.accounts.<accountId>.ackReaction
    • channels.telegram.ackReaction
    • messages.ackReaction
    • fallback dell'emoji dell'identità dell'agente (agents.list[].identity.emoji, altrimenti "👀")

    Note:

    • Telegram si aspetta emoji unicode (per esempio "👀").
    • Usa "" per disabilitare la reazione per un canale o un account.
    Scritture di configurazione da eventi e comandi Telegram

    Le scritture della configurazione del canale sono abilitate per impostazione predefinita (configWrites !== false).

    Le scritture attivate da Telegram includono:

    • eventi di migrazione dei gruppi (migrate_to_chat_id) per aggiornare channels.telegram.groups
    • /config set e /config unset (richiede l'abilitazione dei comandi)

    Disabilita:

    {
    channels: {
    telegram: {
      configWrites: false,
    },
    },
    }
    
    Long polling rispetto a webhook

    L'impostazione predefinita è il long polling. Per la modalità webhook imposta channels.telegram.webhookUrl e channels.telegram.webhookSecret; opzionali webhookPath, webhookHost, webhookPort (predefiniti /telegram-webhook, 127.0.0.1, 8787).

    In modalità long-polling OpenClaw persiste il proprio watermark di riavvio solo dopo che un aggiornamento viene inviato correttamente. Se un handler fallisce, quell'aggiornamento rimane riprovabile nello stesso processo e non viene scritto come completato per la deduplicazione al riavvio.

    Il listener locale si associa a 127.0.0.1:8787. Per l'ingresso pubblico, metti un reverse proxy davanti alla porta locale oppure imposta intenzionalmente webhookHost: "0.0.0.0".

    La modalità webhook convalida le protezioni della richiesta, il token segreto di Telegram e il corpo JSON prima di restituire 200 a Telegram. OpenClaw elabora quindi l'aggiornamento in modo asincrono tramite le stesse corsie del bot per chat/per argomento usate dal long polling, così i turni lenti dell'agente non trattengono l'ACK di consegna di Telegram.

    Limiti, retry e target CLI
    • Il valore predefinito di channels.telegram.textChunkLimit è 4000.
    • channels.telegram.chunkMode="newline" preferisce i confini di paragrafo (righe vuote) prima della suddivisione per lunghezza.
    • channels.telegram.mediaMaxMb (predefinito 100) limita la dimensione dei media Telegram in ingresso e in uscita.
    • channels.telegram.mediaGroupFlushMs (predefinito 500) controlla per quanto tempo gli album/gruppi multimediali di Telegram vengono memorizzati nel buffer prima che OpenClaw li invii come un unico messaggio in ingresso. Aumentalo se le parti dell'album arrivano in ritardo; diminuiscilo per ridurre la latenza di risposta agli album.
    • channels.telegram.timeoutSeconds sovrascrive il timeout del client API Telegram (se non impostato, si applica il predefinito di grammY). I client bot limitano i valori configurati sotto la guardia di 60 secondi per richieste di testo/typing in uscita, così grammY non interrompe la consegna visibile della risposta prima che la guardia di trasporto e il fallback di OpenClaw possano essere eseguiti. Il long polling usa comunque una guardia di 45 secondi per le richieste getUpdates, così i poll inattivi non vengono abbandonati indefinitamente.
    • channels.telegram.pollingStallThresholdMs ha valore predefinito 120000; regola tra 30000 e 600000 solo per riavvii di polling-stall falsi positivi.
    • la cronologia del contesto di gruppo usa channels.telegram.historyLimit o messages.groupChat.historyLimit (predefinito 50); 0 la disabilita.
    • il contesto supplementare di risposta/citazione/inoltro viene attualmente passato così come ricevuto.
    • le allowlist di Telegram regolano principalmente chi può attivare l'agente, non un confine completo di redazione del contesto supplementare.
    • Controlli della cronologia DM:
      • channels.telegram.dmHistoryLimit
      • channels.telegram.dms["<user_id>"].historyLimit
    • La configurazione channels.telegram.retry si applica agli helper di invio Telegram (CLI/tools/actions) per errori API in uscita recuperabili. Anche la consegna della risposta finale in ingresso usa un retry bounded safe-send per errori Telegram pre-connessione, ma non riprova envelope di rete ambigue post-invio che potrebbero duplicare i messaggi visibili.

    I target di invio CLI e message-tool possono essere ID chat numerico, username o un target di argomento forum:

    openclaw message send --channel telegram --target 123456789 --message "hi"
    openclaw message send --channel telegram --target @name --message "hi"
    openclaw message send --channel telegram --target -1001234567890:topic:42 --message "hi topic"
    

    I poll Telegram usano openclaw message poll e supportano gli argomenti forum:

    openclaw message poll --channel telegram --target 123456789 \
    --poll-question "Ship it?" --poll-option "Yes" --poll-option "No"
    openclaw message poll --channel telegram --target -1001234567890:topic:42 \
    --poll-question "Pick a time" --poll-option "10am" --poll-option "2pm" \
    --poll-duration-seconds 300 --poll-public
    

    Flag poll solo Telegram:

    • --poll-duration-seconds (5-600)
    • --poll-anonymous
    • --poll-public
    • --thread-id per argomenti forum (oppure usa un target :topic:)

    L'invio Telegram supporta anche:

    • --presentation con blocchi buttons per tastiere inline quando channels.telegram.capabilities.inlineButtons lo consente
    • --pin o --delivery '{"pin":true}' per richiedere la consegna fissata quando il bot può fissare messaggi in quella chat
    • --force-document per inviare immagini e GIF in uscita come documenti invece che come caricamenti foto compressi o media animati

    Gating delle azioni:

    • channels.telegram.actions.sendMessage=false disabilita i messaggi Telegram in uscita, inclusi i poll
    • channels.telegram.actions.poll=false disabilita la creazione di poll Telegram lasciando abilitati gli invii regolari
    Approvazioni exec in Telegram

    Telegram supporta approvazioni exec nei DM degli approvatori e può opzionalmente pubblicare prompt nella chat o nell'argomento di origine. Gli approvatori devono essere ID utente Telegram numerici.

    Percorso di configurazione:

    • channels.telegram.execApprovals.enabled (si abilita automaticamente quando almeno un approvatore è risolvibile)
    • channels.telegram.execApprovals.approvers (ripiega sugli ID proprietario numerici da commands.ownerAllowFrom)
    • channels.telegram.execApprovals.target: dm (predefinito) | channel | both
    • agentFilter, sessionFilter

    channels.telegram.allowFrom, groupAllowFrom e defaultTo controllano chi può parlare con il bot e dove invia le risposte normali. Non rendono qualcuno un approvatore exec. Il primo pairing DM approvato inizializza commands.ownerAllowFrom quando non esiste ancora un proprietario dei comandi, quindi la configurazione con un solo proprietario continua a funzionare senza duplicare gli ID in execApprovals.approvers.

    La consegna nel canale mostra il testo del comando nella chat; abilita channel o both solo in gruppi/argomenti fidati. Quando il prompt arriva in un argomento forum, OpenClaw conserva l'argomento per il prompt di approvazione e il follow-up. Le approvazioni exec scadono dopo 30 minuti per impostazione predefinita.

    I pulsanti di approvazione inline richiedono anche che channels.telegram.capabilities.inlineButtons consenta la superficie target (dm, group o all). Gli ID di approvazione con prefisso plugin: vengono risolti tramite le approvazioni Plugin; gli altri vengono risolti prima tramite le approvazioni exec.

    Vedi Approvazioni exec.

    Controlli delle risposte di errore

    Quando l'agente incontra un errore di consegna o del provider, Telegram può rispondere con il testo dell'errore oppure sopprimerlo. Due chiavi di configurazione controllano questo comportamento:

    Chiave Valori Predefinito Descrizione
    channels.telegram.errorPolicy reply, silent reply reply invia un messaggio di errore amichevole alla chat. silent sopprime completamente le risposte di errore.
    channels.telegram.errorCooldownMs number (ms) 60000 Tempo minimo tra risposte di errore alla stessa chat. Previene lo spam di errori durante le interruzioni.

    Sono supportati override per account, per gruppo e per argomento (stessa ereditarietà delle altre chiavi di configurazione Telegram).

    {
      channels: {
        telegram: {
          errorPolicy: "reply",
          errorCooldownMs: 120000,
          groups: {
            "-1001234567890": {
              errorPolicy: "silent", // suppress errors in this group
            },
          },
        },
      },
    }
    

    Risoluzione dei problemi

    Il bot non risponde ai messaggi di gruppo senza menzione
    • Se requireMention=false, la modalità privacy di Telegram deve consentire visibilità completa.
      • BotFather: /setprivacy -> Disabilita
      • quindi rimuovi e aggiungi di nuovo il bot al gruppo
    • openclaw channels status avvisa quando la configurazione si aspetta messaggi di gruppo senza menzione.
    • openclaw channels status --probe può controllare ID di gruppo numerici espliciti; il carattere jolly "*" non può essere verificato per l'appartenenza.
    • test rapido di sessione: /activation always.
    Il bot non vede affatto i messaggi del gruppo
    • quando channels.telegram.groups esiste, il gruppo deve essere elencato (o includere "*")
    • verifica l'appartenenza del bot al gruppo
    • controlla i log: openclaw logs --follow per i motivi di salto
    I comandi funzionano parzialmente o non funzionano affatto
    • autorizza la tua identità mittente (associazione e/o allowFrom numerico)
    • l'autorizzazione dei comandi si applica comunque anche quando la policy del gruppo è open
    • setMyCommands failed con BOT_COMMANDS_TOO_MUCH significa che il menu nativo ha troppe voci; riduci i comandi di Plugin/Skill/personalizzati oppure disabilita i menu nativi
    • le chiamate di avvio deleteMyCommands / setMyCommands e le chiamate di digitazione sendChatAction sono limitate e riprovano una volta tramite il fallback di trasporto di Telegram in caso di timeout della richiesta. Errori persistenti di rete/fetch di solito indicano problemi di raggiungibilità DNS/HTTPS verso api.telegram.org
    L'avvio segnala un token non autorizzato
    • getMe returned 401 è un errore di autenticazione Telegram per il token del bot configurato.
    • Copia di nuovo o rigenera il token del bot in BotFather, quindi aggiorna channels.telegram.botToken, channels.telegram.tokenFile, channels.telegram.accounts.<id>.botToken o TELEGRAM_BOT_TOKEN per l'account predefinito.
    • deleteWebhook 401 Unauthorized durante l'avvio è anch'esso un errore di autenticazione; trattarlo come "non esiste alcun webhook" rinvierebbe soltanto lo stesso errore di token non valido alle chiamate API successive.
    Instabilità del polling o della rete
    • Node 22+ + fetch/proxy personalizzato possono attivare un comportamento di interruzione immediata se i tipi AbortSignal non corrispondono.
    • Alcuni host risolvono prima api.telegram.org in IPv6; un egress IPv6 non funzionante può causare errori intermittenti dell'API Telegram.
    • Se i log includono TypeError: fetch failed o Network request for 'getUpdates' failed!, OpenClaw ora li ritenta come errori di rete recuperabili.
    • Durante l'avvio del polling, OpenClaw riutilizza il probe getMe di avvio riuscito per grammY, così il runner non ha bisogno di un secondo getMe prima del primo getUpdates.
    • Se deleteWebhook fallisce con un errore di rete transitorio durante l'avvio del polling, OpenClaw passa comunque al long polling invece di effettuare un'altra chiamata di control plane pre-polling. Un webhook ancora attivo emerge come conflitto getUpdates; OpenClaw quindi ricostruisce il trasporto Telegram e ritenta la pulizia del webhook.
    • Se i socket Telegram vengono riciclati con una cadenza fissa breve, controlla se channels.telegram.timeoutSeconds è basso; i client bot limitano i valori configurati sotto le protezioni delle richieste in uscita e getUpdates, ma le versioni precedenti potevano interrompere ogni polling o risposta quando questo valore era impostato sotto tali protezioni.
    • Se i log includono Polling stall detected, OpenClaw riavvia il polling e ricostruisce il trasporto Telegram dopo 120 secondi senza liveness di long-poll completata per impostazione predefinita.
    • openclaw channels status --probe e openclaw doctor avvisano quando un account di polling in esecuzione non ha completato getUpdates dopo il periodo di tolleranza dell'avvio, quando un account webhook in esecuzione non ha completato setWebhook dopo il periodo di tolleranza dell'avvio, o quando l'ultima attività riuscita del trasporto di polling è obsoleta.
    • Aumenta channels.telegram.pollingStallThresholdMs solo quando le chiamate getUpdates di lunga durata sono sane ma il tuo host segnala comunque falsi riavvii per stallo del polling. Stalli persistenti di solito indicano problemi di proxy, DNS, IPv6 o egress TLS tra l'host e api.telegram.org.
    • Telegram rispetta anche le env proxy del processo per il trasporto Bot API, incluse HTTP_PROXY, HTTPS_PROXY, ALL_PROXY e le loro varianti minuscole. NO_PROXY / no_proxy possono comunque bypassare api.telegram.org.
    • Se il proxy gestito da OpenClaw è configurato tramite OPENCLAW_PROXY_URL per un ambiente di servizio e non è presente alcuna env proxy standard, Telegram usa quell'URL anche per il trasporto Bot API.
    • Su host VPS con egress/TLS diretto instabile, instrada le chiamate API Telegram tramite channels.telegram.proxy:
    channels:
    telegram:
    proxy: socks5://<user>:<password>@proxy-host:1080
    
    • Node 22+ usa per impostazione predefinita autoSelectFamily=true (tranne WSL2). L'ordine dei risultati DNS di Telegram rispetta OPENCLAW_TELEGRAM_DNS_RESULT_ORDER, poi channels.telegram.network.dnsResultOrder, poi il valore predefinito del processo come NODE_OPTIONS=--dns-result-order=ipv4first; se nessuno si applica, Node 22+ ripiega su ipv4first.
    • Se il tuo host è WSL2 o funziona esplicitamente meglio con comportamento solo IPv4, forza la selezione della famiglia:
    channels:
    telegram:
    network:
      autoSelectFamily: false
    
    • Le risposte nell'intervallo benchmark RFC 2544 (198.18.0.0/15) sono già consentite per i download dei media Telegram per impostazione predefinita. Se una fake-IP attendibile o un proxy trasparente riscrive api.telegram.org verso un altro indirizzo privato/interno/a uso speciale durante i download dei media, puoi aderire al bypass solo per Telegram:
    channels:
    telegram:
    network:
      dangerouslyAllowPrivateNetwork: true
    
    • La stessa adesione è disponibile per account in channels.telegram.accounts.<accountId>.network.dangerouslyAllowPrivateNetwork.
    • Se il tuo proxy risolve gli host media Telegram in 198.18.x.x, lascia prima disattivato il flag pericoloso. I media Telegram consentono già l'intervallo benchmark RFC 2544 per impostazione predefinita.
    • Override di ambiente (temporanei):
      • OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1
      • OPENCLAW_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY=1
      • OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first
    • Valida le risposte DNS:
    dig +short api.telegram.org A
    dig +short api.telegram.org AAAA
    

    Altro aiuto: risoluzione dei problemi dei canali.

    Riferimento di configurazione

    Riferimento principale: Riferimento di configurazione - Telegram.

    Campi Telegram ad alto segnale
    • avvio/autenticazione: enabled, botToken, tokenFile, accounts.* (tokenFile deve puntare a un file regolare; i symlink vengono rifiutati)
    • controllo degli accessi: dmPolicy, allowFrom, groupPolicy, groupAllowFrom, groups, groups.*.topics.*, bindings[] di primo livello (type: "acp")
    • approvazioni exec: execApprovals, accounts.*.execApprovals
    • comandi/menu: commands.native, commands.nativeSkills, customCommands
    • thread/risposte: replyToMode, dm.threadReplies, direct.*.threadReplies
    • streaming: streaming (anteprima), streaming.preview.toolProgress, blockStreaming
    • formattazione/consegna: textChunkLimit, chunkMode, linkPreview, responsePrefix
    • media/rete: mediaMaxMb, mediaGroupFlushMs, timeoutSeconds, pollingStallThresholdMs, retry, network.autoSelectFamily, network.dangerouslyAllowPrivateNetwork, proxy
    • root API personalizzata: apiRoot (solo root Bot API; non includere /bot&lt;TOKEN&gt;)
    • webhook: webhookUrl, webhookSecret, webhookPath, webhookHost
    • azioni/capacità: capabilities.inlineButtons, actions.sendMessage|editMessage|deleteMessage|reactions|sticker
    • reazioni: reactionNotifications, reactionLevel
    • errori: errorPolicy, errorCooldownMs
    • scritture/cronologia: configWrites, historyLimit, dmHistoryLimit, dms.*.historyLimit

    Correlati