1. مقدمة
هل تشاهد التلفزيون ولكن لا يمكنك العثور على جهاز التحكّم عن بُعد، أو ربما لا تريد الانتقال إلى كل قناة تلفزيونية لمعرفة ما إذا كان هناك برنامج تلفزيوني يعجبك؟ لنطلب من "مساعد Google" معرفة البرامج المتوفرة على التلفزيون. في هذا التمرين العملي، ستنشئ إجراءً بسيطًا باستخدام Dialogflow وتتعرّف على كيفية دمجه مع "مساعد Google".
تم ترتيب التمارين لتعكس تجربة مطوّر السحابة الإلكترونية الشائعة:
- إنشاء موظف دعم في الإصدار 2 من Dialogflow
- إنشاء كيان مخصّص
- إنشاء نوايا
- إعداد خطاف ويب باستخدام "وظائف Firebase"
- اختبار روبوت الدردشة
- تفعيل عملية الدمج مع "مساعد Google"
ما ستنشئه
سننشئ وكيل روبوت دردشة تفاعليًا لدليل التلفزيون من أجل "مساعد Google". يمكنك أن تسأل دليل التلفزيون عن البرامج التي يتم بثها حاليًا على قناة معيّنة. على سبيل المثال: "ماذا يُعرض على قناة MTV؟" سيخبرك إجراء "دليل البرامج التلفزيونية" بالمحتوى الذي يتم تشغيله حاليًا والمحتوى الذي سيتم تشغيله لاحقًا. |
|
ما ستتعلمه
- كيفية إنشاء روبوت محادثة باستخدام الإصدار 2 من Dialogflow
- كيفية إنشاء كيانات مخصّصة باستخدام Dialogflow
- كيفية إنشاء محادثة خطية باستخدام Dialogflow
- كيفية إعداد عمليات تنفيذ الويب هوك باستخدام Dialogflow ووظائف Firebase
- كيفية إتاحة تطبيقك على "مساعد Google" باستخدام "مهام مع مساعد Google"
المتطلبات الأساسية
- ستحتاج إلى Google Identity أو عنوان Gmail لإنشاء وكيل Dialogflow.
- لا يُشترط توفّر معرفة أساسية بلغة JavaScript، ولكن قد يكون ذلك مفيدًا في حال أردت تغيير رمز تنفيذ الويب هوك.
2. الإعداد
تفعيل "نشاط الويب" في متصفّحك
- تأكَّد من تفعيل "النشاط على الويب وفي التطبيقات" باتّباع الخطوات التالية:

إنشاء وكيل في Dialogflow
- في الشريط الأيمن، أسفل الشعار مباشرةً، انقر على إنشاء وكيل جديد. في حال كان لديك وكلاء حاليون، انقر على القائمة المنسدلة أولاً.

- يُرجى تحديد اسم وكيل:
your-name-tvguide(استخدِم اسمك)

- اختَر الإنجليزية - en كلغة تلقائية.
- اختَر المنطقة الزمنية الأقرب إليك كمنطقة زمنية تلقائية.
- انقر على إنشاء
ضبط Dialogflow
- انقر على رمز الترس في القائمة اليمنى بجانب اسم مشروعك.

- أدخِل وصف الوكيل التالي: دليل التلفزيون الخاص بي

- انتقِل للأسفل إلى إعدادات السجلّ واقلب كلا الزرّين لتسجيل تفاعلات Dialogflow وتسجيل جميع التفاعلات في Google Cloud Stackdriver. سنحتاج إلى ذلك لاحقًا، في حال أردنا تصحيح أخطاء الإجراء.

- انقر على حفظ.
ضبط "المهام مع مساعد Google"
- انقر على الرابط مساعد Google في التعرّف على طريقة عملها في "مساعد Google" في اللوحة على يسار الصفحة.

سيؤدي ذلك إلى فتح: http://console.actions.google.com
إذا كنت جديدًا على Actions on Google، عليك ملء هذا النموذج أولاً:

- حاوِل فتح تطبيقك في المحاكي** من خلال النقر على اسم المشروع.**
- انقر على اختبار في شريط القوائم

- تأكَّد من ضبط المحاكي على الإنجليزية، ثم انقر على التحدّث إلى تطبيقي التجريبي.
سيرحّب بك الإجراء باستخدام الغرض التلقائي الأساسي في Dialogflow. وهذا يعني أنّ عملية إعداد الدمج مع "إجراءات على Google" قد نجحت.
3- الكيانات المخصّصة
العناصر هي كائنات يتخذ تطبيقك أو جهازك إجراءات بشأنها. يمكنك التفكير في الأمر على أنّه مَعلمات أو متغيرات. في "دليل التلفزيون"، سنطرح السؤال التالي: "ماذا يُعرض على قناة MTV؟". MTV هي الكيان والمتغير. يمكنني أيضًا طلب قنوات أخرى، مثل "National Geographic" أو "Comedy Central". سيتم استخدام العنصر الذي تم جمعه كمَعلمة في طلبي إلى خدمة الويب الخاصة بواجهة برمجة التطبيقات "دليل التلفزيون".
مزيد من المعلومات حول كيانات Dialogflow
إنشاء كيان القناة
- انقر في "وحدة تحكّم Dialogflow" على عنصر القائمة: الكيانات
- انقر على إنشاء عنصر.
- اسم الجهة:
channel(يجب أن تكون جميع الأحرف صغيرة) - أدخِل اسم قناة. (ستحتاج بعض القنوات إلى مرادف في حال فهم "مساعد Google" شيئًا آخر). يمكنك استخدام مفتاحَي Tab وEnter أثناء الكتابة. أدخِل رقم القناة كقيمة مرجعية. وأسماء القنوات كمرادفات، مثل:
1 - 1, Net 1, Net Station 1

5**.** انتقِل إلى وضع تعديل البيانات الأولية من خلال النقر على زر القائمة بجانب زر الحفظ الأزرق.

- انسخ الكيانات الأخرى والصقها بتنسيق CSV:
"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"

- انقر على حفظ
4. مكان ووقت الاستماع إلى الموسيقى
يستخدم Dialogflow النيّات لتصنيف نوايا المستخدم. تتضمّن النيّات عبارات تدريبية، وهي أمثلة على ما قد يقوله المستخدم لوكيلك. على سبيل المثال، قد يسأل مستخدم يريد معرفة البرامج التلفزيونية المعروضة "ما هي البرامج التلفزيونية المعروضة اليوم؟" "ما هو المحتوى المعروض حاليًا؟" أو قُل "دليل التلفزيون".
عندما يكتب المستخدم أو يقول شيئًا ما، يُشار إليه باسم تعبير المستخدم، يطابق Dialogflow تعبير المستخدم مع أفضل هدف في وكيلك. تُعرف مطابقة النية أيضًا باسم تصنيف النية.
مزيد من المعلومات حول نوايا Dialogflow
تعديل نية الترحيب التلقائية
عند إنشاء وكيل Dialogflow جديد، سيتم إنشاء غرضَين تلقائيَين تلقائيًا. نية الترحيب التلقائية هي أول مسار يمكنك الوصول إليه عند بدء محادثة مع الوكيل. نية الاحتياطية التلقائية هي المسار الذي سيظهر لك عندما يتعذّر على الوكيل فهمك أو مطابقة نية مع ما قلته للتو.
- انقر على نية الترحيب التلقائية.
في حالة "مساعد Google"، سيبدأ تلقائيًا باستخدام Default Welcome Intent. يرجع السبب إلى أنّ Dialogflow يستمع إلى حدث الترحيب. ومع ذلك، يمكنك أيضًا استدعاء الغرض من خلال قول إحدى عبارات التدريب التي تم إدخالها.

في ما يلي رسالة الترحيب الخاصة بـ "نية الترحيب التلقائية":
المستخدم | الوكيل |
"Ok Google، أريد التحدث إلى your-name-tvguide". | "مرحبًا، أنا وكيل دليل البرامج التلفزيونية. يمكنني إخبارك بالمحتوى الذي يتم تشغيله حاليًا على قناة تلفزيونية. على سبيل المثال، يمكنك أن تسألني: "ما هي البرامج المتوفرة على قناة MTV؟" |
- انتقِل للأسفل إلى الردود.
- محو جميع الردود النصية
- أنشئ ردًا نصيًا جديدًا واحدًا يتضمّن رسالة الترحيب التالية:
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?

- انقر على حفظ.
إنشاء نية اختبار مؤقتة
لأغراض الاختبار، سننشئ غرضًا تجريبيًا مؤقتًا حتى نتمكّن من اختبار الويب هوك لاحقًا.
- انقر على عنصر القائمة النوايا مرة أخرى.
- انقر على إنشاء نية.
- أدخِل اسم الغرض:
Test Intent(تأكَّد من استخدام الحرفين T وI الكبيرين). - إذا كتبت الغرض بشكل مختلف، لن تعمل الخدمة الخلفية.

- انقر على إضافة عبارات تدريب.
Test my agentTest intent

- انقر على التنفيذ > تفعيل التنفيذ

في هذه المرة، لن نضمّن الرد بشكل ثابت في الرمز. سيكون الردّ من دالة سحابية.
- بدِّل مفتاح تفعيل طلب Webhook لهذا الغرض.

- انقر على حفظ
إنشاء نية القناة
سيتضمّن هدف القناة هذا الجزء من المحادثة:
المستخدم | الوكيل |
"ما هي البرامج المتوفرة على Comedy Central؟" | ""يتم حاليًا عرض مسلسل "عائلة سيمبسون" على قناة Comedy Central منذ الساعة 6 مساءً. وبعد ذلك في الساعة 7 مساءً، سيبدأ عرض "فاميلي غاي"."" |
- انقر على عنصر القائمة النوايا مرة أخرى.
- انقر على إنشاء نية.
- أدخِل اسم النية:
Channel Intent(تأكَّد من استخدام الحرفين T وI الكبيرين). - إذا كتبت الغرض بشكل مختلف، لن تعمل الخدمة الخلفية. - انقر على إضافة عبارات تدريب وأضِف ما يلي:
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

- انتقِل للأسفل إلى الإجراء والمعلَمات.

لاحظ الكيانَين @channel و@sys.time المعروفَين في Dialogflow. في وقت لاحق من Webhook، سيتم إرسال اسم المَعلمة وقيمة المَعلمة إلى خدمة الويب. على سبيل المثال:
channel=8
time=2020-01-29T19:00:00+01:00
- وضع علامة مطلوب على القناة
عند إجراء محادثة مع وكيل "دليل التلفزيون"، عليك دائمًا ملء اسم مَعلمة الفتحة channel. إذا لم يتم ذكر اسم القناة في بداية المحادثة، سيطرح Dialogflow المزيد من الأسئلة إلى أن يتم ملء جميع خانات المَعلمات. 
أدخِل ما يلي كطلب:
For which TV channel do you want to hear the tv guide information?In which TV channel are you interested?

- لا تضبط المَعلمة الزمنية على أنّها مطلوبة.
سيكون الوقت اختياريًا. عند عدم تحديد وقت، ستعرض خدمة الويب الوقت الحالي.
- انقر على التنفيذ.
في هذه المرة، لن نضمّن الرد بشكل ثابت في الرمز. ستأتي الاستجابة من دالة السحابة الإلكترونية. وبالتالي، يجب تفعيل خيار تفعيل طلب Webhook لهذا الغرض.
- انقر على حفظ
5- الردّ التلقائي على الويب
إذا كان الوكيل يحتاج إلى أكثر من ردود ثابتة على النية، عليك استخدام التنفيذ لربط خدمة الويب بالوكيل. يتيح لك ربط خدمة الويب اتّخاذ إجراءات استنادًا إلى عبارات المستخدم وإرسال ردود ديناميكية إلى المستخدم. على سبيل المثال، إذا أراد المستخدم معرفة جدول برامج MTV التلفزيونية، يمكن لخدمة الويب التحقّق من قاعدة البيانات والردّ على المستخدم بجدول برامج MTV.
- انقر على التنفيذ في القائمة الرئيسية
- فعِّل مفتاح التبديل المحرّر المضمّن.

يمكنك استخدام المحرّر المضمّن لإجراء اختبارات بسيطة على خطافات الويب وتنفيذها. تستفيد هذه الخدمة من وظائف Firebase السحابية بدون خادم.
- انقر على علامة التبويب index.js في المحرّر وانسخ جزء JavaScript هذا والصقه لرمز Node.js:
'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);
});

- انقر على علامة التبويب package.json في المحرّر وانسخ جزء رمز JSON هذا والصقه، وهو يستورد جميع مكتبات Node.js Package Manager (NPM):
{
"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"
}
}

- انقر على الزر نشر. سيستغرق ذلك بعض الوقت، لأنّه سيتم نشر وظيفتك التي لا تحتاج إلى خادم. في أسفل الشاشة، ستظهر نافذة منبثقة تعرض حالتك.
- لنختبر Webhook لمعرفة ما إذا كان الرمز يعمل. في المحاكي على الجانب الأيسر، اكتب ما يلي:
Test my agent.
عندما تكون كل المعلومات صحيحة، ستظهر لك الرسالة التالية: "هذه رسالة اختبار".
- لنختبر Channel Intent، والآن اطرح السؤال:
What's on MTV?
عندما تكون كل المعلومات صحيحة، من المفترض أن يظهر لك ما يلي:
"يتم الآن تشغيل برنامج MTV Unplugged على قناة MTV بدءًا من الساعة 4:30 مساءً. وبعد ذلك، سيبدأ برنامج "سباق السحب" في الساعة 5:30 مساءً."
خطوات اختيارية - Firebase
عند اختبار ذلك باستخدام قناة مختلفة، ستلاحظ أنّ نتائج التلفزيون هي نفسها. ويرجع ذلك إلى أنّ وظيفة السحابة الإلكترونية لا تجلب البيانات من خادم ويب حقيقي حتى الآن.
ولإجراء ذلك، يجب إنشاء اتصال شبكة صادر.
إذا أردت اختبار هذا التطبيق باستخدام خدمة ويب، عليك ترقية خطة Firebase إلى Blaze. ملاحظة: هذه الخطوات اختيارية. يمكنك أيضًا الانتقال إلى الخطوات التالية في هذا المختبر لمواصلة اختبار تطبيقك في Actions on Google.
- انتقِل إلى "وحدة تحكّم Firebase": https://console.firebase.google.com
- في أسفل الشاشة، انقر على الزر ترقية.

اختَر خطة Blaze في النافذة المنبثقة.
- بعد أن تأكّدنا من أنّ Webhook يعمل، يمكننا المتابعة واستبدال رمز
index.jsبالرمز أدناه. سيضمن ذلك إمكانية طلب معلومات دليل التلفزيون من خدمة الويب:
'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. المهام مع مساعد Google
Actions on Google هي منصة تطوير لـ "مساعد Google". تتيح هذه المنصة للجهات الخارجية تطوير "إجراءات"، وهي عبارة عن تطبيقات صغيرة لـ "مساعد Google" توفّر وظائف موسّعة.
عليك استدعاء أحد إجراءات Google من خلال الطلب من Google فتح تطبيق أو التحدث إليه.
سيؤدي ذلك إلى فتح الإجراء وتغيير الصوت والخروج من نطاق "مساعد Google" "الأصلي". وهذا يعني أنّ كل ما تطلبه من الوكيل من هذه النقطة يجب أن تنشئه أنت. لا يمكنك فجأةً أن تطلب من "مساعد Google" معلومات حول الطقس من Google، إذا كان هذا ما تريده، بل عليك أولاً الخروج من نطاق الإجراء (تطبيقك) أو إغلاقه.
اختبار الإجراء في محاكي "مساعد Google"
لنجرِّب المحادثة التالية:
المستخدم | مساعد Google |
"Ok Google، أريد التحدث إلى your-name-tv-guide". | "بالتأكيد. سأعرض لك your-name-tv-guide". |
المستخدم | Your-Name-TV-Guide Agent |
- | "مرحبًا، أنا دليل البرامج التلفزيونية...." |
اختبار الوكيل | "هذه رسالة اختبارية، وعندما تظهر لك، يعني ذلك أنّ عملية تنفيذ خطاف الويب قد نجحت" |
ماذا يمكنني مشاهدته على MTV؟ | يتم تشغيل برنامج MTV Unplugged على قناة MTV اعتبارًا من الساعة 4:30 مساءً. بعد ذلك، سيبدأ برنامج RuPaul's Drag Race في الساعة 5:30 مساءً. |
- العودة إلى محاكي "مساعد Google"
افتح: https://console.actions.google.com
- انقر على رمز الميكروفون واطرح السؤال التالي:

Talk to my test agentTest my agent
على "مساعد Google" الردّ بما يلي:

- والآن، لنسأل:
What's on Comedy Central?
يجب أن تعرض هذه السمة ما يلي:
يتم حاليًا عرض مسلسل "عائلة سيمبسون" على قناة Comedy Central بدءًا من الساعة 6 مساءً. بعد ذلك، سيبدأ عرض Family Guy في الساعة 7 مساءً.
7. تهانينا
لقد أنشأت إجراءك الأول على "مساعد Google" باستخدام Dialogflow، تهانينا!
كما لاحظت على الأرجح، كان الإجراء يعمل في وضع الاختبار المرتبط بحسابك على Google. إذا سجّلت الدخول على جهاز Nest أو تطبيق "مساعد Google" على هاتف iOS أو Android باستخدام الحساب نفسه يمكنك أيضًا اختبار الإجراء.
هذا عرض توضيحي لورشة عمل. ولكن عند إنشاء تطبيقات لـ "مساعد Google"، يمكنك إرسال "الإجراء" للموافقة عليه. اطّلِع على هذا الدليل للحصول على مزيد من المعلومات.
المواضيع التي تناولناها
- كيفية إنشاء روبوت محادثة باستخدام الإصدار 2 من Dialogflow
- كيفية إنشاء كيانات مخصّصة باستخدام Dialogflow
- كيفية إنشاء محادثة خطية باستخدام Dialogflow
- كيفية إعداد عمليات تنفيذ الويب هوك باستخدام Dialogflow ووظائف Firebase
- كيفية إتاحة تطبيقك على "مساعد Google" باستخدام "مهام مع مساعد Google"
ما هي الخطوات التالية؟
هل أعجبك هذا الدرس العملي؟ ننصحك بالاطّلاع على هذه المعامل الرائعة.
واصِل هذا الدرس العملي من خلال دمجه في Google Chat:
إنشاء دليل تلفزيوني في Google Chat باستخدام G Suite وDialogflow
