Uygulamalı: Dialogflow ve Actions on Google ile Google Asistan için TV rehberi işlemi oluşturun

1. Giriş

Televizyon izliyorsunuz ama uzaktan kumandayı bulamıyorsanız veya televizyonda güzel bir şeyler olup olmadığını öğrenmek için her bir TV kanalını ziyaret etmek istemiyor musunuz? Google Asistan'a televizyonda ne olduğunu soralım. Bu laboratuvarda, Dialogflow'u kullanarak basit bir işlem derleyecek ve bu işlemi Google Asistan'a nasıl entegre edeceğinizi öğreneceksiniz.

Alıştırmalar, bulut geliştiricilerin sıkça takip ettiği adımlara uygun şekilde sıralanmıştır:

  1. Dialogflow v2 aracısı oluşturma
  2. Özel varlık oluşturma
  3. Amaç oluştur
  4. Firebase Functions ile webhook oluşturma
  5. Chatbot'u test edin
  6. Google Asistan entegrasyonunu etkinleştirme

Oluşturacağınız nedir?

Google Asistan için etkileşimli bir TV rehberi chatbot aracısı oluşturacağız. TV rehberine, belirli bir kanalda şu anda neyin yayınlandığını sorabilirsiniz. Örneğin; "MTV'de neler var?" TV Rehberi işlemi, şu anda o anda oynatılan içeriği ve sonraki bir videoyu belirtir.

Neler öğreneceksiniz?

  • Dialogflow v2 ile chatbot oluşturma
  • Dialogflow ile özel varlık oluşturma
  • Dialogflow ile doğrusal görüşme oluşturma
  • Dialogflow ve Firebase Functions ile webhook karşılamaları ayarlama
  • Actions on Google ile uygulamanızı Google Asistan'a getirme

Ön koşullar

  • Dialogflow aracısı oluşturmak için Google Kimliğine / gmail adresine ihtiyacınız olacaktır.
  • Temel JavaScript bilgisi gerekli değildir ancak webhook sipariş karşılama kodunu değiştirmek istediğinizde yararlı olabilir.

2. Kurulum

Tarayıcınızda Web Etkinliği'ni etkinleştirme

  1. http://myaccount.google.com/activitycontrols adresini tıklayın

  1. Web ve web Uygulama Etkinliği etkinse:

bf8d16b828d6f79a.png

Dialogflow aracısı oluşturma

  1. https://console.dialogflow.com sayfasını açın.

  1. Sol çubukta, logonun hemen altında "Yeni Temsilci Oluştur"u seçin. Mevcut aracılarınız varsa önce açılır listeyi tıklayın.

1d7c2b56a1ab95b8.png

  1. Bir temsilci adı belirtin: your-name-tvguide (kendi adınızı kullanın)

35237b5c5c539ecc.png

  1. Varsayılan dil olarak seçin: İngilizce - en
  2. Varsayılan saat dilimi olarak, size en yakın saat dilimini seçin.
  3. Oluştur'u tıklayın

Dialogflow'u yapılandırma

  1. Soldaki menüde, proje adının yanındaki dişli simgesini tıklayın.

1d7c2b56a1ab95b8.png

  1. Şu temsilci açıklamasını girin: TV Rehberim

26f262d359c49075.png

  1. Günlük Ayarları'na gidin, ardından Dialogflow etkileşimlerini günlüğe kaydetmek ve tüm etkileşimleri Google Cloud Stackdriver'da günlüğe kaydetmek için iki anahtarı da çevirin. Daha sonra işlemimizde hata ayıklamak isteyebileceğimizi düşünerek bu bilgilere daha sonra ihtiyacımız olacak.

e80c17acc3cce993.png

  1. Kaydet'i tıklayın

Actions on Google'ı yapılandırma

  1. Sağ taraftaki panelde Google Asistan'da nasıl çalıştığını görün bölümünde Google Asistan bağlantısını tıklayın.

5a4940338fc351e3.png

Şu şekilde açılır: http://console.actions.google.com

Actions on Google'ı kullanmaya yeni başladıysanız önce şu formu doldurmanız gerekir:

3fd4e594fa169072.png

  1. Simülatörde** proje adını tıklayarak işleminizi açmayı deneyin.**
  2. Menü çubuğunda Test et'i seçin

6adb83ffb7adeb78.png

  1. Simülasyon aracının İngilizce olarak ayarlandığından emin olun ve Test uygulamamla konuş'u tıklayın.

İşlem, sizi temel Dialogflow varsayılan niyetiyle karşılar. Diğer bir deyişle, Action on Google ile entegrasyon ayarlandı.

3. Özel Varlıklar

Varlıklar, uygulamanızın veya cihazınızın işlem yaptığı nesnelerdir. Bunu parametreler / değişkenler olarak düşünün. TV Rehberimizde "MTV'de neler var?" diye sorarız. MTV, varlık ve değişkendir. "National Coğrafi" gibi diğer kanalları da isteyebilirim. veya "Komedi Merkezi" gibi. Toplanan varlık, TV Guide API web hizmetine isteğimde parametre olarak kullanılacaktır.

Dialogflow Varlıkları hakkında daha fazla bilgiyi burada bulabilirsiniz.

Kanal varlığı oluşturma

  1. Dialogflow Console menü öğesini tıklayın: Entities
  2. Varlık Oluştur'u tıklayın.
  3. Varlık adı: channel (tümü küçük harf olduğundan emin olun)
  4. Kanal adını iletin. (Google Asistan başka bir şey anlarsa bazı kanallarda eş anlamlı kelime kullanılması gerekir). Yazarken sekmeyi kullanabilir ve tuşları girebilirsiniz. Referans değeri olarak kanal numarasını girin. Ayrıca, kanal adlarını eş anlamlı olarak da kullanabilirsiniz. Örneğin:
  • 1 - 1, Net 1, Net Station 1

ee4e4955aa77232d.png

5**.** Mavi kaydet düğmesinin yanındaki menü düğmesini tıklayarak **Ham Düzenleme** moduna geçin.

e294b49b123e034f.png

  1. Kopyala ve diğer varlıkları CSV biçiminde yapıştırın:
"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. Kaydet'i tıklayın

4. Niyetler

Dialogflow, bir kullanıcının amaçlarını kategorilere ayırmak için intentleri kullanır. Amaçlarda Eğitim İfadeleri bulunur. Bunlar, kullanıcının aracınıza söyleyebileceklerine dair örneklerdir. Örneğin, TV'de ne olduğunu öğrenmek isteyen bir kullanıcı, "Bugün TV'de ne var?" diye sorabilir. "Şu anda ne oynatılıyor?" diye sorabilir veya "tv rehberi" diyebilirsin.

Bir kullanıcı, kullanıcı ifadesi olarak adlandırılan bir şey yazdığında veya söylediğinde Dialogflow, kullanıcı ifadesini aracınızdaki en iyi niyetle eşleştirir. Niyet eşleştirme, amaç sınıflandırması olarak da bilinir.

Dialogflow Intent'leri hakkında daha fazla bilgiyi burada bulabilirsiniz.

Varsayılan Karşılama Niyetini Değiştirme

Yeni bir Dialogflow aracısı oluşturduğunuzda iki varsayılan intent otomatik olarak oluşturulur. Varsayılan Karşılama Niyeti, temsilciyle görüşme başlattığınızda ilk gerçekleşen akıştır. Varsayılan Yedek Niyeti, aracı sizi anlayamadığında veya bir niyeti az önce söylediklerinizle eşleştiremediğinde alacağınız akıştır.

  1. Varsayılan Karşılama Niyeti'ni tıklayın.

Google Asistan'da ise varsayılan Karşılama Niyeti ile otomatik olarak başlar. Bunun nedeni Dialogflow'un Karşılama etkinliğini dinlemesidir. Bununla birlikte, girilen eğitim ifadelerinden birini söyleyerek niyeti de çağırabilirsiniz.

6beee64e8910b85d.png

Varsayılan Karşılama Niyeti için karşılama mesajı şöyledir:

Kullanıcı

Temsilci

"Ok Google, adınızın-tv rehberiyle konuşun."

"Hoş geldiniz. TV Rehberi temsilcisiyim. Sana bir televizyon kanalında şu anda neyin çaldığını söyleyebilirim. Örneğin bana "MTV'de neler var?" diye sorabilirsiniz.

  1. Aşağı kaydırarak Yanıtlar'a gidin.
  2. Tüm Metin Yanıtları'nı temizle.
  3. Aşağıdaki karşılama mesajını içeren yeni bir metin yanıtı oluşturun:

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. Kaydet'i tıklayın

Geçici test niyeti oluşturma

Test amacıyla geçici test niyeti oluşturacağız. Böylece webhook'u daha sonra test edebiliriz.

  1. Tekrar Niyetler menü öğesini tıklayın.
  2. Create Intent'i (Niyet Oluştur) tıklayın
  3. Niyet Adı'nı girin: Test Intent (Büyük harf T ve büyük I harfi kullandığınızdan emin olun. - Amacı farklı yazarsanız arka uç hizmeti çalışmaz!)

925e02caa4de6b99.png

  1. Eğitim ifadeleri ekle'yi tıklayın.
  • Test my agent
  • Test intent

2e44ddb2fae3c841.png

  1. Karşılama > Sipariş Karşılamayı Etkinleştir

7eb73ba04d76140e.png

Bu kez yanıtları sabit olarak kodlayamıyoruz. Yanıt, bir Cloud Functions işlevinden gelir.

  1. Bu amaç için Webhook çağrısını etkinleştir anahtarını çevirin.

748a82d9b4d7d253.png

  1. Kaydet'i tıklayın

Kanal Amacını Oluşturma

Kanal amacı, görüşmenin şu kısmını içerir:

Kullanıcı

Temsilci

"Komedi Merkezi'nde neler var?"

""Şu anda 18:00'den itibaren Comedy Central'da The Simpsons oynuyor. Daha sonra 19:00'da Family Guy başlar."

  1. Tekrar Niyetler menü öğesini tıklayın.
  2. Create Intent'i (Niyet Oluştur) tıklayın
  3. Amaç adını girin: Channel Intent (büyük harf T ve büyük harf I kullandığınızdan emin olun. - Amacı farklı yazarsanız arka uç hizmeti çalışmaz!)
  4. Eğitim ifadeleri ekle'yi tıklayın ve aşağıdakileri ekleyin:
  • 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. Aşağı kaydırarak İşlem ve parametreler'e gidin

b7e917026760218a.png

@channel & Dialogflow tarafından bilinen @sys.time varlıklarıdır. Daha sonra webhook'unuzda parametre adı ve parametre değeri web hizmetinize gönderilir. Örneğin:

channel=8

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

  1. Kanalu gerekli olarak işaretleyin

TV Rehberi aracısı ile sohbet ederken her zaman channel alan parametresi adını doldurmanız gerekir. Görüşmenin başında kanal adından bahsedilmemişse Dialogflow, tüm parametre alanları doldurulana kadar size tekrar soru sorar. 6f36973fd789c182.png.

Komut istemi olarak şunları girin:

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

cdb5601ead9423f8.png

  1. Zaman parametresini gereken şekilde ayarlamayın.

Saat isteğe bağlı olacaktır. Saat belirtilmediğinde, web hizmeti geçerli saati döndürür.

  1. Sipariş Karşılama'yı tıklayın.

Bu kez yanıtları sabit olarak kodlayamıyoruz. Yanıt, Cloud Functions işlevinden gelir. Bu nedenle, Bu amaç için Webhook çağrısını etkinleştir anahtarını çevirin.

  1. Kaydet'i tıklayın

5. Webhook Yerine Getirme

Aracınızın birden fazla statik intent yanıtına ihtiyacı varsa web hizmetinizi temsilcinize bağlamak için fulfillment özelliğini kullanmanız gerekir. Web hizmetinizi bağlamak, kullanıcı ifadelerine göre işlemler yapmanıza ve dinamik yanıtlar kullanıcıya geri göndermenize olanak tanır. Örneğin, bir kullanıcı MTV için TV programını almak isterse web hizmetiniz veritabanınızı kontrol edip kullanıcıya, MTV planına yanıt verebilir.

  1. Ana menüde Karşılama'yı tıklayın
  2. Satır içi düzenleyici anahtarını etkinleştirin

cc84351f0d03ab6f.png

Basit bir webhook testi ve uygulaması için satır içi düzenleyiciyi kullanabilirsiniz. Sunucusuz Cloud Functions for Firebase'den yararlanır.

  1. Düzenleyicide index.js sekmesini tıklayın ve Node.js kodu için bu JavaScript parçasını kopyalayıp yapıştırın:
'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. Düzenleyicide package.json sekmesini tıklayın ve tüm Node.js Package Manager (NPM) kitaplıklarını içe aktaran bu JSON kodu parçasını kopyalayıp yapıştırın:
{
  "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. Dağıt düğmesini tıklayın. Bu işlem, sunucusuz işlevinizi dağıttığı için biraz zaman alacaktır. Ekranın alt kısmında, durumunuzu belirten bir pop-up gösterilir.
  2. Kodun çalışıp çalışmadığını görmek için webhook'u test edelim. Sağ taraftaki simülasyon aracında şunları yazın:

Test my agent.

Her şey doğru olduğunda "Bu bir test mesajıdır" mesajını görürsünüz.

  1. Şimdi de Kanal Amacı'nı test edelim. Şimdi de soruyu sorun:

What's on MTV?

Her şey doğru olduğunda:

"MTV'de saat 16:30'dan itibaren MTV Unplugged oynatılıyor. Ardından 17:30'da Rupauls Drag Yarışı başlayacak."

İsteğe Bağlı Adımlar - Firebase

Bunu farklı bir kanalda test ettiğinizde TV sonuçlarının aynı olduğunu görürsünüz. Bunun nedeni, bulut işlevinin henüz gerçek bir web sunucusundan veri getirmemesidir.

Bunu yapmak için giden ağ bağlantısı kurmamız gerekir.

Bu uygulamayı bir web hizmetiyle test etmek istiyorsanız Firebase planınızı Blaze'e yükseltin. Not: Bu adımlar isteğe bağlıdır. Uygulamanızı Actions on Google'da test etmeye devam etmek için bu laboratuvarın sonraki adımlarına da gidebilirsiniz.

  1. Firebase konsoluna gidin: https://console.firebase.google.com

  1. Ekranın alt kısmındaki Yükselt düğmesine basın.

ad38bc6d07462abf.png

Pop-up'ta Blaze planını seçin.

  1. Webhook'un çalıştığını bildiğimize göre devam edebilir ve index.js kodunu aşağıdaki kodla değiştirebiliriz. Böylece web hizmetinden TV rehberi bilgileri isteyebilirsiniz:
'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, Google Asistan için bir geliştirme platformudur. Üçüncü taraflarca geliştirilip "işlemlerin" (Google Asistan için genişletilmiş işlevsellik sağlayan appt'ler) geliştirilmesini sağlar.

Google'dan bir uygulamayı açmasını veya uygulamayla konuşmasını isteyerek bir Google işlemini çağırmanız gerekir.

Bu seçenek, işleminizi açar, sesi değiştirir ve "yerel"den ayrılırsınız Google Asistan kapsamı. Dolayısıyla bu noktadan itibaren temsilcinizden isteyeceğiniz her şeyi sizin oluşturmanız gerekir. Bunu yapmak istiyorsanız aniden Google Asistan'a Google hava durumu bilgilerini soramazsınız; Önce işleminizin (uygulamanız) kapsamını bırakmalısınız (kapatmalısınız).

İşleminizi Google Asistan simülasyon aracında test etme

Aşağıdaki konuşmayı test edelim:

Kullanıcı

Google Asistan

"Ok Google, your-name-tv-guide ile konuşun."

"Elbette. your-name-tv-guide bulalım."

Kullanıcı

Adınız-TV-Rehberi Aracı

-

"Hoş geldiniz, ben TV rehberiyim...."

Temsilcimi test et

"Bu bir test mesajıdır. Gördüğünüzde webhook karşılama işleminiz çalıştı."

MTV'de neler var?

Saat 16:30'dan itibaren MTV'de MTV Unplugged oynatılıyor. Ardından saat 17:30'da Rupauls Drag Yarışı başlayacak.

  1. Google Asistan simülatörüne geri dönme

Şu adrese gidin: https://console.actions.google.com

  1. Mikrofon simgesini tıklayın ve şunları sorun:

c3b200803c7ba95e.png

  • Talk to my test agent
  • Test my agent

Google Asistan şu şekilde yanıt vermelidir:

5d93c6d037c8c8eb.png

  1. Şimdi şunları soralım:
  • What's on Comedy Central?

Bu kod şunu döndürmelidir:

18:00'den itibaren Comedy Central'da The Simpsons oynuyor. Daha sonra 19:00'da Family Guy devreye girer.

7. Tebrikler

Dialogflow ile ilk Google Asistan işleminizi oluşturdunuz, tebrikler!

Sizin de fark etmiş olabileceğiniz gibi işleminiz, Google Hesabınıza bağlı test modunda gerçekleştiriliyordu. Nest cihazınızda veya Google Asistan uygulamanızda iOS ya da Android telefonunuzda aynı hesapla giriş yaparsanız İşleminizi de test edebilirsiniz.

Bu bir atölye demosu. Ancak Google Asistan için gerçek anlamda uygulamalar oluştururken İşleminizi onaya gönderebilirsiniz. Daha fazla bilgi için bu kılavuzu okuyun.

İşlediklerimiz

  • Dialogflow v2 ile chatbot oluşturma
  • Dialogflow ile özel varlık oluşturma
  • Dialogflow ile doğrusal görüşme oluşturma
  • Dialogflow ve Firebase Functions ile webhook karşılamaları ayarlama
  • Actions on Google ile uygulamanızı Google Asistan'a getirme

Sırada ne var?

Bu codelab'i beğendiniz mi? Bu muhteşem laboratuvarlara göz atın.

Google Chat'e entegre ederek bu codelab'e devam edin:

G Suite ve Dialogflow ile TV rehberi Google Chat oluşturma