1. Trước khi bắt đầu
Trong lớp học lập trình này, bạn sẽ tìm hiểu cách Dialogflow kết nối với các hệ thống phụ trợ để cung cấp các câu trả lời phong phú và linh hoạt cho câu hỏi của người dùng.
Điều kiện tiên quyết
Trước khi tiếp tục, bạn cần hoàn thành các lớp học lập trình sau:
- Tạo một Trình lên lịch hẹn bằng Dialogflow
- Tích hợp Dialogflow với Actions on Google
- Tìm hiểu về thực thể trong Dialogflow
Bạn cũng cần nắm được các khái niệm và cấu trúc cơ bản của Dialogflow. Bạn có thể tìm hiểu các khái niệm và cấu trúc này trong các video sau đây trong lộ trình Xây dựng chatbot bằng Dialogflow.
Kiến thức bạn sẽ học được
- Thực hiện đơn hàng là gì
- Cách thiết lập tài khoản dịch vụ cho Lịch
- Cách thiết lập Lịch
- Cách bật tính năng thực hiện trong Dialogflow
- Cách kiểm tra việc thực hiện đơn đặt hàng
Sản phẩm bạn sẽ tạo ra
- Thực hiện yêu cầu bằng Cloud Functions
- Tích hợp giữa Dialogflow và Lịch
Bạn cần có
- Trình duyệt web và địa chỉ email để đăng nhập vào bảng điều khiển Dialogflow
- Một Tài khoản Google để truy cập vào Lịch
2. Thực hiện đơn hàng là gì?
Hoạt động thực hiện là mã được triển khai dưới dạng webhook, cho phép tác nhân Dialogflow gọi logic nghiệp vụ theo từng ý định. Trong một cuộc trò chuyện, tính năng thực hiện yêu cầu cho phép bạn sử dụng thông tin do quy trình xử lý ngôn ngữ tự nhiên của Dialogflow trích xuất để tạo các câu trả lời linh hoạt hoặc kích hoạt các hành động trên phần phụ trợ của bạn. Hầu hết các đặc vụ Dialogflow đều sử dụng tính năng thực hiện.
Sau đây là một số ví dụ về thời điểm bạn có thể sử dụng tính năng thực hiện để mở rộng phạm vi hoạt động của một trợ lý ảo:
- Để tạo câu trả lời linh hoạt dựa trên thông tin được tra cứu từ cơ sở dữ liệu
- Đặt hàng dựa trên sản phẩm mà khách hàng yêu cầu
- Để triển khai các quy tắc và điều kiện chiến thắng cho một trò chơi
3. Bật Calendar API
- Trong bảng điều khiển Dialogflow, hãy nhấp vào
. - Trong thẻ Chung, hãy di chuyển đến Mã dự án, rồi nhấp vào Google Cloud
.

- Trong Google Cloud Console, hãy nhấp vào Trình đơn điều hướng ☰ > API và dịch vụ > Thư viện.
- Tìm "Google Calendar API" rồi nhấp vào Bật để sử dụng API này trên dự án Google Cloud của bạn.
4. Thiết lập tài khoản dịch vụ
- Nhấp vào Trình đơn điều hướng ☰ > API và dịch vụ > Thông tin xác thực.
- Nhấp vào Tạo thông tin xác thực > Tài khoản dịch vụ.

- Trong phần Chi tiết tài khoản dịch vụ, hãy nhập "appointment-scheduler" làm Tên tài khoản dịch vụ, rồi nhấp vào Tạo.

- Ở phần Cấp cho tài khoản dịch vụ này quyền truy cập vào dự án, hãy nhấp vào Tiếp tục để bỏ qua.
- Ở phần Cấp cho người dùng quyền truy cập vào tài khoản dịch vụ này (không bắt buộc), hãy nhấp vào Tạo khoá, sau đó chọn JSON rồi nhấp vào Tạo.
Một tệp JSON sẽ được tải xuống máy tính của bạn. Bạn sẽ cần tệp này trong các phần thiết lập sau đây. 
5. Thiết lập Lịch
- Chuyển đến Lịch, sau đó nhấp vào Trình đơn chính ☰ > Thêm lịch khác
> Tạo lịch mới.

- Nhập "Lịch hẹn" làm tên lịch rồi nhấp vào Tạo lịch.
- Tải lại trang, sau đó nhấp vào Lịch hẹn, di chuyển đến phần Chia sẻ với người cụ thể, rồi nhấp vào Thêm người.
- Sao chép
client_emailtừ tệp JSON mà bạn đã tải xuống trong quá trình thiết lập tài khoản dịch vụ rồi dán vào hộp thoại.

- Nhấp vào danh sách thả xuống Quyền, sau đó nhấp vào Thay đổi sự kiện > Gửi.

- Trong phần Cài đặt, hãy di chuyển đến mục Tích hợp lịch rồi sao chép Mã lịch.

6. Thiết lập việc thực hiện yêu cầu trong Dialogflow
Thêm tài khoản dịch vụ và mã lịch vào thông tin thực hiện đơn hàng
- Chuyển đến nhân viên hỗ trợ AppointmentScheduler của Dialogflow rồi nhấp vào Fulfillment (Thực hiện).
- Bật Trình chỉnh sửa nội tuyến.

- Cập nhật tệp
index.jsbằng mã sau:
'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);
}
);
}
});
});
}
- Thay thế
<INSERT YOUR CALENDAR ID>bằng Mã lịch mà bạn đã sao chép trong phần trước. - Thay thế
<INSERT CONTENTS OF YOUR JSON FILE HERE>bằng nội dung trong tệp JSON của bạn. - (Không bắt buộc.) Thay đổi const timeZone và const timeZoneOffset theo múi giờ của Lịch hẹn.
- Nhấp vào Triển khai.
Bật phản hồi thực hiện
- Chuyển đến bảng điều khiển Dialogflow rồi nhấp vào Ý định.
- Nhấp vào Ý định đặt lịch hẹn.
- Di chuyển xuống phần Thực hiện rồi bật tuỳ chọn Bật lệnh gọi webhook cho ý định.

- Nhấp vào Lưu.
- Nhấp vào Triển khai.
7. Kiểm thử chatbot
Bạn có thể kiểm thử chatbot trong Trình mô phỏng hành động hoặc sử dụng tính năng tích hợp web hoặc Google Home mà bạn đã tìm hiểu trước đó.
- Người dùng: "Đặt lịch hẹn đăng ký xe lúc 2 giờ chiều mai."
- Chatbot: "Được rồi, hãy để tôi xem liệu chúng tôi có thể sắp xếp cho bạn được không. Ngày 24 tháng 4, 14:00 là được!"

- Lịch sẽ ghi lại câu trả lời.

8. Dọn dẹp
Nếu bạn dự định hoàn tất các lớp học lập trình khác về Dialogflow, thì hãy bỏ qua phần này và quay lại sau.
Xoá tác nhân Dialogflow
- Nhấp vào biểu tượng
bên cạnh nhân viên hỗ trợ hiện có.

- Trong thẻ Chung, hãy di chuyển xuống dưới cùng rồi nhấp vào Xoá tác nhân này.
- Nhập Xoá vào hộp thoại rồi nhấp vào Xoá.
9. Xin chúc mừng
Bạn đã tạo một chatbot trong Dialogflow và tích hợp chatbot đó với Lịch. Bạn hiện là nhà phát triển chatbot!
Tìm hiểu thêm
Để tìm hiểu thêm, hãy xem các mã mẫu trên trang Dialogflow Github.