实践:使用 Google Workspace 和 Dialogflow 创建电视指南 Google Chat

1. 简介

现在,您已在上一个 Codelab 中为 TV Guide 构建了一个 Dialogflow 聊天机器人。接下来,我们将向您展示如何将其扩展到 Google Chat。您将学习如何为此平台构建动态的互动卡片,以及如何实现多种集成。

构建内容

我们将构建一个 Dialogflow 聊天机器人,它能够在您的 Google Workspace 网域中提供可自定义的回复作为回复。

2e16770ceed20cb2

学习内容

  • 如何部署和配置 Google Chat 应用
  • 如何在 Google Chat 中制作显示卡片
  • 如何在 Dialogflow fulfillment 中构建自定义载荷

所需条件

  • 完成此系列教程中的第一个 Codelab(共 2 个部分)。
  • 用于登录 Dialogflow 控制台的网络浏览器和电子邮件地址
  • 您的 Google Workspace 网域已启用聊天功能

2. 启用并配置 Google Chat

我们将从您在之前的 Codelab 中创建的 Dialogflow 代理开始。

  1. Dialogflow 控制台中,点击 d7d792687e597dd5.png
  2. 常规标签页中,滚动到项目 ID,然后点击 Google Cloudf2bffd4fcdb84fa9.png

cb893582402e4092.png

  1. 在 Google Cloud Console 中,点击导航菜单 ☰ > API 和服务 >
  2. 搜索“Google Chat API”然后点击启用,以便在您的 Google Cloud 项目中使用该 API。
  3. 现在,我们将配置您的 Google Chat 应用,请前往 API 的配置页面。请注意,每个 GCP 项目最多只能有一个 Google Chat 应用。85794eaaaedc7eb5
  4. 您应该会看到填充配置选项的 Dialogflow 字段。
  5. 将头像网址字段更改为以下电视图片:[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. 为您的 Google Chat 应用启用私信和聊天室功能9d439f492c8b71bb

点击保存,然后退出 Cloud 控制台。

Dialogflow 集成。Google Chat 默认处于启用状态,但如果您想为多个平台提供服务,可以前往 Dialogflow 控制台中的集成页面启用它们。

63296523b678ff8d

3. 在 Google Chat 中测试

现在,您的 Google Chat 应用已配置完毕,我们来将其添加到聊天室并进行测试。打开 Google Chat 并创建测试聊天室。在该聊天室的右上角,点击下拉菜单,然后选择加人和应用

f0dd1f5e205ef8e2.png

搜索“tvguide”,然后将 Google Chat 应用添加到聊天室。

e60fa78fdd020304.png

现在,只需在聊天室中输入 @tvguide,即可与内置于 Google Chat 中的 Google Chat 应用互动。输入 @tvguide hello 进行测试。

e8399e33185c63ec.png

接下来,我们将使用 Google Chat 中的自定义设置来添加更丰富的回复。

4. 自定义 Google Chat 卡片

借助 Google Chat,您可以让应用向用户返回基本的文本响应或卡片响应,从而获得由不同的微件(包括图片、按钮等)构建更丰富的界面。现在,我们已将您的 Dialogflow 代理与 Google Chat 应用关联,您只需返回正确格式的 JSON,即可在 Google Chat 的执行方式代码中显示该 JSON。我们来看一些 JSON 示例。

基本文本响应如下所示:

{
  "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

包含 widget 的示例卡片响应如下所示:

{
  "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. 自定义载荷和聊天卡片

Dialogflow 中的自定义载荷 支持针对具体平台的富响应消息。我们将在此函数中添加 Hangouts Chat JSON 卡片,并且代理会将这些卡片返回给用户。

首先,为欢迎意图添加基本卡片。在 Dialogflow 控制台中,导航到“默认欢迎意图”并向下滚动到“响应”部分。

9624208f0d266afd.png

点击 Google Chat 并取消选择使用默认标签页中的回复作为第一个回复,然后添加回复 >自定义载荷

您将看到一个 JSON 框架。

bb064f7ec1237fd3.png

复制并粘贴以下代码。我们设置了一张带有 TextParagraph widget 的卡片。

{
  "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?"
            }
          }
        ]
      }
    ]
  }
}

点击保存,然后前往测试聊天室,看看此卡片是否已呈现。在聊天室中输入“@tvguide hello”

6941003ee06e4655

接下来,我们将在 fulfillment 代码中添加自定义载荷,以便使用代码动态生成内容。

如需详细了解卡片,请参阅邮件格式文档。在下一部分,我们将添加卡片。

6. 在 Fulfillment 中添加卡片

现在,我们将创建一个包含 widget 的卡片,用于显示电视节目列表。我们添加一个名为 getGoogleCard 的函数,用于呈现生成的商家信息。我们将使用键值和按钮微件来构建卡片响应。

将下面的函数添加到底部 index.js 文件中的代码。

/**
*  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]},
           }
       };
   }
}

现在,我们需要调用此方法,以便代理获得响应并发回给用户。在函数 channelHandler 中,将函数的内容替换为以下代码。

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);
   }
}

记下底部添加回答的代码。如果代理的请求来源被标识为此平台,我们将构建带有“hangouts”标记的 JSON 载荷。这对于在 fulfillment 中正确传回载荷非常重要。

现在,请返回到您的 Chat 聊天室进行测试。输入 @tvguide What is on MTV?。您应该会看到类似的响应。

2e16770ceed20cb2

7. 恭喜

您已使用 Dialogflow 创建了您的第一个 Google Chat 聊天机器人!

后续操作

喜欢此 Codelab?快来看看这些优秀的实验吧!