1. Başlamadan önce
Bu codelab'de, Dialogflow'un kullanıcıların sorularına zengin ve dinamik yanıtlar vermek için arka uç sistemleriyle nasıl bağlantı kurduğunu öğreneceksiniz.
Ön koşullar
Devam etmeden önce aşağıdaki codelab'leri tamamlamanız gerekir:
- Dialogflow ile randevu planlayıcı oluşturma
- Dialogflow'u Actions on Google ile entegre etme
- Dialogflow'daki varlıkları anlama
Ayrıca, Dialogflow ile chatbot oluşturma rotasındaki aşağıdaki videolardan edinebileceğiniz Dialogflow'un temel kavramlarını ve yapılarını da anlamanız gerekir.
Neler öğreneceksiniz?
- Sipariş karşılama nedir?
- Takvim için hizmet hesabı oluşturma
- Takvim'i ayarlama
- Dialogflow'da karşılamayı etkinleştirme
- İstek karşılama nasıl test edilir?
Ne oluşturacaksınız?
- Cloud Functions ile karşılama
- Dialogflow ve Takvim arasında entegrasyon
İhtiyacınız olanlar
- Dialogflow konsolunda oturum açmak için web tarayıcısı ve e-posta adresi
- Takvim'e erişmek için Google Hesabı
2. Sipariş karşılama nedir?
İstek karşılama, Dialogflow aracınızın niyet bazında işletme mantığını çağırmasına olanak tanıyan bir webhook olarak dağıtılan koddur. Karşılama, bir görüşme sırasında Dialogflow'un doğal dil işleme özelliği tarafından çıkarılan bilgileri kullanarak dinamik yanıtlar oluşturmanıza veya arka uçta işlemleri tetiklemenize olanak tanır. Çoğu Dialogflow aracısı, karşılama özelliğinden yararlanır.
Aşağıda, bir temsilcinin kapsamını genişletmek için karşılama özelliğini kullanabileceğiniz bazı örnekler verilmiştir:
- Veritabanından aranan bilgilere göre dinamik yanıtlar oluşturmak için
- Müşterinin istediği ürünlere göre sipariş verme
- Bir oyunun kurallarını ve kazanma koşullarını uygulamak için
3. Calendar API'yi etkinleştirme
- Dialogflow Console'da
simgesini tıklayın. - Genel sekmesinde Proje kimliği'ne gidin ve Google Cloud'u
tıklayın.

- Google Cloud Console'da Gezinme menüsü ☰ > API'ler ve Hizmetler > Kitaplık'ı tıklayın.
- "Google Takvim API"yi arayın, ardından Google Cloud projenizde API'yi kullanmak için Etkinleştir'i tıklayın.
4. Hizmet hesabı oluşturma
- Gezinme menüsü ☰ > API'ler ve Hizmetler > Kimlik bilgileri'ni tıklayın.
- Kimlik bilgisi oluştur > Hizmet hesabı'nı tıklayın.

- Hizmet hesabı ayrıntıları bölümünde Hizmet hesabı adı olarak "appointment-scheduler"ı girip Oluştur'u tıklayın.

- Bu hizmet hesabına projeye erişim izni ver yazan yerde Devam'ı tıklayarak bu adımı atlayın.
- Kullanıcıların bu hizmet hesabına erişmelerine izin verin (isteğe bağlı) yazan yerde Anahtar oluştur'u tıklayın, ardından JSON'u seçip Oluştur'u tıklayın.
Bilgisayarınıza bir JSON dosyası indirilir. Bu dosyaya, aşağıdaki kurulum bölümlerinde ihtiyacınız olacaktır. 
5. Takvim kurulumu
- Takvim'e gidin, ardından Ana menü ☰ > Başka takvim ekle
> Yeni takvim oluştur'u tıklayın.

- Takvimin adı olarak "Randevu Takvimi"ni girin ve Takvim oluştur'u tıklayın.
- Sayfayı yeniden yükleyin, ardından Randevu Takvimi'ni tıklayın, Belirli kullanıcılarla paylaş'a gidin ve Kullanıcı ekle'yi tıklayın.
- Hizmet hesabı kurulumunun bir parçası olarak indirdiğiniz JSON dosyasından
client_emaildeğerini kopyalayıp iletişim kutusuna yapıştırın.

- İzinler açılır listesini, ardından Etkinliklerde değişiklik yapma > Gönder'i tıklayın.

- Ayarlar'dayken Takvimi entegre edin bölümüne gidin ve Takvim Kimliği'ni kopyalayın.

6. Dialogflow'da istek karşılama ayarlama
Hizmet hesabını ve takvim kimliğini karşılama işlemine ekleme
- AppointmentScheduler Dialogflow aracısına gidin ve İstek karşılama'yı tıklayın.
- Satır içi düzenleyici'yi etkinleştirin.

index.jsdosyasını aşağıdaki kodla güncelleyin:
'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);
}
);
}
});
});
}
<INSERT YOUR CALENDAR ID>kısmını, önceki bölümde kopyaladığınız takvim kimliğiyle değiştirin.<INSERT CONTENTS OF YOUR JSON FILE HERE>yerine JSON dosyanızın içeriğini girin.- (İsteğe bağlı.) const timeZone ve const timeZoneOffset değerlerini Randevu Takvimi'nin saat dilimine göre değiştirin.
- Dağıt'ı tıklayın.
Yerine getirme yanıtını etkinleştirme
- Dialogflow konsoluna gidin ve Niyetler'i tıklayın.
- Randevu Planlama Amacı'nı tıklayın.
- İstek karşılama bölümüne gidin ve Niyet için webhook çağrısını etkinleştir'i açın.

- Kaydet'i tıklayın.
- Dağıt'ı tıklayın.
7. Chatbot'unuzu test etme
Chatbot'unuzu İşlemler simülatöründe test edebilir veya daha önce öğrendiğiniz web ya da Google Home entegrasyonunu kullanabilirsiniz.
- Kullanıcı: "Yarın saat 14:00'te araç kaydı için randevu al."
- Chatbot: "Tamam, bakalım sizi programa dahil edebilir miyiz? 24 Nisan saat 14:00 uygun!"

- Takvim, yanıtı kaydeder.

8. Temizleme
Diğer Dialogflow codelab'lerini tamamlamayı planlıyorsanız bu bölümü şimdilik atlayıp daha sonra geri dönebilirsiniz.
Dialogflow aracısını silme
- Mevcut temsilcinizin yanındaki
simgesini tıklayın.

- Genel sekmesinde en alta gidin ve Bu Aracıyı Sil'i tıklayın.
- İletişim kutusuna Sil yazıp Sil'i tıklayın.
9. Tebrikler
Dialogflow'da bir chatbot oluşturup Takvim ile entegre etmiş olmanız gerekir. Artık bir chatbot geliştiricisiniz.
Daha fazla bilgi
Daha fazla bilgi edinmek için Dialogflow Github sayfasındaki kod örneklerine göz atın.