1. Zanim zaczniesz
Z tych ćwiczeń z programowania dowiesz się, jak Dialogflow łączy się z systemami backendu, aby dostarczać użytkownikom bogate i dynamiczne odpowiedzi na ich pytania.
Wymagania wstępne
Zanim przejdziesz dalej, musisz ukończyć te ćwiczenia:
- Tworzenie harmonogramu spotkań za pomocą Dialogflow
- Integrowanie Dialogflow z Actions on Google
- Informacje o encjach w Dialogflow
Musisz też poznać podstawowe pojęcia i konstrukcje Dialogflow. Możesz to zrobić, oglądając te filmy z ścieżki szkoleniowej Tworzenie chatbota za pomocą Dialogflow.
Czego się nauczysz
- Co to jest realizacja zamówienia
- Konfigurowanie konta usługi na potrzeby Kalendarza
- Jak skonfigurować Kalendarz
- Jak włączyć realizację w Dialogflow
- Jak przetestować realizację
Co utworzysz
- Realizacja za pomocą Cloud Functions
- Integracja Dialogflow z Kalendarzem
Czego potrzebujesz
- przeglądarka internetowa i adres e-mail do logowania się w konsoli Dialogflow;
- konto Google, aby uzyskać dostęp do Kalendarza;
2. Co to jest realizacja zamówienia?
Realizacja to kod wdrażany jako webhook, który umożliwia agentowi Dialogflow wywoływanie logiki biznesowej w przypadku każdego zamiaru. Podczas rozmowy realizacja umożliwia używanie informacji wyodrębnionych przez przetwarzanie języka naturalnego w Dialogflow do generowania dynamicznych odpowiedzi lub wywoływania działań na backendzie. Większość agentów Dialogflow korzysta z realizacji.
Oto kilka przykładów sytuacji, w których możesz użyć realizacji, aby rozszerzyć możliwości agenta:
- generować dynamiczne odpowiedzi na podstawie informacji wyszukanych w bazie danych.
- składać zamówienia na podstawie produktów, o które poprosił klient;
- wdrażanie zasad i warunków wygranej w grze;
3. Włączanie interfejsu Calendar API
- W konsoli Dialogflow kliknij
. - Na karcie Ogólne przewiń do opcji Identyfikator projektu i kliknij Google Cloud
.

- W konsoli Google Cloud kliknij Menu nawigacyjne ☰ > Interfejsy API i usługi > Biblioteka.
- Wyszukaj „Google Calendar API”, a następnie kliknij Włącz, aby używać interfejsu API w projekcie Google Cloud.
4. Skonfiguruj konto usługi
- Kliknij Menu nawigacyjne ☰ > Interfejsy API i usługi > Dane logowania.
- Kliknij Utwórz dane logowania > Konto usługi.

- W sekcji Szczegóły konta usługi wpisz „appointment-scheduler” jako Nazwę konta usługi, a następnie kliknij Utwórz.

- W sekcji Przyznaj temu kontu usługi dostęp do projektu kliknij Dalej, aby pominąć ten krok.
- W sekcji Przyznaj użytkownikom dostęp do tego konta usługi (opcjonalnie) kliknij Utwórz klucz, a następnie wybierz JSON i kliknij Utwórz.
Na komputer zostanie pobrany plik JSON, który będzie potrzebny w kolejnych sekcjach konfiguracji. 
5. Konfigurowanie kalendarza
- Otwórz Kalendarz, a następnie kliknij Menu główne ☰ > Dodaj inne kalendarze
> Utwórz nowy kalendarz.

- Wpisz „Kalendarz spotkań” jako nazwę kalendarza i kliknij Utwórz kalendarz.
- Odśwież stronę, a następnie kliknij Kalendarz spotkań, przewiń do sekcji Udostępnij wybranym osobom i kliknij Dodaj osoby.
- Skopiuj
client_emailz pliku JSON pobranego w ramach konfiguracji konta usługi i wklej go w oknie.

- Kliknij listę Uprawnienia, a potem Wprowadzaj zmiany w zdarzeniach > Wyślij.

- W Ustawieniach przewiń widok do sekcji Integrowanie kalendarza i skopiuj identyfikator kalendarza.

6. Konfigurowanie realizacji w Dialogflow
Dodawanie konta usługi i identyfikatora kalendarza do realizacji
- Otwórz agenta Dialogflow AppointmentScheduler i kliknij Realizacja.
- Włącz edytor wbudowany.

- Zaktualizuj plik
index.jstym kodem:
'use strict';
// Import the Dialogflow module from Google client libraries.
const functions = require('firebase-functions');
const {google} = require('googleapis');
const {WebhookClient} = require('dialogflow-fulfillment');
// Enter your calendar ID below and service account JSON below
const calendarId = "<INSERT YOUR CALENDAR ID>";
const serviceAccount = {<INSERT CONTENTS OF YOUr JSON FILE HERE>}; // Starts with {"type": "service_account",...
// Set up Google Calendar Service account credentials
const serviceAccountAuth = new google.auth.JWT({
email: serviceAccount.client_email,
key: serviceAccount.private_key,
scopes: 'https://www.googleapis.com/auth/calendar'
});
const calendar = google.calendar('v3');
process.env.DEBUG = 'dialogflow:*'; // enables lib debugging statements
const timeZone = 'America/Los_Angeles';
const timeZoneOffset = '-07:00';
// Set the DialogflowApp object to handle the HTTPS POST request.
exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
const agent = new WebhookClient({ request, response });
console.log("Parameters", agent.parameters);
const appointment_type = agent.parameters.appointment_type;
function makeAppointment (agent) {
// Calculate appointment start and end datetimes (end = +1hr from start)
const dateTimeStart = new Date(Date.parse(agent.parameters.date.split('T')[0] + 'T' + agent.parameters.time.split('T')[1].split('-')[0] + timeZoneOffset));
const dateTimeEnd = new Date(new Date(dateTimeStart).setHours(dateTimeStart.getHours() + 1));
const appointmentTimeString = dateTimeStart.toLocaleString(
'en-US',
{ month: 'long', day: 'numeric', hour: 'numeric', timeZone: timeZone }
);
// Check the availability of the time, and make an appointment if there is time on the calendar
return createCalendarEvent(dateTimeStart, dateTimeEnd, appointment_type).then(() => {
agent.add(`Ok, let me see if we can fit you in. ${appointmentTimeString} is fine!.`);
}).catch(() => {
agent.add(`I'm sorry, there are no slots available for ${appointmentTimeString}.`);
});
}
// Handle the Dialogflow intent named 'Schedule Appointment'.
let intentMap = new Map();
intentMap.set('Schedule Appointment', makeAppointment);
agent.handleRequest(intentMap);
});
//Creates calendar event in Google Calendar
function createCalendarEvent (dateTimeStart, dateTimeEnd, appointment_type) {
return new Promise((resolve, reject) => {
calendar.events.list({
auth: serviceAccountAuth, // List events for time period
calendarId: calendarId,
timeMin: dateTimeStart.toISOString(),
timeMax: dateTimeEnd.toISOString()
}, (err, calendarResponse) => {
// Check if there is a event already on the Calendar
if (err || calendarResponse.data.items.length > 0) {
reject(err || new Error('Requested time conflicts with another appointment'));
} else {
// Create event for the requested time period
calendar.events.insert({ auth: serviceAccountAuth,
calendarId: calendarId,
resource: {summary: appointment_type +' Appointment', description: appointment_type,
start: {dateTime: dateTimeStart},
end: {dateTime: dateTimeEnd}}
}, (err, event) => {
err ? reject(err) : resolve(event);
}
);
}
});
});
}
- Zastąp
<INSERT YOUR CALENDAR ID>identyfikatorem kalendarza skopiowanym w poprzedniej sekcji. - Zastąp
<INSERT CONTENTS OF YOUR JSON FILE HERE>zawartością pliku JSON. - (Opcjonalnie) Zmień const timeZone i const timeZoneOffset zgodnie ze strefą czasową Kalendarza rezerwacji.
- Kliknij Wdróż.
Włączanie odpowiedzi dotyczącej realizacji
- Otwórz konsolę Dialogflow i kliknij Intencje.
- Kliknij Schedule Appointment Intent (Intencja zaplanowania spotkania).
- Przewiń w dół do sekcji Realizacja i włącz opcję Włącz wywołanie webhooka dla tej intencji.

- Kliknij Zapisz.
- Kliknij Wdróż.
7. Testowanie czatbota
Możesz przetestować chatbota w symulatorze działań lub użyć integracji z internetem lub Google Home, o których pisaliśmy wcześniej.
- Użytkownik: „Umów mnie na spotkanie w sprawie rejestracji pojazdu na jutro na 14:00”.
- Chatbot: „OK, sprawdzę, czy możemy Cię przyjąć. 24 kwietnia o 14:00 będzie w porządku”.

- Kalendarz zarezerwuje odpowiedź.

8. Czyszczenie danych
Jeśli planujesz ukończyć inne ćwiczenia z Dialogflow, na razie pomiń tę sekcję i wróć do niej później.
Usuwanie agenta Dialogflow
- Kliknij
obok istniejącego agenta.

- Na karcie Ogólne przewiń do dołu i kliknij Usuń tego agenta.
- Wpisz w oknie Usuń i kliknij Usuń.
9. Gratulacje
Utworzono chatbota w Dialogflow i zintegrowano go z Kalendarzem. Jesteś teraz programistą czatbota.
Więcej informacji
Więcej informacji znajdziesz w przykładowych kodach na stronie Dialogflow na GitHubie.