Developer and self-hosted
Mattermost
Stato: plugin scaricabile (token del bot + eventi WebSocket). Sono supportati canali, canali privati, messaggi diretti di gruppo e messaggi diretti. Mattermost è una piattaforma di messaggistica per team che può essere ospitata autonomamente (mattermost.com).
Installazione
Registro npm
openclaw plugins install @openclaw/mattermostCheckout locale
openclaw plugins install ./path/to/local/mattermost-pluginDettagli: Plugin
Configurazione rapida
Assicurarsi che il plugin sia disponibile
Installa @openclaw/mattermost con il comando precedente, quindi riavvia il Gateway se è già in esecuzione.
Creare un bot Mattermost
Crea un account bot Mattermost, copia il token del bot e aggiungi il bot ai team e ai canali che deve leggere.
Copiare l'URL di base
Copia l'URL di base di Mattermost (ad esempio, https://chat.example.com). L'eventuale /api/v4 finale viene rimosso automaticamente.
Configurare OpenClaw e avviare il Gateway
Configurazione minima:
{ channels: { mattermost: { enabled: true, botToken: "mm-token", baseUrl: "https://chat.example.com", dmPolicy: "pairing", }, },}Alternativa non interattiva:
openclaw channels add --channel mattermost --bot-token <token> --http-url https://chat.example.comComandi slash nativi
I comandi slash nativi sono facoltativi. Quando sono abilitati, OpenClaw registra i comandi slash oc_* in ogni team di cui il bot è membro e riceve le chiamate POST di callback sul server HTTP del Gateway.
{ channels: { mattermost: { commands: { native: true, nativeSkills: true, callbackPath: "/api/channels/mattermost/command", // Da usare quando Mattermost non può raggiungere direttamente il Gateway (proxy inverso/URL pubblico). callbackUrl: "https://gateway.example.com/api/channels/mattermost/command", }, }, },}Comandi registrati: /oc_status, /oc_model, /oc_models, /oc_new, /oc_help, /oc_think, /oc_reasoning, /oc_verbose, /oc_queue. Con nativeSkills: true, anche i comandi delle Skills vengono registrati come /oc_<skill>.
Note sul comportamento
- Il valore predefinito di
nativeenativeSkillsè"auto", che per Mattermost viene interpretato come disabilitato. Impostali esplicitamente sutrue. - Il valore predefinito di
callbackPathè/api/channels/mattermost/command. - Se
callbackUrlviene omesso, OpenClaw ricavahttp://<gateway.customBindHost or localhost>:<gateway.port, default 18789><callbackPath>. Gli host di associazione con caratteri jolly (0.0.0.0,::) usanolocalhostcome ripiego. - Nelle configurazioni con più account,
commandspuò essere impostato al livello superiore o inchannels.mattermost.accounts.<id>.commands(i valori dell'account sostituiscono i campi di livello superiore). - I comandi slash esistenti con lo stesso trigger, creati da altre integrazioni, non vengono modificati (la registrazione li ignora); i comandi creati dal bot vengono aggiornati o ricreati quando cambia l'URL di callback.
- Le callback dei comandi vengono convalidate mediante i token specifici per comando restituiti da Mattermost quando OpenClaw registra i comandi
oc_*. - OpenClaw aggiorna la registrazione corrente dei comandi Mattermost prima di accettare ogni callback, quindi i token obsoleti di comandi slash eliminati o rigenerati cessano di essere accettati senza dover riavviare il Gateway.
- La convalida delle callback non consente l'accesso se l'API di Mattermost non può confermare che il comando sia ancora corrente; le convalide non riuscite vengono memorizzate brevemente nella cache, le ricerche simultanee vengono accorpate e l'avvio di nuove ricerche è soggetto a un limite di frequenza per comando, così da contenere la pressione dei tentativi di ripetizione.
- Le callback slash non consentono l'accesso quando la registrazione non è riuscita, l'avvio è stato parziale o il token della callback non corrisponde al token registrato del comando risolto (un token valido per un comando non può raggiungere la convalida a monte per un comando diverso).
- Le callback accettate ricevono una conferma con una risposta temporanea "Elaborazione in corso..."; la risposta effettiva arriva come messaggio normale.
Requisito di raggiungibilità
L'endpoint di callback deve essere raggiungibile dal server Mattermost.
- Non impostare
callbackUrlsulocalhost, a meno che Mattermost non sia in esecuzione sullo stesso host o nello stesso spazio dei nomi di rete di OpenClaw. - Non impostare
callbackUrlsull'URL di base di Mattermost, a meno che tale URL non inoltri tramite proxy inverso/api/channels/mattermost/commanda OpenClaw. - Per una verifica rapida, usa
curl https://<gateway-host>/api/channels/mattermost/command; una richiesta GET deve restituire405 Method Not Allowedda OpenClaw, non404.
Elenco consentito per il traffico in uscita di Mattermost
Se la callback è indirizzata a indirizzi privati/tailnet/interni, imposta ServiceSettings.AllowedUntrustedInternalConnections di Mattermost in modo da includere l'host o il dominio della callback.
Usa voci host/dominio, non URL completi.
- Corretto:
gateway.tailnet-name.ts.net - Errato:
https://gateway.tailnet-name.ts.net
Variabili d'ambiente (account predefinito)
Se preferisci le variabili d'ambiente, impostale sull'host del Gateway:
MATTERMOST_BOT_TOKEN=...MATTERMOST_URL=https://chat.example.com
Modalità di chat
Mattermost risponde automaticamente ai messaggi diretti. Il comportamento nei canali è controllato da chatmode:
oncall (predefinita)
Risponde solo quando viene menzionato con @ nei canali.
onmessage
Risponde a ogni messaggio del canale.
onchar
Risponde quando un messaggio inizia con un prefisso di attivazione.
Esempio di configurazione:
{ channels: { mattermost: { chatmode: "onchar", oncharPrefixes: [">", "!"], // predefinito }, },}Note:
oncharrisponde comunque alle menzioni @ esplicite.channels.mattermost.requireMentioncontinua a essere rispettato, ma è preferibilechatmode. Le impostazionigroups.<channelId>.requireMentionspecifiche per canale hanno la precedenza su entrambi.- Dopo che il bot invia una risposta visibile in una discussione del canale, i messaggi successivi nella stessa discussione ricevono risposta senza una nuova menzione @ o un prefisso
onchar, così le conversazioni a più turni nella discussione possono proseguire. La partecipazione viene ricordata per 7 giorni dall'ultima risposta del bot in quella discussione e persiste dopo il riavvio del Gateway. Le discussioni che il bot ha soltanto osservato non sono interessate; avvia un nuovo messaggio di primo livello per richiedere nuovamente una menzione esplicita.
Discussioni e sessioni
Usa channels.mattermost.replyToMode per controllare se le risposte nei canali e nei gruppi rimangono nel canale principale o avviano una discussione sotto il post che le ha attivate.
off(predefinito): risponde in una discussione solo quando il post in entrata appartiene già a una discussione.first: per i post di primo livello di canali o gruppi, avvia una discussione sotto quel post e instrada la conversazione verso una sessione relativa alla discussione.allebatched: attualmente hanno lo stesso comportamento difirstper Mattermost, perché, una volta che Mattermost dispone di un post radice della discussione, i segmenti e i contenuti multimediali successivi continuano nella stessa discussione.- Il valore predefinito per i messaggi diretti è
off, anche quandoreplyToModeè impostato.
Usa channels.mattermost.replyToModeByChatType per sostituire la modalità nelle chat direct, group o channel. Imposta direct per abilitare le discussioni nei messaggi diretti:
off(predefinito): i messaggi diretti rimangono senza discussioni in un'unica sessione continua.first,allobatched: ogni messaggio diretto di primo livello avvia una discussione Mattermost associata a una nuova sessione indipendente.
{ channels: { mattermost: { replyToMode: "all", replyToModeByChatType: { direct: "first", }, }, },}Note:
- Le sessioni relative alle discussioni usano l'ID del post che le ha attivate come radice della discussione.
firsteallsono attualmente equivalenti perché, una volta che Mattermost dispone di un post radice della discussione, i segmenti e i contenuti multimediali successivi continuano nella stessa discussione.- Le sostituzioni specifiche per tipo di chat hanno la precedenza su
replyToMode. Senza una sostituzione perdirect, le installazioni esistenti mantengono i messaggi diretti lineari, senza discussioni.
Controllo degli accessi (messaggi diretti)
- Valore predefinito:
channels.mattermost.dmPolicy = "pairing"(i mittenti sconosciuti ricevono un codice di associazione). Altri valori:allowlist,open,disabled. - Approva tramite:
openclaw pairing list mattermostopenclaw pairing approve mattermost <CODE>
- Messaggi diretti pubblici:
channels.mattermost.dmPolicy="open"insieme achannels.mattermost.allowFrom=["*"](lo schema di configurazione impone il carattere jolly). channels.mattermost.allowFromaccetta ID utente (consigliati) e vociaccessGroup:<name>. Consulta Gruppi di accesso.
Canali (gruppi)
- Valore predefinito:
channels.mattermost.groupPolicy = "allowlist"(richiede una menzione). - Inserisci i mittenti nell'elenco consentito con
channels.mattermost.groupAllowFrom(sono consigliati gli ID utente). channels.mattermost.groupAllowFromaccetta vociaccessGroup:<name>. Consulta Gruppi di accesso.- Le sostituzioni delle menzioni specifiche per canale si trovano in
channels.mattermost.groups.<channelId>.requireMentionoppure, per un valore predefinito, inchannels.mattermost.groups["*"].requireMention. - La corrispondenza di
@usernameè modificabile ed è abilitata solo quandochannels.mattermost.dangerouslyAllowNameMatching: true. - Canali aperti:
channels.mattermost.groupPolicy="open"(richiede una menzione). - Ordine di risoluzione:
channels.mattermost.groupPolicy, quindichannels.defaults.groupPolicy, infine"allowlist". - Nota sull'esecuzione: se la sezione
channels.mattermostè completamente assente, durante i controlli dei gruppi l'esecuzione usa in modo restrittivogroupPolicy="allowlist"(anche sechannels.defaults.groupPolicyè impostato) e registra un avviso una sola volta.
Esempio:
{ channels: { mattermost: { groupPolicy: "open", groups: { "*": { requireMention: true }, "team-channel-id": { requireMention: false }, }, }, },}Destinazioni per l'invio in uscita
Usa questi formati di destinazione con openclaw message send o Cron/Webhook:
| Destinazione | Recapito |
|---|---|
channel:<id> |
Canale per ID |
channel:<name> o #channel-name |
Canale per nome, cercato nei team a cui appartiene il bot |
user:<id> o mattermost:<id> |
Messaggio diretto con tale utente |
@username |
Messaggio diretto (nome utente risolto tramite l'API Mattermost) |
Gli invii in uscita supportano al massimo un allegato per messaggio; suddividi più file in invii separati.
Nuovo tentativo per il canale dei messaggi diretti
Quando OpenClaw invia a una destinazione di messaggistica diretta Mattermost e deve prima risolvere il canale diretto, per impostazione predefinita riprova in caso di errori temporanei nella creazione del canale diretto.
Usa channels.mattermost.dmChannelRetry per regolare questo comportamento globalmente per il plugin Mattermost oppure channels.mattermost.accounts.<id>.dmChannelRetry per un singolo account. Valori predefiniti:
{ channels: { mattermost: { dmChannelRetry: { maxRetries: 3, initialDelayMs: 1000, maxDelayMs: 10000, timeoutMs: 30000, }, }, },}Note:
- Questo si applica solo alla creazione dei canali DM (
/api/v4/channels/direct), non a tutte le chiamate API di Mattermost. - I nuovi tentativi usano un backoff esponenziale con jitter e si applicano agli errori transitori, come limiti di frequenza, risposte 5xx ed errori di rete o timeout.
- Gli errori client 4xx diversi da
429sono considerati permanenti e non vengono ripetuti.
Streaming dell'anteprima
Mattermost trasmette in streaming il ragionamento, l'attività degli strumenti e il testo parziale della risposta in un post di anteprima in bozza, che viene finalizzato sul posto quando la risposta definitiva può essere inviata in sicurezza. In modalità partial, l'anteprima viene aggiornata usando lo stesso ID del post, anziché sommergere il canale con un messaggio per ogni frammento. In modalità block, l'anteprima alterna blocchi di testo completato e di attività degli strumenti, così i blocchi precedenti rimangono visibili come post separati anziché essere sovrascritti da quello successivo. Le risposte finali contenenti contenuti multimediali o errori annullano le modifiche dell'anteprima in sospeso e usano la consegna normale, anziché pubblicare un post di anteprima usa e getta.
Lo streaming dell'anteprima è attivo per impostazione predefinita in modalità partial. Configuralo tramite channels.mattermost.streaming (una stringa di modalità, un valore booleano o un oggetto come { mode: "progress" }):
{ channels: { mattermost: { streaming: "partial", // off | partial | block | progress }, },}Modalità di streaming
partial(predefinita): un singolo post di anteprima che viene modificato mentre la risposta cresce, quindi finalizzato con la risposta completa.blockalterna l'anteprima tra blocchi di testo completato e di attività degli strumenti, così ogni blocco rimane visibile come post separato anziché essere sovrascritto sul posto. Gli aggiornamenti paralleli e consecutivi degli strumenti condividono il post corrente dell'attività degli strumenti.progressmostra un'anteprima dello stato durante la generazione e pubblica la risposta finale solo al completamento.offdisabilita lo streaming dell'anteprima. ConblockStreaming: true, i blocchi completati dell'assistente vengono comunque consegnati come normali risposte a blocchi (post separati), anziché come un unico post finale aggregato.
Note sul comportamento dello streaming
- Se lo stream non può essere finalizzato sul posto, ad esempio perché il post è stato eliminato durante lo streaming, OpenClaw ricorre all'invio di un nuovo post finale, così la risposta non va mai persa.
- I payload contenenti solo il ragionamento non vengono pubblicati nei post del canale, incluso il testo che arriva come citazione
> Thinking. Imposta/reasoning onper visualizzare il ragionamento in altre interfacce; il post finale di Mattermost mantiene solo la risposta. - Consulta Streaming per la matrice di mappatura dei canali.
Reazioni (strumento per i messaggi)
- Usa
message action=reactconchannel=mattermost. messageIdè l'ID del post di Mattermost.emojiaccetta nomi comethumbsupo:+1:(i due punti sono facoltativi).- Imposta
remove=true(valore booleano) per rimuovere una reazione. - Gli eventi di aggiunta/rimozione delle reazioni vengono inoltrati come eventi di sistema alla sessione dell'agente instradata, con gli stessi controlli delle politiche DM/gruppo applicati ai messaggi.
Esempi:
message action=react channel=mattermost target=channel:<channelId> messageId=<postId> emoji=thumbsupmessage action=react channel=mattermost target=channel:<channelId> messageId=<postId> emoji=thumbsup remove=trueConfigurazione:
channels.mattermost.actions.reactions: abilita/disabilita le azioni di reazione (valore predefinito: true).- Sostituzione per account:
channels.mattermost.accounts.<id>.actions.reactions.
Pulsanti interattivi (strumento per i messaggi)
Invia messaggi con pulsanti selezionabili. Quando un utente seleziona un pulsante, l'agente riceve la selezione e può rispondere.
I pulsanti provengono dal payload semantico presentation (nelle normali risposte dell'agente e in message action=send). OpenClaw visualizza i pulsanti con valore come pulsanti interattivi di Mattermost, mantiene visibili nel testo del messaggio i pulsanti URL e converte i menu di selezione in testo leggibile.
message action=send channel=mattermost target=channel:<channelId> presentation={"blocks":[{"type":"buttons","buttons":[{"label":"Yes","value":"yes"},{"label":"No","value":"no"}]}]}Campi dei pulsanti di presentazione:
labelstringrequiredEtichetta visualizzata (alias: text).
valuestringValore restituito alla selezione, usato come ID dell'azione (alias: callback_data, callbackData). Obbligatorio per un pulsante selezionabile, a meno che non sia impostato url.
urlstringPulsante di collegamento; viene visualizzato come testo label: url nel corpo del messaggio anziché come pulsante interattivo.
style"primary" | "secondary" | "success" | "danger"Stile del pulsante. Mattermost applica lo stile predefinito ai valori non supportati.
Per indicare il supporto dei pulsanti nel prompt di sistema dell'agente, aggiungi inlineButtons alle funzionalità del canale:
{ channels: { mattermost: { capabilities: ["inlineButtons"], }, },}Quando un utente seleziona un pulsante:
Controllo dell'accesso
Chi seleziona il pulsante deve superare gli stessi controlli delle politiche DM/gruppo applicati al mittente di un messaggio; le selezioni non autorizzate ricevono una notifica temporanea e vengono ignorate.
Pulsanti sostituiti con una conferma
Tutti i pulsanti vengono sostituiti con una riga di conferma, ad esempio "✓ Sì selezionato da @user".
L'agente riceve la selezione
L'agente riceve la selezione come messaggio in ingresso, insieme a un evento di sistema, e risponde.
Note sull'implementazione
- I callback dei pulsanti usano la verifica HMAC-SHA256 (automatica, senza configurazione).
- Alla selezione viene sostituito l'intero blocco dell'allegato, quindi tutti i pulsanti vengono rimossi insieme: la rimozione parziale non è possibile.
- Gli ID delle azioni contenenti trattini o caratteri di sottolineatura vengono sanificati automaticamente (limitazione dell'instradamento di Mattermost).
- Le selezioni il cui
action_idnon corrisponde a un'azione del post originale vengono rifiutate con403("Azione sconosciuta").
Configurazione e raggiungibilità
channels.mattermost.capabilities: array di stringhe delle funzionalità. Aggiungi"inlineButtons"per abilitare la descrizione dello strumento per i pulsanti nel prompt di sistema dell'agente.channels.mattermost.interactions.callbackBaseUrl: URL di base esterno facoltativo per i callback dei pulsanti, ad esempiohttps://gateway.example.com. Usalo quando Mattermost non può raggiungere direttamente il Gateway tramite il relativo host di binding.- Nelle configurazioni con più account, puoi impostare lo stesso campo anche in
channels.mattermost.accounts.<id>.interactions.callbackBaseUrl. - Se
interactions.callbackBaseUrlviene omesso, OpenClaw ricava l'URL di callback dagateway.customBindHost+gateway.port(valore predefinito: 18789), quindi ripiega suhttp://localhost:<port>. Il percorso di callback è/mattermost/interactions/<accountId>. - Regola di raggiungibilità: l'URL di callback dei pulsanti deve essere raggiungibile dal server Mattermost.
localhostfunziona solo quando Mattermost e OpenClaw sono in esecuzione sullo stesso host/spazio dei nomi di rete. channels.mattermost.interactions.allowedSourceIps: elenco di indirizzi IP di origine consentiti per i callback dei pulsanti. Senza questa opzione, vengono accettate solo le origini local loopback (127.0.0.1,::1), quindi un server Mattermost remoto deve essere aggiunto qui all'elenco degli indirizzi consentiti, altrimenti le sue selezioni vengono rifiutate con403. Dietro un proxy inverso, imposta anchegateway.trustedProxies, così l'IP reale del client viene ricavato dalle intestazioni inoltrate.- Se la destinazione del callback è privata, interna o nella tailnet, aggiungi il relativo host/dominio a
ServiceSettings.AllowedUntrustedInternalConnectionsdi Mattermost.
Integrazione API diretta (script esterni)
Gli script esterni e i Webhook possono pubblicare direttamente i pulsanti tramite l'API REST di Mattermost anziché passare dallo strumento message dell'agente. Quando possibile, usa buildButtonAttachments() del Plugin; se pubblichi JSON non elaborato, segui queste regole:
Struttura del payload:
{ channel_id: "<channelId>", message: "Choose an option:", props: { attachments: [ { actions: [ { id: "mybutton01", // alphanumeric only - see below type: "button", // required, or clicks are silently ignored name: "Approve", // display label style: "primary", // optional: "default", "primary", "danger" integration: { url: "https://gateway.example.com/mattermost/interactions/default", context: { action_id: "mybutton01", // must match button id action: "approve", // ... any custom fields ... _token: "<hmac>", // see HMAC section below }, }, }, ], }, ], },}Generazione del token HMAC
Il Gateway verifica le selezioni dei pulsanti con HMAC-SHA256. Gli script esterni devono generare token che corrispondano alla logica di verifica del Gateway:
Deriva il segreto dal token del bot
HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken), con codifica esadecimale.
Crea l'oggetto di contesto
Crea l'oggetto di contesto con tutti i campi tranne _token.
Serializza con le chiavi ordinate
Serializza con chiavi ordinate ricorsivamente e senza spazi (anche il Gateway rende canonici gli oggetti annidati e produce JSON compatto).
Firma il payload
HMAC-SHA256(key=secret, data=serializedContext)
Aggiungi il token
Aggiungi al contesto il digest esadecimale risultante come _token.
Esempio in Python:
secret = hmac.new( b"openclaw-mattermost-interactions", bot_token.encode(), hashlib.sha256).hexdigest() ctx = {"action_id": "mybutton01", "action": "approve"}payload = json.dumps(ctx, sort_keys=True, separators=(",", ":"))token = hmac.new(secret.encode(), payload.encode(), hashlib.sha256).hexdigest() context = {**ctx, "_token": token}Errori comuni con HMAC
- Per impostazione predefinita,
json.dumpsdi Python aggiunge spazi ({"key": "val"}). Usaseparators=(",", ":")per ottenere lo stesso output compatto di JavaScript ({"key":"val"}). - Firma sempre tutti i campi del contesto, escluso
_token. Il Gateway rimuove_token, quindi firma tutto ciò che rimane. Firmare solo un sottoinsieme causa un errore di verifica senza notifiche. - Usa
sort_keys=True: il Gateway ordina le chiavi prima della firma e Mattermost potrebbe riordinare i campi del contesto durante l'archiviazione del payload. - Deriva il segreto dal token del bot in modo deterministico, anziché usare byte casuali. Il segreto deve essere identico nel processo che crea i pulsanti e nel Gateway che esegue la verifica.
Adattatore della directory
Il Plugin Mattermost include un adattatore della directory che risolve i nomi dei canali e degli utenti tramite l'API Mattermost. Questo abilita le destinazioni #channel-name e @username in openclaw message send e nelle consegne Cron/Webhook.
Non è necessaria alcuna configurazione: l'adattatore usa il token del bot presente nella configurazione dell'account.
Più account
Mattermost supporta più account in channels.mattermost.accounts:
{ channels: { mattermost: { accounts: { default: { name: "Principale", botToken: "mm-token", baseUrl: "https://chat.example.com" }, alerts: { name: "Avvisi", botToken: "mm-token-2", baseUrl: "https://alerts.example.com" }, }, }, },}I valori dell'account sostituiscono i campi di primo livello; channels.mattermost.defaultAccount seleziona l'account da utilizzare quando non ne viene specificato uno.
Risoluzione dei problemi
Nessuna risposta nei canali
Assicurati che il bot sia nel canale e menzionalo (oncall), usa un prefisso di attivazione (onchar) oppure imposta chatmode: "onmessage".
Errori di autenticazione o relativi a più account
- Controlla il token del bot, l'URL di base e che l'account sia abilitato.
- Problemi con più account: le variabili di ambiente si applicano solo all'account
default. - Gli host Mattermost privati/LAN richiedono
network.dangerouslyAllowPrivateNetwork: true(per impostazione predefinita, la protezione SSRF blocca gli IP privati).
I comandi slash nativi non funzionano
Unauthorized: invalid command token.: OpenClaw non ha accettato il token di callback. Cause tipiche:- la registrazione del comando slash non è riuscita o è stata completata solo parzialmente all'avvio
- la callback raggiunge il Gateway o l'account errato
- Mattermost conserva ancora vecchi comandi che puntano a una destinazione di callback precedente
- il Gateway è stato riavviato senza riattivare i comandi slash
- Se i comandi slash nativi smettono di funzionare, controlla nei log la presenza di
mattermost: failed to register slash commandsomattermost: native slash commands enabled but no commands could be registered. - Se
callbackUrlviene omesso e i log avvisano che la callback è stata risolta in un URL local loopback comehttp://localhost:18789/..., probabilmente tale URL è raggiungibile solo quando Mattermost viene eseguito nello stesso host/spazio dei nomi di rete di OpenClaw. Imposta invece uncommands.callbackUrlesplicito e raggiungibile dall'esterno.
Problemi con i pulsanti
- I pulsanti appaiono come riquadri bianchi o non appaiono affatto: i dati del pulsante non sono validi. Ogni pulsante di presentazione richiede un
labele unvalue(i pulsanti privi di uno dei due vengono ignorati). - I pulsanti vengono visualizzati, ma i clic non producono alcun effetto: verifica che il Gateway sia raggiungibile dal server Mattermost, che l'IP del server Mattermost sia incluso in
channels.mattermost.interactions.allowedSourceIps(senza questa impostazione viene accettato solo il local loopback) e cheServiceSettings.AllowedUntrustedInternalConnectionsincluda l'host di callback per le destinazioni private. - I pulsanti restituiscono un errore 404 al clic: probabilmente l'
iddel pulsante contiene trattini o trattini bassi. Il router delle azioni di Mattermost non funziona con ID non alfanumerici. Usa esclusivamente[a-zA-Z0-9]. - Nei log del Gateway compare
rejected callback source: il clic proviene da un IP non incluso ininteractions.allowedSourceIps. Aggiungi il server Mattermost o il tuo ingresso all'elenco dei consentiti e impostagateway.trustedProxiesse utilizzi un proxy inverso. - Nei log del Gateway compare
invalid _token: mancata corrispondenza HMAC. Verifica di firmare tutti i campi del contesto (non solo un sottoinsieme), di usare chiavi ordinate e JSON compatto (senza spazi). Consulta la sezione HMAC precedente. - Nei log del Gateway compare
missing _token in context: il campo_tokennon è presente nel contesto del pulsante. Assicurati che venga incluso durante la creazione del payload dell'integrazione. - Il Gateway rifiuta il clic con
Unknown action:context.action_idnon corrisponde all'iddi alcuna azione nel post. Imposta entrambi sullo stesso valore normalizzato. - L'agente non propone pulsanti: aggiungi
capabilities: ["inlineButtons"]alla configurazione del canale Mattermost.
Contenuti correlati
- Instradamento dei canali - instradamento delle sessioni per i messaggi
- Panoramica dei canali - tutti i canali supportati
- Gruppi - comportamento delle chat di gruppo e controllo tramite menzioni
- Associazione - autenticazione dei messaggi diretti e flusso di associazione
- Sicurezza - modello di accesso e protezione avanzata