Prática: como criar um guia para TV do Google Chat com o Google Workspace e o Dialogflow

1. Introdução

Agora que você criou um bot de bate-papo do Dialogflow para um guia de TV no codelab anterior, vamos mostrar como estendê-lo para o Google Chat. Você aprenderá a criar cards dinâmicos e interativos para essa plataforma e a ter várias integrações.

O que você criará

Vamos criar um chatbot do Dialogflow capaz de responder no seu domínio do Google Workspace com respostas personalizáveis.

2e16770ceed20cb2.png

O que você vai aprender

  • Como implantar e configurar um app do Google Chat
  • Como criar cards de exibição no Google Chat
  • Como criar payloads personalizados no fulfillment do Dialogflow

O que é necessário

  • Conclua o primeiro codelab desta série de duas partes.
  • Um navegador da Web e um endereço de e-mail para fazer login no console do Dialogflow
  • Chat ativado no seu domínio do Google Workspace

2. Ativar e configurar o Google Chat

Vamos começar com o agente do Dialogflow que você criou nos codelabs anteriores.

  1. No Console do Dialogflow, clique em d7d792687e597dd5.png.
  2. Na guia Geral, role até ID do projeto e clique em Google Cloud f2bffd4fcdb84fa9.png.

cb893582402e4092.png

  1. No console do Google Cloud, clique em Menu de navegação ☰ > APIs e Serviços > Biblioteca.
  2. Pesquise "API Google Chat" Depois clique em Ativar para usar a API no projeto do Google Cloud.
  3. Para configurar o app Google Chat, acesse a página Configuração da API. Cada projeto do GCP pode ter no máximo um app do Google Chat. 85794eaaaedc7eb5.png
  4. Você verá os campos do Dialogflow preenchendo as opções de configuração.
  5. Mude o campo de URL do avatar para esta imagem de TV: [https://fonts.gstatic.com/s/i/googlematerialicons/tv/v5/black-48dp/1x/gm_tv_black_48dp.png](https://fonts.gstatic.com/s/i/googlematerialicons/tv/v5/black-48dp/1x/gm_tv_black_48dp.png)
  6. Ative o app Google Chat nas mensagens diretas e nos espaços 9d439f492c8b71bb.png

Clique em Salvar e saia do Console do Cloud.

Além das integrações com o Dialogflow. O Google Chat é ativado por padrão, mas se você quiser atender a várias plataformas, acesse a página Integrações no Console do Dialogflow para ativá-las.

63296523b678ff8d.png

3. Testar no Google Chat

Agora que o app do Google Chat está configurado, adicione-o a um espaço do Chat e faça um teste. Abra o Google Chat e crie um espaço de teste. No canto superior direito do espaço, clique no menu suspenso e selecione Adicionar pessoas e apps.

f0dd1f5e205ef8e2.png

Pesquise tvguide e adicione o app Google Chat ao espaço.

e60fa78fdd020304.png

Agora você pode interagir com o app Google Chat que já foi integrado ao Google Chat. Basta digitar @tvguide no espaço. Digite @tvguide hello para testar.

e8399e33185c63ec.png

Em seguida, vamos usar as personalizações do Google Chat para adicionar respostas mais completas.

4. Cards personalizados do Google Chat

Com o Google Chat, seu app pode retornar ao usuário uma resposta de texto básica ou uma resposta em cartão, o que permite uma interface mais rica criada por diferentes widgets, incluindo imagens, botões etc. Agora que conectamos seu agente do Dialogflow a um app do Google Chat, basta retornar o JSON no formato correto para exibição no Google Chat em seu código de fulfillment. Vamos conferir alguns exemplos de JSON.

A resposta de texto básica é semelhante a esta:

{
  "text": "Welcome, I am the TV Guide agent. I can tell you what is currently playing on a TV channel. For example, you can ask me: What is on MTV?"
}

e8399e33185c63ec.png

Um exemplo de resposta em card com widgets é semelhante a este:

{
  "cards": [
    {
      "sections": [
        {
          "widgets": [
            {
              "image": { "imageUrl": "https://freesvg.org/img/fttv.png" }
            },
            {
              "buttons": [
                {
                  "textButton": {
                    "text": "Check Listings",
                    "onClick": {
                      "openLink": {
                        "url": "https://tvlistings.com/..."
                      }
                    }
                  }
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

c390a0cb75486fe0.png

5. Payloads e cards de chat personalizados

Os payloads personalizados do Dialogflow permitem mensagens de resposta avançada específicas da plataforma. É aqui que adicionaremos os cards JSON do Chat onde eles serão exibidos para o usuário pelo agente.

Para começar, vamos adicionar um card básico para a intent de boas-vindas. No console do Dialogflow, navegue até a intent de boas-vindas padrão e role para baixo até a seção de respostas.

9624208f0d266afd.png

Clique em Google Chat e desmarque Use answers from the DEFAULT tab as the first answers (Usar respostas da guia PADRÃO como as primeiras respostas) e depois ADICIONAR RESPOSTAS > Payload personalizado.

Você vai encontrar um esqueleto de JSON.

bb064f7ec1237fd3.png

Copie e cole o seguinte código abaixo. Configuramos um card com um widget TextParagraph.

{
  "hangouts": {
    "header": {
      "title": "TV Guide App"
    },
    "sections": [
      {
        "widgets": [
          {
            "textParagraph": {
              "text": "Welcome, I am the TV Guide agent. I can tell you what is currently playing on a TV channel. For example, you can ask me: What is on MTV?"
            }
          }
        ]
      }
    ]
  }
}

Clique em Save e vamos acessar o espaço de teste do chat para conferir a renderização do card. No espaço do Chat, digite "@tvguide hello".

6941003ee06e4655.png

Em seguida, adicionaremos um payload personalizado no código de fulfillment para que possamos gerar dinamicamente o conteúdo com nosso código.

Para saber mais sobre os cards, consulte a documentação sobre o formato de mensagens. Na próxima seção, vamos adicionar cards.

6. Como adicionar um cartão ao fulfillment

Agora, criaremos um card com widgets para mostrar listagens de TV. Adicione uma função chamada getGoogleCard para renderizar as informações da ficha da empresa resultantes. Vamos usar os widgets KeyValue e de botão para construir a resposta do card.

Adicione a função abaixo ao código em index.js na parte de baixo.

/**
*  Return a Google Chat Card in JSON
* @param {Object} JSON tv results
*/
var getGoogleCard = function(tvresults) {
   console.log('In Google Chat card, tv results: ' + JSON.stringify(tvresults));

   if(tvresults['Listings'][0]) {
       let channelName = tvresults['Name'];
       let currentlyPlayingTime = getShowTime(tvresults['Listings'][0]['Time']);
       let laterPlayingTime = getShowTime(tvresults['Listings'][1]['Time']);

       const cardHeader = {
           title: channelName + ' Shows',
       };

       const currentWidget = {
           keyValue: {
               content: `${tvresults['Listings'][0]['Title']}`,
               bottomLabel: `${currentlyPlayingTime}`,
           }
       };

       const laterWidget = {
           keyValue: {
               content: `${tvresults['Listings'][1]['Title']}`,
               bottomLabel: `${laterPlayingTime}`
           }
       };

       const buttonWidget = {
           buttons: [
             {
               textButton: {
                 text: 'View Full Listing',
                 onClick: {
                   openLink: {
                     url: TVGUIDE_WEBSERVICE + '/' + tvresults['ID'],
                   },
                 },
               },
             },
           ],
         };

       return {
           'hangouts': {
               header: cardHeader,
               sections: [{widgets: [currentWidget, laterWidget, buttonWidget]}],
           }
       };
   } else {
       const errorWidget = {
           keyValue: {
               content: 'No listings found',
               bottomLabel: 'Please try again.'
           }
       };
       return {
           'hangouts': {
               'sections': {widgets: [errorWidget]},
           }
       };
   }
}

Agora precisamos chamar esse método para que o agente receba a resposta e envie de volta ao usuário. Na função channelHandler, substitua o conteúdo da função pelo código abaixo.

function channelHandler(agent) {
   console.log('in channel handler');
   var jsonResponse = `{"ID":10,"Listings":[{"Title":"Catfish Marathon","Date":"2018-07-13","Time":"11:00:00"},{"Title":"Videoclips","Date":"2018-07-13","Time":"12:00:00"},{"Title":"Pimp my ride","Date":"2018-07-13","Time":"12:30:00"},{"Title":"Jersey Shore","Date":"2018-07-13","Time":"13:00:00"},{"Title":"Jersey Shore","Date":"2018-07-13","Time":"13:30:00"},{"Title":"Daria","Date":"2018-07-13","Time":"13:45:00"},{"Title":"The Real World","Date":"2018-07-13","Time":"14:00:00"},{"Title":"The Osbournes","Date":"2018-07-13","Time":"15:00:00"},{"Title":"Teenwolf","Date":"2018-07-13","Time":"16:00:00"},{"Title":"MTV Unplugged","Date":"2018-07-13","Time":"16:30:00"},{"Title":"Rupauls Drag Race","Date":"2018-07-13","Time":"17:30:00"},{"Title":"Ridiculousness","Date":"2018-07-13","Time":"18:00:00"},{"Title":"Punk'd","Date":"2018-07-13","Time":"19:00:00"},{"Title":"Jersey Shore","Date":"2018-07-13","Time":"20:00:00"},{"Title":"MTV Awards","Date":"2018-07-13","Time":"20:30:00"},{"Title":"Beavis & Butthead","Date":"2018-07-13","Time":"22:00:00"}],"Name":"MTV"}`;
   var results = JSON.parse(jsonResponse);
   var listItems = {};
   textResults = getListings(results);


   for (var i = 0; i < results['Listings'].length; i++) {
       listItems[`SELECT_${i}`] = {
           title: `${getShowTime(results['Listings'][i]['Time'])} - ${results['Listings'][i]['Title']}`,
           description: `Channel: ${results['Name']}`
       }
   }

   if (agent.requestSource === 'hangouts') {
        const cardJSON = getGoogleCard(results);
        const payload = new Payload(
           'hangouts',
           cardJSON,
           {rawPayload: true, sendAsMessage: true},
       );
       agent.add(payload);
   } else {
       agent.add(textResults);
   }
}

Anote o código na parte de baixo onde a resposta é adicionada. Se a origem da solicitação do agente for identificada como esta, vamos construir o payload JSON com a tag "hangouts". Isso é importante para retornar corretamente o payload no fulfillment.

Volte ao espaço do Chat e faça o teste. Digite @tvguide What is on MTV?. Você verá uma resposta semelhante.

2e16770ceed20cb2.png

7. Parabéns

Você criou seu primeiro bot do Google Chat com o Dialogflow!

Qual é a próxima etapa?

Gostou do codelab? Confira esses laboratórios incríveis!