Webhooks

Se o canal de mensagens que você deseja usar não for suportado por padrão no Oracle Digital Assistant, você poderá usar um webhook para integrar manualmente esse canal.

Para criar um canal do webhook, é necessário:
  • Um servidor de mensagens HTTP acessível publicamente que retransmita mensagens entre o dispositivo do usuário e seu assistente digital (ou habilidade) usando um webhook.

    Você implementa esse webhook com:

    • Uma chamada POST que permita ao servidor receber mensagens do assistente digital.

    • Uma chamada POST que permita ao servidor enviar mensagens para o assistente digital.

  • O URI da chamada do webhook que recebe as mensagens do assistente digital (de modo que o assistente digital saiba para onde enviar as mensagens).

  • O URL do Webhook que é gerado para o assistente digital depois que você preenche a caixa de diálogo Criar Canal (para que o servidor de mensagens possa acessar o assistente digital).

Para montar essas partes em um webhook:
  1. Configure o servidor.

  2. Para receber mensagens do assistente digital, publique a chamada POST no servidor.

  3. Na caixa de diálogo Criar Canal, informe um nome e depois:
    • Escolha Webhook como tipo de canal.

    • Defina a Versão da Plataforma como 1.1 (Modelo de Conversa).

    • Registre o servidor como destinatário das mensagens do assistente digital, informando o URI para essa chamada POST no campo URI do Webhook de Saída.

    • Se necessário, informe a expiração da sessão e ative Canal Ativado.


    A seguir, descrição de create-webhook-channel.png
    Descrição da ilustração create-webhook-channel.png
  4. Clique em Criar.

    O Digital Assistant gera o URL do webhook para o assistente digital e a Chave Secreta para criptografar mensagens. Mantenha o URL do webhook à mão porque ele é o ponteiro que o servidor de mensagens precisa para enviar mensagens de volta ao assistente digital.
    A seguir, descrição do webhook-channel-config.png
    Descrição da ilustração webhook-channel-config.png

  5. No servidor, publique a segunda API POST, que envia mensagens para o assistente digital usando o URL do webhook.

  6. Ative a opção Canal Ativado.

Você pode usar o Node.js SDK do Digital Assistant para configurar o envio de mensagens de/para seu assistente digital.

Mensagens de Entrada

A biblioteca WebhookClient no Node.js SDK do Oracle Digital Assistant simplifica a configuração de envio e recebimento de mensagens nos canais do Webhook. Se não estiver usando o SDK, aqui está o que você precisa saber sobre a criação de mensagens de entrada.

A chamada para enviar mensagens ao assistente digital (ou habilidade) deve ter:

  1. Um cabeçalho X-Hub-Signature contendo o valor SHA256 do payload. A chamada inclui funções que criam esse hash usando a Chave Secreta como chave.
    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 são variáveis de ambiente que você define no servidor de Nó. O uso dessas variáveis de ambiente permite que você evite informações sigilosas de codificação diretamente no webhook

  2. Um objeto JSON com as propriedades userId, profile e messagePayload:
    {
     "userId": "33c0bcBc8e-378c-4496-bc2a-b2b9647de2317",
     "profile": {
        "firstName": "Bob",
        "lastName": "Franklin",
        "age": 45
       },
     "messagePayload": {....}
    }
    Propriedade Descrição Tipo 0brigatório?
    userId Um identificador exclusivo do usuário. Esse ID é específico do chamador. String Sim
    profile Propriedades que representam o usuário, como firstName e LastName. Objeto JSON Não
    messagePayload A propriedade messagePayload pode ser text, postback, attachment e location. Objeto JSON Sim
    Observação

    Se sua habilidade ou assistente digital precisar detectar o idioma do usuário, certifique-se de que profile.locale e profile.languageTag estejam definidos como nulos nas mensagens do Webhook.

Payloads de Exemplo: Mensagens de Entrada

Tipo de mensagem Payload de Exemplo
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
  }
}

Mensagens de Saída

A biblioteca WebhookClient no Node.js SDK do Oracle Digital Assistant simplifica a configuração de envio e recebimento de mensagens nos canais do Webhook. Se não estiver usando o SDK, aqui está o que você precisa saber sobre a criação de mensagens de saída.

Publique as chamadas no formato JSON que o Digital Assistant espera, com o cabeçalho de autorização.

A chamada das mensagens de saída do assistente digital incluem:
  1. Um cabeçalho X-Hub-Signature contendo o valor SHA256 do payload, calculado usando a Chave Secreta como chave.
    Observação

    O Digital Assistant usa o cabeçalho X-Hub-Signature para permitir que o destinatário autentique seu assistente digital como remetente e valide a integridade do payload.
  2. Um payload JSON que contém o userID, um identificador exclusivo que é especificado pela mensagem de entrada, o type, que pode ser text, attachment e card. Conforme mostrado nos exemplos a seguir, os tipos de resposta text e card podem ter ações associadas. Qualquer um dos tipos de resposta também pode incluir ações globais.
    Tipo de Resposta Payload de Exemplo
    text
    {
     "userId":"22343248763458761287
     "messagePayload": {
        "type": "text",
        "text": "Hello, how are you?"
         }
    }
    O trecho de código a seguir mostra uma resposta text com ações:
    {
     "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 O tipo de resposta de anexo pode ser uma imagem, um arquivo de áudio ou um vídeo:
    
    ...
    {
      "type": "attachment",
      "attachment": {
        "type": "video",
        "url": "https://www.youtube.com/watch?v=CMNry4PE93Y"
      }
    }