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

1. Giriş

Televizyon izliyorsunuz ancak uzaktan kumandayı bulamıyorsunuz veya televizyonda güzel bir program olup olmadığını öğrenmek için her TV kanalını ziyaret etmek istemiyor olabilirsiniz. Google Asistan'a TV'de ne olduğunu soralım. Bu laboratuvarda Dialogflow'u kullanarak basit bir işlem oluşturacak ve bu işlemi Google Asistan ile 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 öğe oluşturma
  3. Amaç oluşturma
  4. Firebase Functions ile webhook ayarlama
  5. Chatbot'u test etme
  6. Google Asistan entegrasyonunu etkinleştirme

Ne oluşturacaksınız?

Google Asistan için etkileşimli bir TV rehberi chatbot ajanı oluşturacağız. TV rehberine belirli bir kanalda şu anda yayınlanan içerikleri sorabilirsiniz. Örneğin, "MTV'de ne var?" dediğinizde TV Rehberi işlemi, şu anda neyin oynatıldığını ve sırada ne olduğunu söyler.

Neler öğreneceksiniz?

  • Dialogflow v2 ile chatbot oluşturma
  • Dialogflow ile özel varlıklar oluşturma
  • Dialogflow ile doğrusal sohbet oluşturma
  • Dialogflow ve Firebase Functions ile webhook karşılamaları ayarlama
  • Actions on Google ile uygulamanızı Google Asistan'a taşıma

Ön koşullar

  • Dialogflow aracısı oluşturmak için Google kimliğiniz / Gmail adresiniz olmalıdır.
  • JavaScript hakkında temel bilgiye sahip olmanız gerekmez ancak webhook karşılama kodunu değiştirmek isterseniz bu bilgi işinize yarayabilir.

2. Hazırlanma

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

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

  1. Web ve Uygulama Etkinliği'nin etkinleştirildiğinden emin olun:

bf8d16b828d6f79a.png

Dialogflow aracısı oluşturma

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

  1. Sol çubukta, logonun hemen altında "Yeni Temsilci Oluştur"u seçin. Mevcut ajanları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 İngilizce - en'yi seçin.
  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. Sol menüde, proje adınızın yanındaki dişli simgesini tıklayın.

1d7c2b56a1ab95b8.png

  1. Aşağıdaki temsilci açıklamasını girin: My TV Guide (TV Rehberim)

26f262d359c49075.png

  1. Günlük Ayarları'na gidin ve hem Dialogflow etkileşimlerini hem de Google Cloud Stackdriver'daki tüm etkileşimleri günlüğe kaydetmek için her iki anahtarı da etkinleştirin. İşlemimizde hata ayıklamak istersek bu bilgiye daha sonra ihtiyacımız olacak.

e80c17acc3cce993.png

  1. Kaydet'i tıklayın

Actions on Google'ı yapılandırma

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

5a4940338fc351e3.png

Bu işlem http://console.actions.google.com adresini açar.

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

3fd4e594fa169072.png

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

6adb83ffb7adeb78.png

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

İşlem, temel Dialogflow varsayılan niyetiyle sizi karşılar. Bu, Google'da İşlem entegrasyonunun başarıyla ayarlandığı anlamına gelir.

3. Özel Varlıklar

Varlıklar, uygulamanızın veya cihazınızın üzerinde işlem yaptığı nesnelerdir. Bunu parametreler / değişkenler olarak düşünebilirsiniz. TV rehberimizde "MTV'de ne var?" diye soracağız. MTV, varlık ve değişkendir. "National Geographic" veya "Comedy Central" gibi başka kanallar da isteyebilirim. Toplanan öğe, TV Rehberi API web hizmetine yaptığım istekte parametre olarak kullanılacak.

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

Kanal öğesini oluşturma

  1. Dialogflow konsolunda Varlıklar menü öğesini tıklayın.
  2. Varlık Oluştur'u tıklayın.
  3. Tüzel kişi adı: channel (tamamen küçük harflerle yazıldığından emin olun)
  4. Bir kanal adı iletin. (Google Asistan'ın başka bir şey anlaması durumunda bazı kanallar için eş anlamlı kelime gerekir.) Yazarken sekme ve enter tuşlarını kullanabilirsiniz. Kanal numarasını referans değeri olarak girin. Ayrıca kanal adlarını eş anlamlı olarak 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. Diğer öğeleri CSV biçiminde kopyalayıp 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, kullanıcının niyetlerini sınıflandırmak için intent'leri kullanır. Niyetler, kullanıcının temsilcinize söyleyebileceği şeylerin örnekleri olan eğitim ifadeleri içerir. Örneğin, TV'de ne olduğunu öğrenmek isteyen bir kullanıcı "Bugün TV'de ne var?" diye sorabilir. "Şu anda ne oynuyor?" veya "tvrehberi" deyin.

Kullanıcı bir şey yazdığında veya söylediğinde (kullanıcı ifadesi olarak adlandırılır) Dialogflow, kullanıcı ifadesini aracınızdaki en iyi niyetle eşleştirir. Bir amaca karşılık verme işlemine amaç sınıflandırması da denir.

Dialogflow niyetleri 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 amaç otomatik olarak oluşturulur. Varsayılan Karşılama Niyeti, temsilciyle sohbet başlattığınızda ulaştığınız ilk akıştır. Varsayılan Yedek Amaç, temsilci sizi anlayamadığında veya bir amacı az önce söylediklerinizle eşleştiremediğinde elde edeceğiniz akıştır.

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

Google Asistan'da Varsayılan Karşılama Niyeti ile otomatik olarak başlatılır. Bunun nedeni, Dialogflow'un Welcome event'i dinlemesidir. Ancak, girilen eğitim ifadelerinden birini söyleyerek de amacı çağırabilirsiniz.

6beee64e8910b85d.png

Varsayılan karşılama niyeti için karşılama mesajı aşağıda verilmiştir:

Kullanıcı

Ajan

"Ok Google, your-name-tvguide ile konuş."

"Hoş geldiniz. Ben TV Rehberi temsilcisiyim. TV kanalında şu anda ne yayınlandığını söyleyebilirim. Örneğin, bana "MTV'de ne var?" diye sorabilirsiniz.

  1. Yanıtlar'a gidin.
  2. Tüm metin yanıtlarını temizleyin.
  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 bir test amacı oluşturma

Test amacıyla geçici bir test amaçlı işlemi oluşturacağız. Böylece webhook'u daha sonra test edebiliriz.

  1. Niyetler menü öğesini tekrar 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 harf I kullandığınızdan emin olun. - Amacı farklı şekilde 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. Fulfillment > Enable Fulfillment'ı (Fulfillment > Fulfillment'ı Etkinleştir) tıklayın.

7eb73ba04d76140e.png

Bu kez yanıtı sabit kodlamıyoruz. Yanıt, bir Cloud Function'dan gelir.

  1. Bu niyet için webhook çağrısını etkinleştir anahtarını açın.

748a82d9b4d7d253.png

  1. Kaydet'i tıklayın.

Kanal Amacını Oluşturma

Kanal Amacı, görüşmenin şu bölümünü içerir:

Kullanıcı

Ajan

"Comedy Central'da neler var?"

""Şu anda Comedy Central'da saat 18:00'den itibaren The Simpsons oynatılıyor. Ardından saat 19:00'da Family Guy başlayacak.""

  1. Niyetler menü öğesini tekrar tıklayın.
  2. Create Intent'i (Niyet Oluştur) tıklayın.
  3. Niyet adını girin: Channel Intent (Büyük harf T ve büyük harf I kullandığınızdan emin olun. - Amacı farklı şekilde 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. İşlem ve parametreler'e ilerleyin.

b7e917026760218a.png

Dialogflow tarafından bilinen @channel ve @sys.time varlıklarına dikkat edin. 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. Kanalı gerekli olarak işaretleme

TV Rehberi temsilcisiyle konuşurken her zaman channel yuvası parametre adını doldurmanız gerekir. Kanal adı görüşmenin başında belirtilmediyse Dialogflow, tüm parametre yuvaları doldurulana kadar daha fazla soru sorar. 6f36973fd789c182.png

İstem olarak şunu 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 gerektiği gibi ayarlamayın.

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

  1. Fulfillment'ı tıklayın.

Bu kez yanıtı sabit kodlamıyoruz. Yanıt, Cloud Function'dan gelir. Bu nedenle Bu niyet için webhook çağrısını etkinleştir anahtarını açın.

  1. Kaydet'i tıklayın.

5. Webhook Fulfillment

Ajanınızın statik amaç yanıtlarından daha fazlasına ihtiyacı varsa web hizmetinizi ajanıza bağlamak için karşılama'yı kullanmanız gerekir. Web hizmetinizi bağlayarak kullanıcı ifadelerine göre işlem yapabilir ve kullanıcıya dinamik yanıtlar gönderebilirsiniz. Örneğin, bir kullanıcı MTV'nin TV yayın akışını almak istiyorsa web hizmetiniz veritabanınızı kontrol edip kullanıcıya MTV'nin yayın akışını yanıtlayabilir.

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

cc84351f0d03ab6f.png

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

  1. Düzenleyicideki index.js sekmesini tıklayın ve Node.js kodu için bu JavaScript kodunu 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üzenleyicideki 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. Sunucusuz işleviniz dağıtıldığından bu işlem biraz zaman alır. Ekranın alt kısmında durumunuzu bildiren bir pop-up gösterilir.
  2. Kodun çalışıp çalışmadığını görmek için webhook'u test edelim. Sağ taraftaki simülatörde şunu yazın:

Test my agent.

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

  1. Şimdi kanal amacını test edelim ve soruyu soralım:

What's on MTV?

Her şey doğruysa şunları görürsünüz:

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

İsteğe bağlı adımlar - Firebase

Bunu farklı bir kanalla test ettiğinizde TV sonuçlarının aynı olduğunu görürsünüz. Bunun nedeni, Cloud Functions'ın henüz gerçek bir web sunucusundan veri getirmemesidir.

Bunun için giden ağ bağlantısı oluşturmamı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. Ayrıca, 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 pencerede 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. Bu işlem, web hizmetinden TV rehberi bilgisi isteyebilmenizi sağlar:
'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 geliştirme platformudur. Google Asistan için ek işlevler sağlayan küçük uygulamalar olan "işlemlerin" üçüncü taraflarca geliştirilmesine olanak tanır.

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

Bu işlem, işleminizi açar, sesi değiştirir ve "yerel" Google Asistan kapsamından çıkarsınız. Bu nedenle, bu noktadan sonra temsilcinizden istediğiniz her şey sizin tarafınızdan oluşturulmalıdır. İstediğiniz buysa Google Asistan'dan aniden Google hava durumu bilgisi isteyemezsiniz. Önce işleminizin kapsamını (uygulamanızı) kapatmanız gerekir.

Google Asistan simülatöründe işleminizi test etme

Aşağıdaki görüşmeyi test edelim:

Kullanıcı

Google Asistan

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

"Elbette. Let me get your-name-tv-guide adresine gitmeme izin ver.)

Kullanıcı

Your-Name-TV-Guide Agent

-

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

Temsilcimi test et

"Bu bir test mesajıdır. Bu mesajı gördüğünüzde webhook yerine getirme işleminizin çalıştığı anlaşılır."

MTV'de neler var?

Saat 16.30'dan itibaren MTV'de MTV Unplugged çalıyor. Ardından saat 17:30'da Rupauls Drag Race başlayacak.

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

Açın: https://console.actions.google.com

  1. Mikrofon simgesini tıklayın ve aşağıdaki soruları sorun:

c3b200803c7ba95e.png

  • Talk to my test agent
  • Test my agent

Google Asistan şu yanıtı vermelidir:

5d93c6d037c8c8eb.png

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

Bu işlem şu sonucu döndürmelidir:

Şu anda Comedy Central'da saat 18:00'den itibaren The Simpsons oynatılıyor. Ardından saat 19:00'da Family Guy başlayacak.

7. Tebrikler

Dialogflow ile ilk Google Asistan Action'ınızı oluşturdunuz. Tebrikler!

Fark etmiş olabileceğiniz gibi, işleminiz Google Hesabınıza bağlı olan test modunda çalışıyordu. Nest cihazınızda veya iOS ya da Android telefonunuzdaki Google Asistan uygulamasında aynı hesapla oturum açtıysanız İşleminizi de test edebilirsiniz.

Bu bir atölye çalışması demosudur. Ancak Google Asistan için gerçek uygulamalar geliştirirken İşleminizi onay için gönderebilirsiniz. Daha fazla bilgi için bu kılavuzu okuyun.

İşlediğimiz konular

  • Dialogflow v2 ile chatbot oluşturma
  • Dialogflow ile özel varlıklar oluşturma
  • Dialogflow ile doğrusal sohbet oluşturma
  • Dialogflow ve Firebase Functions ile webhook karşılamaları ayarlama
  • Actions on Google ile uygulamanızı Google Asistan'a taşıma

Yapabilecekleriniz

Bu kod laboratuvarını beğendiniz mi? Bu harika laboratuvarlara göz atın.

Google Chat ile entegre ederek bu kod laboratuvarına devam edin:

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