Blu Pantheon
BluBot-Widget

API JavaScript

Metodi di window.BluBot per aprire, chiudere, inviare messaggi, identificare l utente e gestire il ciclo di vita del widget.

Dopo il caricamento dello script, BluBot espone l'oggetto globale window.BluBot. Tutti i metodi sono sincroni salvo dove indicato e possono essere invocati solo dopo l'evento blubot:ready.

Attendi la disponibilità

Invocare un metodo prima dell'inizializzazione genera l'errore BluBot is not defined. Racchiudi le chiamate in un listener di blubot:ready oppure usa l'operatore di accesso opzionale: window.BluBot?.open().

Verifica rapida dalla console del browser

window.BluBot.version

Restituisce la versione caricata, ad esempio 1.24.0.

Riepilogo dei metodi

MetodoRestituisceEffetto
init(config)voidInizializza il widget
open()voidApre la finestra di chat
close()voidChiude la finestra
toggle()voidInverte lo stato di apertura
sendMessage(text)PromiseInvia un messaggio a nome dell'utente
setUser(user)voidIdentifica l'utente corrente
setLocale(locale)voidCambia la lingua dell'interfaccia
reset()voidChiude la sessione e ne apre una nuova
destroy()voidRimuove il widget dalla pagina
isOpen()booleanIndica se la finestra è aperta
on(event, handler)voidRegistra un ascoltatore
off(event, handler)voidRimuove un ascoltatore

init

Inizializza il widget con la configurazione fornita. Necessario solo se hai disattivato l'inizializzazione automatica con data-auto-init="false".

Firma
BluBot.init(config: BluBotConfig): void

Parametri

ParametroTipoObblig.DefaultDescrizione
configobjectSì—Oggetto di configurazione. Il solo campo obbligatorio è projectKey. Riferimento completo nella pagina Configurazione.
Esempio
window.BluBot.init({
  projectKey: 'bp_proj_7f3a9c21',
  locale: 'it',
  theme: 'auto',
  position: 'bottom-right'
});

Una seconda chiamata su un widget già inizializzato viene ignorata e produce un avviso in console.

open

Apre la finestra di chat. Se il widget è nascosto lo rende visibile.

Firma
BluBot.open(): void
Esempio — pulsante nella pagina
<button type="button" onclick="window.BluBot.open()">
  Parla con noi
</button>
Esempio — apertura da un link
document.querySelectorAll('[data-open-chat]').forEach((el) => {
  el.addEventListener('click', (event) => {
    event.preventDefault();
    window.BluBot?.open();
  });
});

close

Chiude la finestra lasciando visibile il launcher. La sessione resta attiva e i messaggi ricevuti generano una notifica sul pulsante.

Firma
BluBot.close(): void
Esempio — chiusura all uscita da una sezione
window.addEventListener('hashchange', () => {
  if (!window.location.hash.startsWith('#assistenza')) {
    window.BluBot?.close();
  }
});

toggle

Inverte lo stato della finestra. Utile per un launcher personalizzato.

Firma
BluBot.toggle(): void
Esempio — launcher personalizzato
const launcher = document.getElementById('mio-launcher');

launcher.addEventListener('click', () => window.BluBot?.toggle());

window.BluBot?.on('open', () => launcher.setAttribute('aria-expanded', 'true'));
window.BluBot?.on('close', () => launcher.setAttribute('aria-expanded', 'false'));

sendMessage

Invia un messaggio come se lo avesse scritto l'utente. Apre la finestra se chiusa. Restituisce una promessa che si risolve quando il messaggio è stato accettato dal server.

Firma
BluBot.sendMessage(text: string, options?: SendOptions): Promise<void>

Parametri

ParametroTipoObblig.DefaultDescrizione
textstringSì—Testo del messaggio. Massimo 4000 caratteri. Le stringhe vuote vengono ignorate.
options.hiddenbooleanNo—Invia il messaggio senza mostrarlo nella trascrizione visibile. Utile per fornire contesto.
options.metadataobjectNo—Metadati allegati al messaggio, disponibili nei flussi e nei webhook.
Esempio — domanda precompilata dalla scheda prodotto
document.getElementById('chiedi-info').addEventListener('click', async () => {
  await window.BluBot.sendMessage(
    'Vorrei informazioni sulla visita cardiologica.',
    { metadata: { origine: 'scheda-prestazione', codice: 'VIS_CARD' } }
  );
});
Esempio — contesto nascosto
window.BluBot.sendMessage(
  'Contesto: l utente proviene dalla pagina prezzi, piano Business.',
  { hidden: true }
);

Non usare i messaggi nascosti per i segreti

Il contenuto dei messaggi nascosti è generato nel browser e visibile nella scheda Rete. Non inserirvi token, prezzi riservati o dati personali non già noti all'utente.

setUser

Identifica l'utente corrente. Se la sessione è già avviata, i dati vengono associati retroattivamente.

Firma
BluBot.setUser(user: BluBotUser): void

Parametri

ParametroTipoObblig.DefaultDescrizione
user.idstringSì—Identificativo stabile nel tuo sistema. Deve restare invariato tra le sessioni.
user.namestringNo—Nome mostrato agli operatori nella Console.
user.emailstringNo—Email usata per la corrispondenza con l anagrafica cliente.
user.phonestringNo—Telefono in formato internazionale.
user.metadataobjectNo—Massimo 20 chiavi con valori di massimo 256 caratteri.
user.signaturestringNo—Firma HMAC calcolata sul server. Obbligatoria con identificazione verificata attiva.
Esempio
window.BluBot.setUser({
  id: 'usr_88213',
  name: 'Marco Rossi',
  email: 'marco.rossi@example.it',
  metadata: { piano: 'premium', citta: 'Milano', cliente_dal: '2023-04-11' }
});

Per disidentificare l'utente al logout usa reset().

setLocale

Cambia la lingua dell'interfaccia e delle risposte senza ricaricare la pagina.

Firma
BluBot.setLocale(locale: string): void

Parametri

ParametroTipoObblig.DefaultDescrizione
localestringSì—Codice della lingua: it, en, fr, de, es, ar, ro. Un codice non supportato viene ignorato con un avviso.
Esempio — sincronizzazione con il selettore di lingua del sito
document.getElementById('selettore-lingua').addEventListener('change', (event) => {
  window.BluBot?.setLocale(event.target.value);
});

Il cambio di lingua non interrompe la conversazione: i messaggi precedenti restano nella lingua originale.

reset

Chiude la sessione corrente, cancella lo stato locale e ne prepara una nuova.

Firma
BluBot.reset(): void
Esempio — al logout dell utente
document.getElementById('logout').addEventListener('click', () => {
  window.BluBot?.reset();
});

Obbligatorio al logout

Su dispositivi condivisi, senza reset() l'utente successivo vede la conversazione del precedente. Invocalo sempre nella procedura di disconnessione.

destroy

Rimuove il widget dal DOM, chiude la connessione WebSocket e libera gli ascoltatori. Per riattivarlo serve una nuova chiamata a init.

Firma
BluBot.destroy(): void
Esempio — revoca del consenso
window.addEventListener('consent:revoked', () => {
  window.BluBot?.destroy();
});

isOpen

Indica se la finestra è attualmente aperta.

Firma
BluBot.isOpen(): boolean
Esempio — evita di aprire due volte
if (!window.BluBot.isOpen()) {
  window.BluBot.open();
}

on e off

Registrano e rimuovono gli ascoltatori degli eventi. L'elenco completo è in Eventi.

Firma
BluBot.on(event: string, handler: (payload: unknown) => void): void
BluBot.off(event: string, handler: (payload: unknown) => void): void

Parametri

ParametroTipoObblig.DefaultDescrizione
eventstringSì—Nome dell evento, ad esempio message:sent oppure booking:completed.
handlerfunctionSì—Funzione richiamata con il payload dell evento. Per rimuoverla con off deve essere lo stesso riferimento passato a on.
Esempio
function onBooking(payload) {
  console.log('Prenotazione completata', payload.bookingId);
}

window.BluBot.on('booking:completed', onBooking);

window.BluBot.off('booking:completed', onBooking);

Esempio completo di integrazione

Integrazione tipica su un sito con area riservata: identificazione verificata dell'utente, apertura da un pulsante personalizzato, tracciamento e pulizia al logout.

Integrazione completa
<script
  src="https://static.blupantheon.com/blubot/v1/bpblubot.umd.js"
  data-project-key="bp_proj_7f3a9c21"
  data-auto-init="false"
  defer
></script>

<script>
  (function () {
    var CONFIG = {
      projectKey: 'bp_proj_7f3a9c21',
      locale: document.documentElement.lang || 'it',
      theme: 'auto',
      position: 'bottom-right',
      offsetY: 88,
      title: 'Assistenza Acme',
      subtitle: 'Rispondiamo in pochi secondi'
    };

    window.addEventListener('blubot:loaded', function () {
      window.BluBot.init(CONFIG);
    });

    window.addEventListener('blubot:ready', function () {
      identificaUtente();
      collegaLauncher();
      collegaTracciamento();
    });

    function identificaUtente() {
      fetch('/api/blubot/identity', { credentials: 'include' })
        .then(function (res) {
          if (!res.ok) return null;
          return res.json();
        })
        .then(function (identity) {
          if (!identity) return;
          window.BluBot.setUser({
            id: identity.id,
            name: identity.name,
            email: identity.email,
            signature: identity.signature,
            metadata: { piano: identity.plan, cliente_dal: identity.since }
          });
        })
        .catch(function () {
          // utente anonimo: nessuna identificazione
        });
    }

    function collegaLauncher() {
      var button = document.getElementById('apri-assistenza');
      if (!button) return;
      button.addEventListener('click', function () {
        window.BluBot.open();
        window.BluBot.sendMessage('Ho bisogno di assistenza sul mio ordine.', {
          metadata: { origine: 'area-riservata' }
        });
      });
    }

    function collegaTracciamento() {
      window.BluBot.on('message:sent', function () {
        window.dataLayer = window.dataLayer || [];
        window.dataLayer.push({ event: 'blubot_message_sent' });
      });

      window.BluBot.on('handover:requested', function (payload) {
        window.dataLayer.push({ event: 'blubot_handover', motivo: payload.reason });
      });
    }

    document.addEventListener('acme:logout', function () {
      window.BluBot.reset();
    });
  })();
</script>

L'endpoint /api/blubot/identity deve essere implementato sul tuo server: verifica la sessione, calcola la firma HMAC dell'identificativo con il segreto e restituisce il risultato. Non generare mai la firma nel browser.

Server — calcolo della firma (Node.js)
import { createHmac } from 'node:crypto';

export function signUserId(userId) {
  return createHmac('sha256', process.env.BLUBOT_USER_SIGNING_SECRET)
    .update(userId)
    .digest('hex');
}

Definizioni TypeScript

types/blubot.d.ts
export interface BluBotUser {
  id: string;
  name?: string;
  email?: string;
  phone?: string;
  metadata?: Record<string, string | number | boolean>;
  signature?: string;
}

export interface BluBotApi {
  version: string;
  init(config: Record<string, unknown>): void;
  open(): void;
  close(): void;
  toggle(): void;
  sendMessage(text: string, options?: { hidden?: boolean; metadata?: Record<string, unknown> }): Promise<void>;
  setUser(user: BluBotUser): void;
  setLocale(locale: string): void;
  reset(): void;
  destroy(): void;
  isOpen(): boolean;
  on(event: string, handler: (payload: never) => void): void;
  off(event: string, handler: (payload: never) => void): void;
}

declare global {
  interface Window {
    BluBot?: BluBotApi;
  }
}

Passi successivi

Auf dieser Seite