Ćwiczenie: tworzenie działania w przewodniku po TV dla Asystenta Google przy użyciu Dialogflow i Actions on Google

1. Wprowadzenie

Oglądasz telewizję, ale nie możesz znaleźć pilota albo nie chcesz sprawdzać poszczególnych kanałów telewizyjnych, aby sprawdzić, czy jest w nich coś fajnego. Zapytaj Asystenta Google, co jest na telewizorze. W tym module utworzysz proste działanie przy użyciu Dialogflow i dowiesz się, jak zintegrować tę usługę z Asystentem Google.

Ćwiczenia zostały ułożone w kolejności wykonywania typowych zadań przez programistę w chmurze:

  1. Tworzenie agenta Dialogflow w wersji 2
  2. Utwórz encję niestandardową
  3. Utwórz intencje
  4. Skonfiguruj webhooka z funkcjami Firebase
  5. Testowanie czatbota
  6. Włączanie integracji z Asystentem Google

Co utworzysz

Stworzymy agenta interaktywnego czatbota przewodnika telewizyjnego dla Asystenta Google. Możesz zapytać przewodnika telewizyjnego, co jest obecnie emitowane na konkretnym kanale. Na przykład: „Co jest w MTV?” W Przewodniku po programach telewizyjnych możesz sprawdzić, co jest obecnie odtwarzane i co będzie za chwilę.

Czego się nauczysz

  • Jak utworzyć czatbota w Dialogflow 2
  • Jak tworzyć encje niestandardowe w Dialogflow
  • Jak utworzyć linearną rozmowę przy użyciu Dialogflow
  • Jak skonfigurować realizacje webhooków za pomocą funkcji Dialogflow i Firebase
  • Jak przenieść aplikację do Asystenta Google za pomocą Actions on Google

Wymagania wstępne

  • Aby utworzyć agenta Dialogflow, będziesz potrzebować tożsamości Google lub adresu Gmail.
  • Podstawowa znajomość języka JavaScript nie jest wymagana, ale może być przydatna, gdy zechcesz zmienić kod realizacji webhooka.

2. Przygotowanie

Włączanie Aktywności w internecie w przeglądarce

  1. Kliknij: http://myaccount.google.com/activitycontrols

  1. Upewnij się, że Aktywność w aplikacjach jest włączona:

bf8d16b828d6f79a.png

Tworzenie agenta Dialogflow

  1. Otwórz: https://console.dialogflow.com

  1. Na lewym pasku, tuż pod logo, kliknij „Create New Agent” (Utwórz nowego agenta). Jeśli masz istniejących agentów, najpierw kliknij menu.

1d7c2b56a1ab95b8.png

  1. Podaj nazwę agenta: your-name-tvguide (użyj własnej nazwy)

35237b5c5c539ecc.png

  1. Jako język domyślny wybierz English – en.
  2. Jako domyślną strefę czasową wybierz najbliższą strefę czasową.
  3. Kliknij Utwórz.

Konfigurowanie Dialogflow

  1. W menu po lewej stronie kliknij ikonę koła zębatego obok nazwy projektu.

1d7c2b56a1ab95b8.png

  1. Wpisz następujący opis agenta: Mój program telewizyjny

26f262d359c49075.png

  1. Przewiń w dół do sekcji Ustawienia logów i odwróć oba przełączniki do rejestrowania interakcji Dialogflow oraz do rejestrowania wszystkich interakcji w usłudze Google Cloud Stackdriver. Będzie nam ona potrzebna później na wypadek, gdyby trzeba było debugować to działanie.

e80c17acc3cce993.png

  1. Kliknij Zapisz.

Konfigurowanie Actions on Google

  1. Kliknij link Asystent Google w panelu po prawej stronie w sekcji Zobacz, jak działa Asystent Google.

5a4940338fc351e3.png

Otworzy się strona http://console.actions.google.com.

Jeśli dopiero zaczynasz korzystać z Actions on Google, musisz najpierw wypełnić ten formularz:

3fd4e594fa169072.png

  1. Spróbuj otworzyć swoje działanie w symulatorze**, klikając nazwę projektu.**
  2. Kliknij Przetestuj na pasku menu.

6adb83ffb7adeb78.png

  1. Upewnij się, że symulator jest ustawiony na English, i kliknij Porozmawiaj z moją aplikacją testową.

Akcja wyświetli się z podstawową domyślną intencją Dialogflow. Oznacza to, że konfiguracja integracji z aplikacją Action on Google zadziałała.

3. Jednostki niestandardowe

Encje to obiekty, wobec których aplikacja lub urządzenie podejmuje działania. Potraktuj go jako parametry / zmienne. W przewodniku telewizyjnym zapytamy: „Co jest w MTV”. MTV to jednostka i zmienna. Mogę też poprosić o inne kanały, na przykład: „National Location” czy „Comedy Central”. Zebrana encja zostanie użyta jako parametr w żądaniu wysyłanym do usługi internetowej interfejsu TV Guide API.

Więcej informacji o encjach Dialogflow

Tworzenie elementu kanału

  1. W konsoli Dialogflow kliknij pozycję menu Encje.
  2. Kliknij Utwórz encję.
  3. Nazwa jednostki: channel (pamiętaj, aby była ona wpisana małymi literami)
  4. Podaj nazwę kanału. Niektóre kanały wymagają synonimu, na wypadek gdyby Asystent Google zrozumieł coś innego. Podczas pisania możesz korzystać z klawiszy Tab i Enter. Podaj numer kanału jako wartość referencyjną. A nazwy kanałów to synonimy, na przykład:
  • 1 - 1, Net 1, Net Station 1

ee4e4955aa77232d.png

5**.** Przełącz się na tryb **edycji nieprzetworzonej**, klikając przycisk menu obok niebieskiego przycisku zapisywania.

e294b49b123e034f.png

  1. Kopiuj & wklej inne elementy w formacie CSV:
"2","2","Net 2, Net Station 2"
"3","3","Net 3, Net Station 3"
"4","4","RTL 4"
"5","5","Movie Channel"
"6","6","Sports Channel"
"7","7","Comedy Central"
"8","8","Cartoon Network"
"9","9","National Geographic"
"10","10","MTV"

ed78514afd5badef.png

  1. Kliknij Zapisz.

4. Przeznaczenie

Dialogflow używa intencji, aby kategoryzować zamiary użytkownika. Intencje zawierają wyrażenia szkoleniowe, które są przykładami tego, co użytkownik może powiedzieć do agenta. Na przykład użytkownik, który chce wiedzieć, co jest dziś w telewizji, może zapytać: „Co jest dziś w telewizji?”, „Co teraz odtwarzam?” lub powiedz po prostu „Program telewizyjny”.

Gdy użytkownik napisze lub powie coś (nazywanego wyrażeniem użytkownika), Dialogflow dopasowuje wyrażenie użytkownika do najlepszej intencji agenta. Dopasowanie intencji to tzw. klasyfikacja intencji.

Więcej informacji o intencjach Dialogflow

Zmiana domyślnej intencji powitalnej

Gdy utworzysz nowego agenta Dialogflow, automatycznie zostaną utworzone 2 domyślne intencje. Domyślna intencja powitalna to pierwszy proces, który pojawia się po rozpoczęciu rozmowy z agentem. Domyślna intencja kreacji zastępczej to proces, który pojawia się, gdy agent nie jest w stanie Cię zrozumieć lub nie może dopasować intencji do Twojej wypowiedzi.

  1. Kliknij Domyślna intencja powitalna.

W przypadku Asystenta Google rozpocznie się on automatycznie od domyślnej intencji powitalnej. Dzieje się tak, ponieważ Dialogflow nasłuchuje wydarzenia powitalnego. Możesz też wywołać intencję, wypowiadając jedno z wpisanych wyrażeń na potrzeby trenowania.

6beee64e8910b85d.png

Oto wiadomość powitalna dla domyślnej intencji powitalnej:

Użytkownik

Przedstawiciel

„OK Google, porozmawiaj z Twoim-name-tvguide”.

„Cześć, jestem przedstawicielem programu telewizyjnego. Mogę Ci powiedzieć, co jest obecnie odtwarzane na kanale w telewizji. Możesz na przykład zapytać: „Co jest w MTV”.

  1. Przewiń w dół do sekcji Odpowiedzi.
  2. Usuń wszystkie odpowiedzi tekstowe.
  3. Utwórz jedną nową odpowiedź tekstową zawierającą to powitanie:

Welcome, I am the TV Guide agent. I can tell you what's currently playing on a TV channel. For example, you can ask me: What's on MTV?

84a1110a7f7edba2.png

  1. Kliknij Zapisz.

Tworzenie tymczasowej intencji testowej

Utworzymy tymczasową intencję testową, co pozwoli nam przetestować webhooka później.

  1. Ponownie kliknij pozycję menu Intents (Intencje).
  2. Kliknij Create Intent (Utwórz intencję).
  3. Wpisz nazwę intencji: Test Intent (pamiętaj, aby użyć wielkiego T i wielkiego I. Jeśli intencja zostanie przeliterowana inaczej, usługa backendu nie będzie działać.

925e02caa4de6b99.png

  1. Kliknij Dodaj wyrażenia na potrzeby trenowania.
  • Test my agent
  • Test intent

2e44ddb2fae3c841.png

  1. Kliknij Realizacja > > Włącz realizację

7eb73ba04d76140e.png

Tym razem nie kodujemy na stałe odpowiedzi. Odpowiedź będzie pochodzić z funkcji w Cloud Functions.

  1. Przesuń przełącznik Włącz wywołanie webhooka dla tej intencji.

748a82d9b4d7d253.png

  1. Kliknij Zapisz.

Tworzenie intencji kanału

Intencje związane z kanałem będą zawierać tę część rozmowy:

Użytkownik

Przedstawiciel

„Co leci w Comedy Central?”

„„Obecnie w platformie Comedy Central od 18:00 film Simpsons. Potem o 19:00 rozpocznie się „Głowa rodziny”.

  1. Ponownie kliknij pozycję menu Intents (Intencje).
  2. Kliknij Create Intent (Utwórz intencję).
  3. Wpisz nazwę intencji: Channel Intent (pamiętaj, aby użyć wielkiego T i wielkiego I. Jeśli intencja zostanie przeliterowana inaczej, usługa backendu nie będzie działać.
  4. Kliknij Add TrainingPhrase (Dodaj wyrażenia na potrzeby trenowania) i dodaj:
  • What's on MTV?
  • What's playing on Comedy Central?
  • What show will start at 8 PM on National Geographic?
  • What is currently on TV?
  • What is airing now.
  • Anything airing on Net Station 1 right now?
  • What can I watch at 7 PM?
  • What's on channel MTV?
  • What's on TV?
  • Please give me the tv guide.
  • Tell me what is on television.
  • What's on Comedy Central from 10 AM?
  • What will be on tv at noon?
  • Anything on National Geographic?
  • TV Guide

6eee02db02831397.png

  1. Przewiń do sekcji Działanie i parametry.

b7e917026760218a.png

Zwróć uwagę na atrybuty @channel i Encje @sys.time są znane w Dialogflow. Później w webhooku nazwa i wartość parametru zostaną przesłane do Twojej usługi internetowej. Na przykład:

channel=8

time=2020-01-29T19:00:00+01:00

  1. Oznacz kanał jako wymagany

Podczas rozmowy z przedstawicielem programu TV musisz podać nazwę parametru boksu channel. Jeśli na początku rozmowy nie wspomniano o nazwie kanału, Dialogflow poprosi o dalsze pytanie, dopóki nie wypełnią wszystkich przedziałów parametrów. 6f36973fd789c182.png

Jako prompt wpisz:

  • For which TV channel do you want to hear the tv guide information?
  • In which TV channel are you interested?

cdb5601ead9423f8.png

  1. Nie ustawiaj parametru czasu jako wymaganego.

Godzina jest opcjonalna. Jeśli nie podasz czasu, usługa internetowa zwróci aktualną godzinę.

  1. Kliknij Fulfillment (Realizacja).

Tym razem nie kodujemy na stałe odpowiedzi. Odpowiedź będzie pochodzić z funkcji w Cloud Functions. Zmień więc przełącznik Włącz wywołanie webhooka dla tej intencji.

  1. Kliknij Zapisz.

5. Realizacja webhooka

Jeśli agent potrzebuje więcej niż odpowiedzi intencji statycznej, musisz połączyć z nim swoją usługę internetową za pomocą funkcji fulfillment. Połączenie usługi sieciowej umożliwia wykonywanie działań na podstawie wyrażeń użytkownika i wysyłanie dynamicznych odpowiedzi do użytkownika. Jeśli na przykład użytkownik chce otrzymywać programy telewizyjne MTV, Twoja usługa internetowa może sprawdzić w bazie danych i odpowiedzieć użytkownikowi na harmonogram MTV.

  1. Kliknij Fulfillment (Realizacja) w menu głównym.
  2. Włącz przełącznik Wbudowany edytor.

cc84351f0d03ab6f.png

Do testowania i wdrażania prostego webhooka możesz użyć edytora wbudowanego. Wykorzystuje bezserwerowe Cloud Functions dla Firebase.

  1. Kliknij kartę index.js w edytorze i wklej ten fragment kodu JavaScript do użycia w Node.js:
'use strict';

process.env.DEBUG = 'dialogflow:debug';

const {
  dialogflow,
  BasicCard,
  Button,
  Image,
  List
 } = require('actions-on-google');

const functions = require('firebase-functions');
const moment = require('moment');
const TVGUIDE_WEBSERVICE = 'https://tvguide-e4s5ds5dsa-ew.a.run.app/channel';
const { WebhookClient } = require('dialogflow-fulfillment');
var spokenText = '';
var results = null;


/* When the Test Intent gets invoked. */
function testHandler(agent) {
    let spokenText = 'This is a test message, when you see this, it means your webhook fulfillment worked!';

    if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
        let conv = agent.conv();
        conv.ask(spokenText);
        conv.ask(new BasicCard({
            title: `Test Message`,
            subTitle: `Dialogflow Test`,
            image: new Image({
                url: 'https://dummyimage.com/600x400/000/fff',
                alt: 'Image alternate text',
            }),
            text: spokenText,
            buttons: new Button({
                title: 'This is a button',
                url: 'https://assistant.google.com/',
            }),
        }));
        // Add Actions on Google library responses to your agent's response
        agent.add(conv);
    } else {
        agent.add(spokenText);
    }
}

/* When the Channel Intent gets invoked. */
function channelHandler(agent) {
    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 = {};
    spokenText = getSpeech(results);

    for (var i = 0; i < results['Listings'].length; i++) {
        listItems[`SELECT_${i}`] = {
            title: `${getSpokenTime(results['Listings'][i]['Time'])} - ${results['Listings'][i]['Title']}`,
            description: `Channel: ${results['Name']}`
        }
    }
    if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
        let conv = agent.conv();
        conv.ask(spokenText);
        conv.ask(new List({
            title: 'TV Guide',
            items: listItems
        }));
        // Add Actions on Google library responses to your agent's response
        agent.add(conv);
    } else {
        agent.add(spokenText);
    }
}

/**
 * Return a text string to be spoken out by the Google Assistant
 * @param {object} JSON tv results
 */
var getSpeech = function(tvresults) {
    let s = "";
    if(tvresults['Listings'][0]) {
        let channelName = tvresults['Name'];
        let currentlyPlayingTime = getSpokenTime(tvresults['Listings'][0]['Time']);
        let laterPlayingTime = getSpokenTime(tvresults['Listings'][1]['Time']);
        s = `On ${channelName} from ${currentlyPlayingTime}, ${tvresults['Listings'][0]['Title']} is playing.
        Afterwards at ${laterPlayingTime}, ${tvresults['Listings'][1]['Title']} will start.`
    }

    return s;
}

/**
 * Return a natural spoken time
 * @param {string} time in 'HH:mm:ss' format
 * @returns {string} spoken time (like 8 30 pm i.s.o. 20:00:00)
 */
var getSpokenTime = function(time){
    let datetime = moment(time, 'HH:mm:ss');
    let min = moment(datetime).format('m');
    let hour = moment(datetime).format('h');
    let partOfTheDay = moment(datetime).format('a');

    if (min == '0') {
        min = '';
    }

    return `${hour} ${min} ${partOfTheDay}`;
};

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
    var agent = new WebhookClient({ request, response });

    console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
    console.log('Dialogflow Request body: ' + JSON.stringify(request.body));
   
    let channelInput = request.body.queryResult.parameters.channel;
    let requestedTime = request.body.queryResult.parameters.time;
    let url = `${TVGUIDE_WEBSERVICE}/${channelInput}`;

    var intentMap = new Map();
    intentMap.set('Test Intent', testHandler);
    intentMap.set('Channel Intent', channelHandler);
    agent.handleRequest(intentMap);
});

cc84351f0d03ab6f.png

  1. W edytorze kliknij kartę package.json i wklej ten fragment kodu JSON, co spowoduje zaimportowanie wszystkich bibliotek menedżera pakietów Node.js (NPM):
{
  "name": "tvGuideFulfillment",
  "description": "Requesting TV Guide information from a web service.",
  "version": "1.0.0",
  "private": true,
  "license": "Apache Version 2.0",
  "author": "Google Inc.",
  "engines": {
    "node": "8"
  },
  "scripts": {
    "start": "firebase serve --only functions:dialogflowFirebaseFulfillment",
    "deploy": "firebase deploy --only functions:dialogflowFirebaseFulfillment"
  },
  "dependencies": {
    "actions-on-google": "^2.2.0",
    "firebase-admin": "^5.13.1",
    "firebase-functions": "^2.0.2",
    "request": "^2.85.0",
    "request-promise": "^4.2.5",
    "moment" : "^2.24.0",
    "dialogflow-fulfillment": "^0.6.1"
  }
}

af01460c2a023e68.png

  1. Kliknij przycisk Wdróż. Zajmie to chwilę, ponieważ wdraża Twoją funkcję bezserwerową. U dołu ekranu pojawi się wyskakujące okienko z informacją o stanie.
  2. Przetestujmy webhooka, by sprawdzić, czy kod działa. W symulatorze po prawej stronie wpisz:

Test my agent.

Jeśli wszystko będzie w porządku, powinien pojawić się komunikat „To jest komunikat testowy”.

  1. Przetestujmy intencje kanału. Zadajmy teraz pytanie:

What's on MTV?

Jeśli wszystko będzie w porządku, zobaczysz te komunikaty:

„W MTV od 16:30 włącza się MTV Unplugged. Potem o 17:30 rozpocznie się wyścig Rupauls Dragons.

Kroki opcjonalne – Firebase

Po przetestowaniu tej funkcji na innym kanale zauważysz, że wyniki w telewizji są takie same. Dzieje się tak, ponieważ funkcja w Cloud Functions nie pobiera jeszcze danych z prawdziwego serwera WWW.

Aby to zrobić, musimy utworzyć wychodzące połączenie sieciowe.

Jeśli chcesz przetestować tę aplikację w usłudze sieciowej, przejdź na pakiet Firebase do Blaze. Uwaga: te kroki są opcjonalne. Możesz też przejść do kolejnych kroków tego modułu, aby kontynuować testowanie aplikacji w Actions on Google.

  1. Otwórz konsolę Firebase: https://console.firebase.google.com

  1. U dołu ekranu kliknij przycisk Uaktualnij.

ad38bc6d07462abf.png

W wyskakującym okienku wybierz abonament Blaze.

  1. Skoro wiemy już, że webhook działa, możemy kontynuować i zastąpić kod index.js poniższym kodem. Dzięki temu będziesz mieć możliwość wysyłania do usługi internetowej informacji o programie telewizyjnym:
'use strict';

process.env.DEBUG = 'dialogflow:debug';

const {
  dialogflow,
  BasicCard,
  Button,
  Image,
  List
 } = require('actions-on-google');

const functions = require('firebase-functions');
const moment = require('moment');
const { WebhookClient } = require('dialogflow-fulfillment');
const rp = require('request-promise');

const TVGUIDE_WEBSERVICE = 'https://tvguide-e4s5ds5dsa-ew.a.run.app/channel';
var spokenText = '';
var results = null;


/* When the Test Intent gets invoked. */
function testHandler(agent) {
    let spokenText = 'This is a test message, when you see this, it means your webhook fulfillment worked!';

    if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
        let conv = agent.conv();
        conv.ask(spokenText);
        conv.ask(new BasicCard({
            title: `Test Message`,
            subTitle: `Dialogflow Test`,
            image: new Image({
                url: 'https://dummyimage.com/600x400/000/fff',
                alt: 'Image alternate text',
            }),
            text: spokenText,
            buttons: new Button({
                title: 'This is a button',
                url: 'https://assistant.google.com/',
            }),
        }));
        // Add Actions on Google library responses to your agent's response
        agent.add(conv);
    } else {
        agent.add(spokenText);
    }
}

/* When the Channel Intent gets invoked. */
function channelHandler(agent) {
    var listItems = {};
    spokenText = getSpeech(results);

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

        }
    }
    if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
        let conv = agent.conv();
        conv.ask(spokenText);
        conv.ask(new List({
            title: 'TV Guide',
            items: listItems
        }));
        // Add Actions on Google library responses to your agent's response
        agent.add(conv);
    } else {
        agent.add(spokenText);
    }
}

/**
 * Return a text string to be spoken out by the Google Assistant
 * @param {object} JSON tv results
 */
var getSpeech = function(tvresults) {
    let s = "";
    if(tvresults && tvresults['Listings'][0]) {
        let channelName = tvresults['Name'];
        let currentlyPlayingTime = getSpokenTime(tvresults['Listings'][0]['Time']);
        let laterPlayingTime = getSpokenTime(tvresults['Listings'][1]['Time']);
        s = `On ${channelName} from ${currentlyPlayingTime}, ${tvresults['Listings'][0]['Title']} is playing.
        Afterwards at ${laterPlayingTime}, ${tvresults['Listings'][1]['Title']} will start.`
    }

    return s;
}

/**
 * Return a natural spoken time
 * @param {string} time in 'HH:mm:ss' format
 * @returns {string} spoken time (like 8 30 pm i.s.o. 20:00:00)
 */
var getSpokenTime = function(time){
    let datetime = moment(time, 'HH:mm:ss');
    let min = moment(datetime).format('m');
    let hour = moment(datetime).format('h');
    let partOfTheDay = moment(datetime).format('a');

    if (min == '0') {
        min = '';
    }

    return `${hour} ${min} ${partOfTheDay}`;
};

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
    var agent = new WebhookClient({ request, response });

    console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
    console.log('Dialogflow Request body: ' + JSON.stringify(request.body));
   
    let channelInput = request.body.queryResult.parameters.channel;
    let requestedTime = request.body.queryResult.parameters.time;
    let url = `${TVGUIDE_WEBSERVICE}/${channelInput}`;

    if (requestedTime) {
        console.log(requestedTime);
        let offsetMin = moment().utcOffset(requestedTime)._offset;
        console.log(offsetMin);
        let time = moment(requestedTime).utc().add(offsetMin,'m').format('HH:mm:ss');
        url = `${TVGUIDE_WEBSERVICE}/${channelInput}/${time}`;
      }
    
      console.log(url);
  
      var options = {
          uri: encodeURI(url),
          json: true
      };
       
      // request promise calls an URL and returns the JSON response.
      rp(options)
        .then(function(tvresults) {
            console.log(tvresults);
            // the JSON response, will need to be formatted in 'spoken' text strings.
            spokenText = getSpeech(tvresults);
            results = tvresults;
        })
        .catch(function (err) {
            console.error(err);
        })
        .finally(function(){
            // kick start the Dialogflow app
            // based on an intent match, execute
            var intentMap = new Map();
            intentMap.set('Test Intent', testHandler);
            intentMap.set('Channel Intent', channelHandler);
            agent.handleRequest(intentMap);
        });
});

6. Actions on Google

Actions on Google to platforma programistyczna Asystenta Google. Umożliwia opracowywanie przez inne firmy „działań” – apletów Asystenta Google, które zapewniają rozszerzone funkcje.

Musisz wywołać działanie Google, prosząc Google o otwarcie aplikacji lub komunikowanie się z nią.

Spowoduje to otwarcie działania, zmianę głosu, a poza tym opcja Zakres Asystenta Google. Oznacza to, że wszystkie, o które poprosisz agenta, musisz od tego momentu utworzyć samodzielnie. Nie możesz nagle zapytać Asystenta Google o pogodę, jeśli tego chcesz. najpierw zamknij (zamknij) zakres działania (aplikację).

Testowanie swojego działania w symulatorze Asystenta Google

Przetestujmy ten wątek:

Użytkownik

Asystent Google

„OK Google, porozmawiaj z przewodnikiemyour-name-tv-guide]”.

„Oczywiście. Pobierzę your-name-tv-guide”.

Użytkownik

Agent Your-Name-TV-Guide

-

„Cześć, jestem przewodnikiem telewizyjnym...”

Przetestuj agenta

„To jest wiadomość testowa. Kiedy się wyświetla, oznacza to, że realizacja webhooka się powiodła”.

Co jest w MTV?

W MTV od 16:30 wyświetla się MTV Unplugged. Potem o 17:30 rozpocznie się wyścig Rupauls Drag wyścigowy.

  1. Przełącz się z powrotem na symulator Asystenta Google

Otwórz: https://console.actions.google.com

  1. Kliknij ikonę mikrofonu i zadaj pytanie:

c3b200803c7ba95e.png

  • Talk to my test agent
  • Test my agent

Asystent Google powinien w odpowiedzi wpisać:

5d93c6d037c8c8eb.png

  1. Teraz zadajmy sobie te pytania:
  • What's on Comedy Central?

Powinno to zwrócić:

Obecnie od 18:00 na Comedy Central gra The Simpsons. Potem o 19:00 rozpocznie się program Family Guy.

7. Gratulacje

Udało Ci się utworzyć pierwsze działanie Asystenta Google w Dialogflow. Gratulacje!

Jak być może wiesz, działanie było wykonywane w trybie testowym, który jest powiązany z Twoim kontem Google. Do zalogowania się na urządzeniu Nest lub w aplikacji Asystent Google na telefonie z iOS lub Androidem przy użyciu tego samego konta. Możesz też przetestować swoje działanie.

To jest wersja demonstracyjna na warsztatach. Jeśli jednak tworzysz rzeczywiste aplikacje dla Asystenta Google, możesz przesłać swoje działanie do zatwierdzenia. Więcej informacji znajdziesz w tym przewodniku

Omówione zagadnienia

  • Jak utworzyć czatbota w Dialogflow 2
  • Jak tworzyć encje niestandardowe w Dialogflow
  • Jak utworzyć linearną rozmowę przy użyciu Dialogflow
  • Jak skonfigurować realizacje webhooków za pomocą funkcji Dialogflow i Firebase
  • Jak przenieść aplikację do Asystenta Google za pomocą Actions on Google

Co dalej?

Podobał Ci się ten moduł związany z kodowaniem? Zapoznaj się z tymi wspaniałymi laboratoriami.

Kontynuuj ten moduł, integrując go z Google Chat:

Tworzenie przewodnika po Google Chat za pomocą G Suite i Dialogflow