1. قبل البدء
في هذا الدرس التطبيقي حول الترميز، ستتعرّف على كيفية ربط Dialogflow بأنظمة الخلفية لتقديم ردود غنية وديناميكية على أسئلة المستخدمين.
المتطلبات الأساسية
قبل المتابعة، عليك إكمال الدورات التدريبية التالية:
- إنشاء أداة جدولة مواعيد باستخدام Dialogflow
- دمج Dialogflow مع "المهام مع مساعد Google"
- التعرّف على الكيانات في Dialogflow
عليك أيضًا فهم المفاهيم الأساسية في Dialogflow، ويمكنك الاطّلاع عليها من خلال الفيديوهات التالية المتوفّرة في مسار إنشاء روبوت محادثة باستخدام Dialogflow.
أهداف الدورة التعليمية
- ما المقصود بتلبية طلبات العملاء؟
- كيفية إعداد حساب خدمة لـ "تقويم Google"
- كيفية إعداد "تقويم Google"
- كيفية تفعيل التنفيذ في Dialogflow
- كيفية اختبار عملية التنفيذ
ما ستنشئه
- تنفيذ الطلبات باستخدام Cloud Functions
- عملية دمج بين Dialogflow و"تقويم Google"
المتطلبات
- متصفّح ويب وعنوان بريد إلكتروني لتسجيل الدخول إلى وحدة تحكّم Dialogflow
- حساب Google للوصول إلى "تقويم Google"
2. ما المقصود بتلبية طلبات العملاء؟
التنفيذ هو رمز برمجي يتم نشره كخطاف ويب يتيح لوكيل Dialogflow استدعاء منطق النشاط التجاري على أساس كل هدف على حدة. أثناء المحادثة، تتيح لك ميزة "تنفيذ الطلب" استخدام المعلومات التي استخرجتها ميزة "معالجة اللغة الطبيعية" في Dialogflow لإنشاء ردود ديناميكية أو تشغيل إجراءات في الخلفية. تستفيد معظم وكلاء Dialogflow من خدمة التنفيذ.
في ما يلي بعض الأمثلة على الحالات التي يمكنك فيها استخدام التنفيذ لتوسيع نطاق الوكيل:
- لإنشاء ردود ديناميكية استنادًا إلى معلومات تم البحث عنها في قاعدة بيانات
- تقديم طلبات استنادًا إلى المنتجات التي طلبها العميل
- لتنفيذ قواعد اللعبة وشروط الفوز
3- تفعيل Calendar API
- في وحدة تحكّم Dialogflow، انقر على
. - في علامة التبويب الإعدادات العامة، انتقِل إلى رقم تعريف المشروع، ثم انقر على Google Cloud
.

- في Google Cloud Console، انقر على قائمة التنقّل ☰ > واجهات برمجة التطبيقات والخدمات > المكتبة.
- ابحث عن "Google Calendar API"، ثم انقر على تفعيل لاستخدام واجهة برمجة التطبيقات في مشروعك على Google Cloud.
4. إعداد حساب خدمة
- انقر على قائمة التنقّل ☰ > واجهات برمجة التطبيقات والخدمات > بيانات الاعتماد.
- انقر على إنشاء بيانات اعتماد > حساب الخدمة.

- في تفاصيل حساب الخدمة، أدخِل "appointment-scheduler" في اسم حساب الخدمة، ثم انقر على إنشاء.

- في قسم منح حساب الخدمة هذا إذن الوصول إلى المشروع، انقر على متابعة لتخطّيه.
- في قسم منح المستخدمين إذن الوصول إلى حساب الخدمة هذا (اختياري)، انقر على إنشاء مفتاح، ثم اختَر JSON وانقر على إنشاء.
سيتم تنزيل ملف JSON على جهاز الكمبيوتر، وستحتاج إليه في أقسام الإعداد التالية. 
5- إعداد التقويم
- انتقِل إلى التقويم، ثم انقر على القائمة الرئيسية ☰ > إضافة تقاويم أخرى
> إنشاء تقويم جديد.

- أدخِل "تقويم المواعيد" كاسم للتقويم وانقر على إنشاء تقويم.
- أعِد تحميل الصفحة، ثم انقر على تقويم المواعيد، وانتقِل إلى المشاركة مع مستخدمين محدّدين، ثم انقر على إضافة مستخدمين.
- انسخ
client_emailمن ملف JSON الذي تم تنزيله كجزء من إعداد حساب الخدمة والصقه في مربّع الحوار.

- انقر على القائمة المنسدلة الأذونات، ثم انقر على إجراء تغييرات على الأحداث > إرسال.

- أثناء بقائك في الإعدادات، انتقِل إلى دمج التقويم وانسخ رقم تعريف التقويم.

6. إعداد التنفيذ في Dialogflow
إضافة حساب خدمة ومعرّف تقويم إلى عملية التنفيذ
- انتقِل إلى وكيل AppointmentScheduler في Dialogflow وانقر على التنفيذ.
- فعِّل أداة التعديل المضمّنة.

- عدِّل ملف
index.jsباستخدام الرمز التالي:
'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>بمعرّف التقويم الذي نسخته في القسم السابق. - استبدِل
<INSERT CONTENTS OF YOUR JSON FILE HERE>بمحتوى ملف JSON. - (اختياري) غيِّر const timeZone وconst timeZoneOffset وفقًا للمنطقة الزمنية لتقويم المواعيد.
- انقر على نشر.
تفعيل ردّ التنفيذ
- انتقِل إلى وحدة تحكّم Dialogflow وانقر على طلبات.
- انقر على نية جدولة موعد.
- انتقِل للأسفل إلى التنفيذ وفعِّل الخيار تفعيل طلب webhook للغرض.

- انقر على حفظ.
- انقر على نشر.
7. اختبار روبوت الدردشة
يمكنك اختبار روبوت المحادثة في محاكي "الإجراءات"، أو استخدام عملية الدمج مع الويب أو Google Home التي تعرّفت عليها سابقًا.
- المستخدم: "أريد تحديد موعد لتسجيل المركبة في الساعة 2 ظهرًا غدًا".
- روبوت الدردشة: "حسنًا، دعني أرى ما إذا كان بإمكاننا توفير موعد لك. "الموعد في 24 أبريل الساعة 2 بعد الظهر مناسب".

- يسجّل "تقويم Google" الرد.

8. تَنظيم
إذا كنت تخطّط لإكمال دروس برمجية أخرى من Dialogflow، يمكنك تخطّي هذا القسم الآن والعودة إليه لاحقًا.
حذف وكيل Dialogflow
- انقر على الرمز
بجانب وكيلك الحالي.

- في علامة التبويب الإعدادات العامة، انتقِل إلى أسفل الصفحة وانقر على حذف هذا الوكيل.
- اكتب حذف في مربّع الحوار وانقر على حذف.
9- تهانينا
أنشأت برنامج دردشة آليًا في Dialogflow ودمجته مع "تقويم Google". أصبحت الآن مطوّر برامج محادثة مبرمَجة.
مزيد من المعلومات
لمزيد من المعلومات، اطّلِع على نماذج الرموز البرمجية في صفحة Dialogflow Github.