Webhook

Se il canale di messaggistica che si desidera utilizzare non è supportato per impostazione predefinita in Oracle Digital Assistant, è possibile utilizzare un webhook per integrare manualmente tale canale.

Per creare un canale webhook, è necessario quanto segue:
  • Un server di messaggistica HTTP accessibile pubblicamente che trasmette i messaggi tra il dispositivo utente e l'assistente digitale (o abilità) utilizzando un webhook.

    Implementate questo webhook con:

    • Una chiamata POST che consente al server di ricevere messaggi dall'assistente digitale.

    • Una chiamata POST che consente al server di inviare messaggi all'assistente digitale.

  • L'URI della chiamata webhook che riceve i messaggi dell'assistente digitale (in modo che l'assistente digitale sappia dove inviare i messaggi).

  • L'URL del webhook generato per l'assistente digitale dopo aver completato la finestra di dialogo Crea canale, in modo che il server dei messaggi possa accedere all'assistente digitale.

Per assemblare questi pezzi in un webhook:
  1. Impostare il server.

  2. Per ricevere messaggi dall'assistente digitale, pubblicare la chiamata POST sul server.

  3. Nella finestra di dialogo Crea canale immettere un nome, quindi effettuare le operazioni riportate di seguito.
    • Scegliere Webhook come tipo di canale.

    • Impostare Versione piattaforma su 1.1 (Modello di conversazione).

    • Registrare il server come destinatario dei messaggi dell'assistente digitale immettendo l'URI per questa chiamata POST nel campo URI webhook in uscita.

    • Se necessario, immettere la scadenza della sessione e attivare Canale abilitato.


    Descrizione di create-webhook-channel.png
    Descrizione dell'immagine create-webhook-channel.png
  4. Fare clic su Crea.

    Digital Assistant genera l'URL del webhook per l'assistente digitale e la relativa chiave segreta per la cifratura dei messaggi. Tieni a portata di mano l'URL del webhook, perché è il puntatore di cui il server di messaggistica ha bisogno per inviare messaggi al tuo assistente digitale.
    Descrizione di webhook-channel-config.png segue
    Descrizione dell'immagine webhook-channel-config.png

  5. Sul tuo server, pubblica la seconda API POST, che invia messaggi al tuo assistente digitale utilizzando l'URL del webhook.

  6. Attivare l'opzione Canale abilitato.

È possibile utilizzare l'SDK Node.js di Digital Assistant per impostare l'invio di messaggi da e verso l'assistente digitale.

Messaggi in entrata

La libreria WebhookClient nell'SDK Node.js di Oracle Digital Assistant semplifica l'impostazione dell'invio e della ricezione di messaggi nei canali Webhook. Se non si utilizza l'SDK, ecco cosa è necessario sapere sulla creazione di messaggi in entrata.

La chiamata per l'invio di messaggi al tuo assistente digitale (o abilità) deve avere:

  1. Un'intestazione X-Hub-Signature contenente il valore SHA256 del payload. La chiamata include funzioni che creano questo hash utilizzando la chiave segreta come chiave.
    const body = Buffer.from(JSON.stringify(messageToBot), 'utf8');
        const headers = {};
        headers['Content-Type'] = 'application/json; charset=utf-8';
        headers['X-Hub-Signature'] = buildSignatureHeader(body, channelSecretKey);
    
    ...
    
    function buildSignatureHeader(buf, channelSecretKey) {
        return 'sha256=' + buildSignature(buf, channelSecretKey);
    }
    
    function buildSignature(buf, channelSecretKey) {
        const hmac = crypto.createHmac('sha256', Buffer.from(channelSecretKey, 'utf8'));
        hmac.update(buf);
        return hmac.digest('hex');
    }

    BOT_WEBHOOK_URL e BOT_WEBHOOK_SECRET sono variabili di ambiente impostate sul server Node. L'uso di queste variabili di ambiente consente di evitare di codificare le informazioni riservate direttamente nel webhook

  2. Oggetto JSON con proprietà userId, profile e messagePayload:
    {
     "userId": "33c0bcBc8e-378c-4496-bc2a-b2b9647de2317",
     "profile": {
        "firstName": "Bob",
        "lastName": "Franklin",
        "age": 45
       },
     "messagePayload": {....}
    }
    Proprietà descrizione; Digita Richiesto?
    userId Identificativo univoco dell'utente. Questo ID è specifico per il chiamante. Stringa
    profile Proprietà che rappresentano l'utente, ad esempio firstName e LastName. Oggetto JSON No
    messagePayload Il valore messagePayload può essere text, postback, attachment e location. Oggetto JSON
    Nota

    Se lo skill o l'assistente digitale deve rilevare la lingua utente, assicurarsi che profile.locale e profile.languageTag siano impostati su null nei messaggi del webhook.

Payload di esempio: messaggi in entrata

Tipo di messaggio Payload di esempio
text
{
    "type": "text",
    "text": "hello, world!"
}
postback
{
  "type": "postback",
  "postback": {
    "state": "orderPizza",
    "action": "deliverPizza",
    "variables": {
      "pizzaSize": "Large",
      "pizzaCrust": "Thin",
      "pizzaType": "Hawaiian"
    }
  }
}
attachment
{
  "type": "attachment",
  "attachment": {
    "type": "image",
    "url": "https://image.freepik.com/free-icon/attachment-tool-ios-7-interface-symbol_318-35539.jpg"
  }
}
location
{
  "type": "location",
  "location": {
    "longitude": -122.265987,
    "latitude": 37.529818
  }
}

Messaggi in uscita

La libreria WebhookClient nell'SDK Node.js di Oracle Digital Assistant semplifica l'impostazione dell'invio e della ricezione di messaggi nei canali Webhook. Se non si utilizza l'SDK, ecco cosa è necessario sapere sulla creazione di messaggi in uscita.

È necessario pubblicare le chiamate nel formato JSON previsto da Digital Assistant, insieme all'intestazione di autorizzazione.

La chiamata per i messaggi in uscita dell'assistente digitale include:
  1. Un'intestazione X-Hub-Signature contenente il valore SHA256 del payload, calcolata utilizzando la chiave segreta come chiave.
    Nota

    Digital Assistant utilizza l'intestazione X-Hub-Signature per consentire al destinatario di autenticare l'assistente digitale come mittente e convalidare l'integrità del payload.
  2. Un payload JSON contenente userID, un identificativo univoco specificato dal messaggio in entrata, type, che può essere text,attachment e card. Come illustrato negli esempi riportati di seguito, ai tipi di risposta text e card possono essere associate azioni. Qualsiasi tipo di risposta può includere anche azioni globali.
    Tipo di risposta Payload di esempio
    text
    {
     "userId":"22343248763458761287
     "messagePayload": {
        "type": "text",
        "text": "Hello, how are you?"
         }
    }
    Il seguente snippet mostra una risposta text con azioni:
    {
     "userId":"22343248763458761287
     "messagePayload": {
        "type": "text",
        "text": "What do you want to do?",
        "actions": [
          {
            "type": "postback",
            "label": "Order Pizza",
            "postback": {
              "state": "askAction",
              "action": "orderPizza"
            }
          },
          {
            "type": "postback",
            "label": "Cancel A Previous Order",
            "postback": {
              "state": "askAction",
              "action": "cancelOrder"
          }
        ]
      }
    }
    card
    
    ...
    {
     "type": "card",
      "layout": "horiztonal",
      "cards": [
        {
          "title": "Hawaiian Pizza",
          "description": "Ham and pineapple on thin crust",
          "actions": [
            {
              "type": "postback",
              "label": "Order Small",
              "postback": {
                "state": "GetOrder",
                "variables": {
                  "pizzaType": "hawaiian",
                  "pizzaCrust": "thin",
                  "pizzaSize": "small"
                }
              }
            },
            {
              "type": "postback",
              "label": "Order Large",
              "postback": {
                "state": "GetOrder",
                "variables": {
                  "pizzaType": "hawaiian",
                  "pizzaCrust": "thin",
                  "pizzaSize": "large"
                }
              }
            }
          ]
        },
        {
          "title": "Cheese Pizza",
          "description": "Cheese pizza (i.e. pizza with NO toppings) on thick crust",
          "actions": [
            {
              "type": "postback",
              "label": "Order Small",
              "postback": {
                "state": "GetOrder",
                "variables": {
                  "pizzaType": "cheese",
                  "pizzaCrust": "thick",
                  "pizzaSize": "small"
                }
              }
            },
            {
              "type": "postback",
              "label": "Order Large",
              "postback": {
                "state": "GetOrder",
                "variables": {
                  "pizzaType": "cheese",
                  "pizzaCrust": "thick",
                  "pizzaSize": "large"
                }
              }
            }
          ]
        }
      ],
      "globalActions": [
        {
          "type": "call",
          "label": "Call for Help",
          "phoneNumber": "123456789"
        }
      ]
    }
    attachment Il tipo di risposta allegato può essere un'immagine, un file audio o un video:
    
    ...
    {
      "type": "attachment",
      "attachment": {
        "type": "video",
        "url": "https://www.youtube.com/watch?v=CMNry4PE93Y"
      }
    }