1. نظرة عامة

في هذا الدرس التطبيقي حول الترميز، ستتعلّم كيفية إنشاء روبوت Slack باستخدام مجموعة أدوات Botkit وتشغيله على Google Cloud. ستتمكّن من التفاعل مع الروبوت في قناة Slack مباشرة.
أهداف الدورة التعليمية
- كيفية إنشاء عملية تكامل مخصّصة لروبوت في Slack
- كيفية تأمين أسرار Slack باستخدام Secret Manager
- كيفية نشر روبوت دردشة Slack على Cloud Run، وهو نظام حوسبة أساسي مُدار بالكامل يضبط تلقائيًا الحاويات التي لا تتضمّن حالة
المتطلبات
كيف ستستخدم هذا البرنامج التعليمي؟
كيف تقيّم تجربتك مع Google Cloud؟
2. الإعداد والمتطلبات
إعداد البيئة بالسرعة التي تناسبك
- سجِّل الدخول إلى Google Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.



- اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديلها في أي وقت.
- رقم تعريف المشروع هو معرّف فريد في جميع مشاريع Google Cloud ولا يمكن تغييره بعد ضبطه. تنشئ Cloud Console تلقائيًا سلسلة فريدة، ولا يهمّك عادةً ما هي. في معظم دروس البرمجة، عليك الرجوع إلى رقم تعريف مشروعك (يُشار إليه عادةً باسم
PROJECT_ID). إذا لم يعجبك المعرّف الذي تم إنشاؤه، يمكنك إنشاء معرّف عشوائي آخر. يمكنك بدلاً من ذلك تجربة اسم مستخدم من اختيارك ومعرفة ما إذا كان متاحًا. لا يمكن تغيير هذا الخيار بعد هذه الخطوة وسيظل ساريًا طوال مدة المشروع. - للعلم، هناك قيمة ثالثة، وهي رقم المشروع، تستخدمها بعض واجهات برمجة التطبيقات. يمكنك الاطّلاع على مزيد من المعلومات عن كل هذه القيم الثلاث في المستندات.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد/واجهات برمجة تطبيقات Cloud. لن تكلفك تجربة هذا الدرس التطبيقي حول الترميز الكثير، إن وُجدت أي تكلفة على الإطلاق. لإيقاف الموارد وتجنُّب تحمّل تكاليف تتجاوز هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع. يمكن لمستخدمي Google Cloud الجدد الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.
بدء Cloud Shell
على الرغم من إمكانية تشغيل Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا البرنامج التعليمي Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.
تفعيل Cloud Shell
- من Cloud Console، انقر على تفعيل Cloud Shell
.

إذا كانت هذه هي المرة الأولى التي تبدأ فيها Cloud Shell، ستظهر لك شاشة وسيطة توضّح ماهية هذه الخدمة. إذا ظهرت لك شاشة وسيطة، انقر على متابعة.

يستغرق توفير Cloud Shell والاتصال به بضع لحظات فقط.

يتم تحميل هذا الجهاز الافتراضي بجميع أدوات التطوير اللازمة. توفّر هذه الخدمة دليلًا رئيسيًا دائمًا بسعة 5 غيغابايت وتعمل في Google Cloud، ما يؤدي إلى تحسين أداء الشبكة والمصادقة بشكل كبير. يمكن إنجاز معظم عملك في هذا الدرس التطبيقي حول الترميز، إن لم يكن كله، باستخدام متصفح.
بعد الاتصال بـ Cloud Shell، من المفترض أن يظهر لك أنّه تم إثبات هويتك وأنّه تم ضبط المشروع على رقم تعريف مشروعك.
- نفِّذ الأمر التالي في Cloud Shell للتأكّد من إكمال عملية المصادقة:
gcloud auth list
ناتج الأمر
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- نفِّذ الأمر التالي في Cloud Shell للتأكّد من أنّ أمر gcloud يعرف مشروعك:
gcloud config list project
ناتج الأمر
[core] project = <PROJECT_ID>
إذا لم يكن كذلك، يمكنك تعيينه من خلال هذا الأمر:
gcloud config set project <PROJECT_ID>
ناتج الأمر
Updated property [core/project].
3- تفعيل واجهات برمجة التطبيقات
من Cloud Shell، فعِّل واجهات برمجة التطبيقات Artifact Registry وCloud Build وCloud Run وSecret Manager:
gcloud services enable \ artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ run.googleapis.com \ secretmanager.googleapis.com
سيؤدي ذلك إلى عرض رسالة نجاح مشابهة لما يلي:
Operation "operations/..." finished successfully.
أنت الآن جاهز لتحضير تطبيقك ونشره...
4. إنشاء مساحة عمل على Slack
ستحتاج إلى مساحة عمل على Slack يُسمح لك فيها بإنشاء عمليات دمج مخصّصة. يمكنك إنشاء مساحة عمل مجانًا إذا لم يكن لديك مساحة عمل تريد استخدامها لهذا البرنامج التعليمي.

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

- عيِّن نطاقًا لرمز برنامج التتبُّع من خلال النقر على مراجعة النطاقات المراد إضافتها.
- مرِّر للأسفل إلى نطاقات رموز برامج التتبُّع وانقر على إضافة نطاق OAuth. اختَر
chat:write"إرسال الرسائل باسم Kittenbot"

- انتقِل للأعلى وانقر على الزر تثبيت التطبيق في مساحة عملك (Install App to your Workspace).
- سيؤدي ذلك إلى تثبيت التطبيق لفريقك وإضافة مستخدم برنامج التتبُّع الذي أنشأته للتو وإنشاء رمز مميّز لبرنامج التتبُّع.
- عندما يُطلب منك ذلك، انقر على السماح لمنح برنامج التتبُّع الإذن بالمحادثة في مساحة عملك.
تفعيل الرسائل والأوامر
- انتقِل للأسفل إلى عرض علامات التبويب وتأكَّد من تفعيل الخيارَين التاليَين:

الحصول على سرّ توقيع العميل
- انتقِل إلى المعلومات الأساسية ضِمن الإعدادات.
- انتقِل إلى الرمز السرّي للتوقيع، وانقر على عرض، ثم انسخ الرمز السرّي إلى الحافظة:

- احفظ كلمة المرور في متغيّر بيئة:
CLIENT_SIGNING_SECRET=PASTE_THE_SIGNING_SECRET
الحصول على رمز الروبوت
- انتقِل إلى OAuth والأذونات ضمن الميزات.
- انقر على الزر نسخ لنسخ نص رمز الدخول إلى OAuth لمستخدم الروبوت إلى الحافظة.

- احفظ رمز الروبوت المميّز في متغيّر بيئة:
BOT_TOKEN=PASTE_THE_BOT_TOKEN
لا داعي للقلق. يمكنك الرجوع إلى صفحة الإعدادات هذه من صفحة إدارة التطبيقات إذا كنت بحاجة إلى الحصول على هذه الرموز المميزة مرة أخرى.
6. حماية أسرارك
نريد التأكّد من تخزين رمز روبوتك وسر توقيع العميل بشكل آمن. يؤدي تضمينها في الرمز المصدر إلى زيادة احتمالية الكشف عن هذه الأسرار عن طريق الخطأ من خلال نشرها في نظام التحكم في الإصدارات أو تضمينها في صورة Docker.
توفّر خدمة Secret Manager طريقة آمنة ومريحة لتخزين مفاتيح واجهة برمجة التطبيقات وكلمات المرور والشهادات وغيرها من البيانات الحساسة. توفّر خدمة Secret Manager مكانًا مركزيًا ومصدرًا واحدًا موثوقًا لإدارة الأسرار والوصول إليها وتدقيقها على مستوى Google Cloud.
إنشاء أسرارك
احفظ سر توقيع العميل ورمز البوت المميز باستخدام الأوامر التالية:
- سر التوقيع الخاص بالعميل
echo -n $CLIENT_SIGNING_SECRET | gcloud secrets create client-signing-secret \ --replication-policy automatic \ --data-file -
- رمز برنامج التتبّع
echo -n $BOT_TOKEN | gcloud secrets create bot-token \ --replication-policy automatic \ --data-file -
الوصول إلى "المفاتيح السرية"
لنؤكّد أنّ أسرارك تم إنشاؤها بشكلٍ سليم وأنّ أذوناتك تعمل. يمكنك الوصول إلى أسرارك باستخدام الأوامر التالية:
echo $(gcloud secrets versions access 1 --secret client-signing-secret) echo $(gcloud secrets versions access 1 --secret bot-token)
يمكنك أيضًا عرض أسرارك وإدارتها في وحدة تحكّم Google Cloud.
7. الحصول على الرمز النموذجي
في Cloud Shell على سطر الأوامر، نفِّذ الأمر التالي لاستنساخ مستودع GitHub:
git clone https://github.com/googlecodelabs/cloud-slack-bot.git
غيِّر الدليل إلى cloud-slack-bot/start.
cd cloud-slack-bot/start
فهم القانون
افتح ملف kittenbot.js باستخدام محرّر سطر الأوامر المفضّل لديك (nano أو vim أو emacs أو غيرها) أو باستخدام الأمر التالي لفتح المجلد الحالي مباشرةً في Cloud Shell Editor:
cloudshell workspace .
يتضمّن رمز kittenbot وظيفتَين رئيسيتَين. أحدهما لاسترداد المفاتيح السرية، والآخر لتشغيل برنامج التتبُّع.
أولاً، نستورد التبعيات:
kittenbot.js
const { Botkit } = require('botkit');
const {
SlackAdapter,
SlackEventMiddleware,
} = require('botbuilder-adapter-slack');
const { SecretManagerServiceClient } = require('@google-cloud/secret-manager');
SlackAdapter وSlackEventMiddleware هما حزمتان توسّعان Botkit وتسمحان لبرنامج التتبُّع بترجمة الرسائل بسهولة من وإلى واجهة برمجة التطبيقات Slack API. سيسمح لك برنامج Secret Manager بالوصول إلى الأسرار التي حفظتها في خطوة سابقة.
بعد ذلك، لدينا الدالة الخاصة باسترداد الأسرار:
/**
* Returns the secret string from Google Cloud Secret Manager
* @param {string} name The name of the secret.
* @return {Promise<string>} The string value of the secret.
*/
async function accessSecretVersion(name) {
const client = new SecretManagerServiceClient();
const projectId = process.env.PROJECT_ID;
const [version] = await client.accessSecretVersion({
name: `projects/${projectId}/secrets/${name}/versions/1`,
});
// Extract the payload as a string.
const payload = version.payload.data.toString('utf8');
return payload;
}
تعرض هذه الدالة قيم السلسلة الخاصة بالأسرار اللازمة لمصادقة البوت.
تعمل الدالة التالية على تهيئة البوت:
/**
* Function to initialize kittenbot.
*/
async function kittenbotInit() {
const adapter = new SlackAdapter({
clientSigningSecret: await accessSecretVersion('client-signing-secret'),
botToken: await accessSecretVersion('bot-token'),
});
adapter.use(new SlackEventMiddleware());
const controller = new Botkit({
webhook_uri: '/api/messages',
adapter: adapter,
});
controller.ready(() => {
controller.hears(
['hello', 'hi', 'hey'],
['message', 'direct_message'],
async (bot, message) => {
await bot.reply(message, 'Meow. :smile_cat:');
}
);
});
}
يضبط الجزء الأول من الدالة SlackAdapter باستخدام الأسرار، ثم يحدّد نقطة نهاية لتلقّي الرسائل. بعد تشغيل وحدة التحكّم، سيردّ البوت على أي رسالة تحتوي على "مرحبًا" أو "أهلاً" أو "مرحبًا" بالرسالة "مواء. 😺".
اطّلِع على الأجزاء المحدّدة التالية في بيان التطبيق:
package.json
{
// ...
"scripts": {
"start": "node kittenbot.js",
// ...
},
"engines": {
"node": "16"
},
// ...
}
يمكنك نشر تطبيق Node.js مباشرةً من المصدر باستخدام Cloud Run. سيحدث ما يلي في الخلفية:
- يطلب Cloud Run من Cloud Build إنشاء صورة حاوية (راجِع مقالة النشر من رمز المصدر).
- إذا كان ملف
Dockerfileمتوفّرًا في دليل رمز المصدر، تستخدمه Cloud Build لإنشاء صورة حاوية. - بما أنّها ليست كذلك، تستدعي Cloud Build Buildpacks لتحليل المصدر وإنشاء صورة جاهزة للنشر تلقائيًا.
- ترصد حِزم الإنشاء بيان
package.jsonوتنشئ صورة Node.js. - يحدّد الحقل
scripts.startطريقة بدء تشغيل التطبيق. - يحدّد الحقل
engines.nodeإصدار Node.js لصورة الحاوية الأساسية. - يتم تلقائيًا تطبيق إصلاحات الأمان المعروفة في وقت النشر.
أنت الآن جاهز لنشر التطبيق.
8. نشر التطبيق
تستخدِم Slack Events API الويب هوك لإرسال رسائل صادرة حول الأحداث. عند إعداد تطبيق Slack، عليك تقديم عنوان URL متاح للجميع لكي ترسل واجهة برمجة التطبيقات في Slack إشارة إليه.
Cloud Run هو حلّ جيد لاستضافة أهداف Webhook. تتيح لك هذه الخدمة استخدام أي لغة أو وقت تشغيل تفضّلهما، كما توفّر التزامن، ما يعني أنّ تطبيقك سيتمكّن من التعامل مع حجم أكبر بكثير.
استرداد رقم تعريف مشروعك
حدِّد متغيّر البيئة PROJECT_ID:
PROJECT_ID=$(gcloud config get-value core/project)
تحديد منطقة Cloud Run
Cloud Run هي خدمة إقليمية، ما يعني أنّ البنية الأساسية التي تشغّل خدمة Cloud Run تقع في منطقة معيّنة وتديرها Google لتكون متاحة بشكل متكرّر في جميع المناطق داخل تلك المنطقة. حدِّد المنطقة التي ستستخدمها للنشر، على سبيل المثال:
REGION="us-central1"
تعديل الأذونات
للوصول إلى الأسرار من Secret Manager، يجب منح حساب خدمة Cloud Run الدور roles/secretmanager.secretAccessor.
أولاً، احفظ حساب الخدمة التلقائي في متغيّر بيئي:
SERVICE_ACCOUNT=$(gcloud iam service-accounts list \ --format "value(email)" \ --filter "displayName:Compute Engine default service account")
تأكَّد من حفظ عنوان البريد الإلكتروني باتّباع الخطوات التالية:
echo $SERVICE_ACCOUNT
يكون حساب الخدمة بالتنسيق التالي: PROJECT_NUMBER-compute@developer.gserviceaccount.com.
بعد الحصول على عنوان البريد الإلكتروني، فعِّل الدور لحساب الخدمة باتّباع الخطوات التالية:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$SERVICE_ACCOUNT \ --role roles/secretmanager.secretAccessor
نشر التطبيق
تعرض خدمة Cloud Run نقطة نهاية فريدة وتوسّع نطاق البنية الأساسية تلقائيًا للتعامل مع الطلبات الواردة.
انشر التطبيق على Cloud Run:
gcloud run deploy kittenbot \ --source . \ --platform managed \ --region $REGION \ --set-env-vars PROJECT_ID=$PROJECT_ID \ --allow-unauthenticated
- يؤدي ذلك إلى إنشاء خدمة باسم
kittenbot. - يستخدم الخيار
--sourceالمجلد الحالي لإنشاء التطبيق باستخدام Cloud Build. ترصد Cloud Build تلقائيًا وجود الملفpackage.json. - يمكنك بدلاً من ذلك تحديد منطقة تلقائية باستخدام هذا الأمر:
gcloud config set run/region $REGION - يمكنك أيضًا جعل Cloud Run مُدارًا تلقائيًا باستخدام الأمر التالي:
gcloud config set run/platform managed - يضبط الخيار
--set-env-varsمتغيرات بيئة الخدمة. - يؤدي الخيار
--allow-unauthenticatedإلى إتاحة الخدمة للجميع.
في المرة الأولى، سيُطلب منك إنشاء مستودع Artifact Registry. انقر على "إدخال" للتحقّق من صحة الرمز:
Deploying from source requires an Artifact Registry Docker repository to store built containers. A repository named [cloud-run-source-deploy] in region [REGION] will be created. Do you want to continue (Y/n)?
سيؤدي ذلك إلى بدء تحميل رمز المصدر إلى مستودع Artifact Registry وإنشاء صورة الحاوية:
Building using Dockerfile and deploying container ... * Building and deploying new service... Building Container. OK Creating Container Repository... OK Uploading sources... * Building Container... Logs are available at ...
بعد ذلك، انتظِر لحظة حتى يكتمل الإنشاء والنشر. عند النجاح، يعرض سطر الأوامر عنوان URL للخدمة:
... OK Building and deploying new service... Done. OK Creating Container Repository... OK Uploading sources... OK Building Container... Logs are available at ... OK Creating Revision... Creating Service. OK Routing traffic... OK Setting IAM Policy... Done. Service [SERVICE]... has been deployed and is serving 100 percent of traffic. Service URL: https://SERVICE-PROJECTHASH-REGIONID.a.run.app
يمكنك الحصول على عنوان URL للخدمة باستخدام الأمر التالي:
SERVICE_URL=$( \ gcloud run services describe kittenbot \ --platform managed \ --region $REGION \ --format "value(status.url)" \ ) echo $SERVICE_URL
يكون تنسيق عنوان URL على النحو التالي:
https://kittenbot-PROJECTHASH-REGIONID.a.run.app
سيكون عنوان URL هذا هو الأساس المستخدَم لتفعيل واجهة برمجة التطبيقات Slack Events API. انسخها إلى الحافظة لاستخدامها في الخطوة التالية.
أصبحت خدمتك متاحة الآن للجميع. انتقِل إلى وحدة تحكّم Cloud Run لمزيد من المعلومات. 
يمكنك الاطّلاع على تاريخ إنشاء آخر نسخة معدَّلة، ومقدار عدد الزيارات التي تتلقّاها، والاطّلاع على السجلات. إذا نقرنا على السجلّات، يمكننا أن نرى أنّ وحدة التحكّم Botkit مفعّلة وجاهزة لتلقّي الرسائل.
لنبدأ الآن بإرسال الرسائل من قناة Slack.
9- تفعيل أحداث Slack
كما رأينا سابقًا، يحدّد رمز kittenbot نقطة نهاية نسبية لهدف webhook.
kittenbot.js
const controller = new Botkit({
webhook_uri: '/api/messages',
adapter: adapter,
});
وهذا يعني أنّ عنوان URL الكامل سيكون الجزء الأساسي من خدمة Cloud Run، بالإضافة إلى /api/messages.
تفعيل الأحداث
في صفحة إدارة التطبيقات، انتقِل إلى قسم الاشتراكات في الأحداث في الشريط الجانبي، وفعِّل خيار تفعيل الأحداث. أدخِل عنوان URL الخاص بالخدمة:
PASTE_THE_SERVICE_URL/api/messages

استنادًا إلى سرعة كتابة عنوان URL، قد يحاول النظام إثبات الملكية قبل الانتهاء من الكتابة. إذا تعذّر ذلك، انقر على "إعادة المحاولة".
اشتراك
الاشتراك في جميع أحداث برامج التتبُّع للرسائل

انقر على حفظ التغييرات في أسفل الصفحة. سيُطلب منك إعادة تثبيت تطبيقك. اتّبِع التعليمات وانقر على السماح.
في هذه المرحلة، يكون الروبوت قد تم دمجه بالكامل. ستؤدي الرسائل في مساحة العمل إلى أن يرسل Slack رسائل إلى خدمة Cloud Run، والتي ستردّ بدورها بتحية بسيطة.
10. اختبار روبوت الدردشة
إرسال رسالة مباشرة إلى Kittenbot:

أضِف kittenbot إلى قناتك من خلال إدخال "@kittenbot" ثم النقر على "دعوة":

يمكن الآن لجميع المستخدمين في قناتك التفاعل مع Kittenbot.

تؤدي كل رسالة في Slack إلى تشغيل حدث وإرسال رسالة HTTP POST إلى خدمة Cloud Run. إذا ألقيت نظرة على سجلّات خدمة Cloud Run، ستلاحظ أنّ كل رسالة تتوافق مع إدخال POST في السجلّ.

يردّ kittenbot على كل رسالة بـ "مواء". 😺".
11. مكافأة: تعديل روبوت الدردشة
من المفترَض أن يستغرق إكمال هذا القسم الاختياري بضع دقائق. يمكنك الانتقال مباشرةً إلى "تنظيف".
سلاسل المحادثات
نريد أن يقوم الروبوت بأكثر من مجرد قول "مواء". ولكن كيف يمكنك نشر إصدار جديد من تطبيق يعمل على Cloud Run؟
غيِّر الدليل إلى cloud-slack-bot/extra-credit:
cd ../extra-credit/
افتح المجلد الحالي في "محرِّر Cloud Shell":
cloudshell workspace .
توفّر أداة Botkit إمكانية التعامل مع المحادثات. باستخدام هذه الأدوات، يمكن أن يطلب البوت المزيد من المعلومات ويتفاعل مع الرسائل بما يتجاوز الرد بكلمة واحدة.
تحديد مربّع الحوار
أولاً، اطّلِع على كيفية تحديد الدوال الحوارية في نهاية الملف:
// ...
const maxCats = 20;
const catEmojis = [
':smile_cat:',
':smiley_cat:',
':joy_cat:',
':heart_eyes_cat:',
':smirk_cat:',
':kissing_cat:',
':scream_cat:',
':crying_cat_face:',
':pouting_cat:',
':cat:',
':cat2:',
':leopard:',
':lion_face:',
':tiger:',
':tiger2:',
];
/**
* Function to concatenate cat emojis
* @param {number} numCats Number of cat emojis.
* @return {string} The string message of cat emojis.
*/
function makeCatMessage(numCats) {
let catMessage = '';
for (let i = 0; i < numCats; i++) {
// Append a random cat from the list
catMessage += catEmojis[Math.floor(Math.random() * catEmojis.length)];
}
return catMessage;
}
/**
* Function to create the kitten conversation
* @param {Object} controller The botkit controller.
* @return {Object} The BotkitConversation object.
*/
function createKittenDialog(controller) {
const convo = new BotkitConversation('kitten-delivery', controller);
convo.ask('Does someone need a kitten delivery?', [
{
pattern: 'yes',
handler: async (response, convo, bot) => {
await convo.gotoThread('yes_kittens');
},
},
{
pattern: 'no',
handler: async (response, convo, bot) => {
await convo.gotoThread('no_kittens');
},
},
{
default: true,
handler: async (response, convo, bot) => {
await convo.gotoThread('default');
},
},
]);
convo.addQuestion(
'How many would you like?',
[
{
pattern: '^[0-9]+?',
handler: async (response, convo, bot, message) => {
const numCats = parseInt(response);
if (numCats > maxCats) {
await convo.gotoThread('too_many');
} else {
convo.setVar('full_cat_message', makeCatMessage(numCats));
await convo.gotoThread('cat_message');
}
},
},
{
default: true,
handler: async (response, convo, bot, message) => {
if (response) {
await convo.gotoThread('ask_again');
} else {
// The response '0' is interpreted as null
await convo.gotoThread('zero_kittens');
}
},
},
],
'num_kittens',
'yes_kittens'
);
// If numCats is too large, jump to start of the yes_kittens thread
convo.addMessage(
'Sorry, {{vars.num_kittens}} is too many cats. Pick a smaller number.',
'too_many'
);
convo.addAction('yes_kittens', 'too_many');
// If response is not a number, jump to start of the yes_kittens thread
convo.addMessage("Sorry I didn't understand that", 'ask_again');
convo.addAction('yes_kittens', 'ask_again');
// If numCats is 0, send a dog instead
convo.addMessage(
{
text:
'Sorry to hear you want zero kittens. ' +
'Here is a dog, instead. :dog:',
attachments: [
{
fallback: 'Chihuahua Bubbles - https://youtu.be/s84dBopsIe4',
text: '<https://youtu.be/s84dBopsIe4|' + 'Chihuahua Bubbles>!',
},
],
},
'zero_kittens'
);
// Send cat message
convo.addMessage('{{vars.full_cat_message}}', 'cat_message');
convo.addMessage('Perhaps later.', 'no_kittens');
return convo;
}
توجّه هذه المحادثة الجديدة سلسلة المحادثات استنادًا إلى الردود. على سبيل المثال، إذا أجاب المستخدم بـ "لا" على سؤال القطط الصغيرة، سينتقل إلى الرسالة المصنّفة "no_kittens"، وهي نهاية سلسلة المحادثات هذه.
إضافة مربّع الحوار إلى وحدة التحكّم
بعد تحديد المحادثة، تعرَّف على كيفية إضافتها إلى وحدة التحكّم:
async function kittenbotInit() {
// ...
const controller = new Botkit({
webhook_uri: '/api/messages',
adapter: adapter,
});
// Add Kitten Dialog
const convo = createKittenDialog(controller);
controller.addDialog(convo);
// Controller is ready
controller.ready(() => {
// ...
});
}
تفعيل مربّع الحوار
بعد أن أصبح مربّع الحوار هذا متاحًا لوحدة التحكّم، إليك كيفية بدء المحادثة عندما يسمع برنامج الدردشة الآلي الكلمات "قطة صغيرة" أو "قطط صغيرة" أو "قطة" أو "قطط":
// ...
controller.ready(() => {
controller.hears(
['hello', 'hi', 'hey'],
['message', 'direct_message'],
async (bot, message) => {
await bot.reply(message, 'Meow. :smile_cat:');
return;
}
);
// START: listen for cat emoji delivery
controller.hears(
['cat', 'cats', 'kitten', 'kittens'],
['message', 'direct_message'],
async (bot, message) => {
// Don't respond to self
if (message.bot_id !== message.user) {
await bot.startConversationInChannel(message.channel, message.user);
await bot.beginDialog('kitten-delivery');
return;
}
}
);
// END: listen for cat emoji delivery
// ...
});
// ...
تحديث التطبيق
أعِد نشر التطبيق على Cloud Run:
gcloud run deploy kittenbot \ --source . \ --platform managed \ --region $REGION \ --set-env-vars PROJECT_ID=$PROJECT_ID \ --allow-unauthenticated
جرّب بنفسك

تهانينا! لقد حدّثت للتو إصدارًا جديدًا من برنامج Slack آلي يعمل على Cloud Run.
أوامر تبدأ بشرطة مائلة
ماذا لو لم تكن تريد إجراء محادثة مع المستخدم؟ ماذا لو كنت تفضّل ببساطة تنفيذ إجراء من خلال أمر بسيط واحد؟
يوفّر Slack هذه الوظيفة من خلال الأوامر التي تبدأ بشرطة مائلة، والتي تتيح للمستخدمين استدعاء تطبيقك عن طريق إدخال الأمر في مربّع الرسالة.
تفعيل أوامر تبدأ بشرطة مائلة في Slack
- انتقِل إلى قسم أوامر الشرطة المائلة ضمن الميزات في صفحة "إدارة التطبيقات".
- انقر على إنشاء أمر جديد.
- اضبط أمر
/catsباستخدام عنوان URL الخاص بخدمة kittenbot. يُرجى تذكُّر استخدام نقطة النهاية نفسها التي استخدمتها لتفعيل Events API. هذا هو عنوان URL الخاص بك، بالإضافة إلى'/api/messages'.

- اتّبِع التعليمات لتعديل تطبيقك وأذوناته.
إضافة أوامر الشرطة المائلة إلى "وحدة التحكّم"
إليك كيفية إضافة معالج للأوامر التي تبدأ بشرطة مائلة داخل الدالة controller.ready:
// ...
// Controller is ready
controller.ready(() => {
// ...
// START: slash commands
controller.on('slash_command', async (bot, message) => {
const numCats = parseInt(message.text);
const response = makeCatMessage(numCats);
bot.httpBody({ text: response });
});
// END: slash commands
});
// ...
جرّب بنفسك
أدخِل /cats متبوعًا برقم لإرسال الأمر الذي يبدأ بشرطة مائلة. مثال: /cats 8

سيردّ الروبوت بـ 8 صور قطط، ولن تظهر هذه الصور إلا لك:

12. تنظيف
تهانينا، لديك الآن برنامج Slack آلي يعمل على Cloud Run. حان الوقت لتنظيف الموارد المستخدَمة (لتوفير التكاليف والالتزام بأفضل الممارسات في السحابة الإلكترونية).
حذف المشروع
يمكنك حذف المشروع بأكمله مباشرةً من Cloud Shell:
gcloud projects delete $PROJECT_ID
بدلاً من ذلك، إذا كنت تفضّل حذف المراجع المختلفة واحدًا تلو الآخر، انتقِل إلى القسم التالي.
حذف عملية النشر
gcloud run services delete kittenbot --region $REGION
مخرجات الأمر
Service [kittenbot] will be deleted. Do you want to continue (Y/n)? y Deleted service [kittenbot].
حذف سر توقيع العميل
gcloud secrets delete client-signing-secret
مخرجات الأمر
You are about to destroy the secret [client-signing-secret] and its [1] version(s). This action cannot be reversed. Do you want to continue (Y/n)? y Deleted secret [client-signing-secret].
حذف المفتاح السرّي لرمز روبوت الدردشة المميز
gcloud secrets delete bot-token
مخرجات الأمر
You are about to destroy the secret [bot-token] and its [1] version(s). This action cannot be reversed. Do you want to continue (Y/n)? y Deleted secret [bot-token].
حذف حِزم التخزين
أولاً، أدرِج حِزم Google Cloud Storage للحصول على مسار الحزمة:
gsutil ls
مخرجات الأمر
gs://[REGION.]artifacts.<PROJECT_ID>.appspot.com/ gs://<PROJECT_ID>_cloudbuild/
الآن، احذف حزمة العناصر:
gsutil rm -r gs://[REGION.]artifacts.${PROJECT_ID}.appspot.com/
مخرجات الأمر
Removing gs://[REGION.]artifacts.<PROJECT_ID>.appspot.com/...
أخيرًا، احذف حزمة Cloud Build:
gsutil rm -r gs://${PROJECT_ID}_cloudbuild/
مخرجات الأمر
Removing gs://<PROJECT_ID>_cloudbuild/...
13. تهانينا!

أصبحت تعرف الآن كيفية تشغيل روبوت دردشة Slack على Cloud Run.
لقد استعرضنا جزءًا بسيطًا من هذه التكنولوجيا، وننصحك باستكشاف المزيد من خلال عمليات نشر Cloud Run الخاصة بك.
المواضيع التي تناولناها
- إنشاء عملية دمج مخصّصة لروبوت في Slack
- تأمين أسرار Slack باستخدام Secret Manager
- نشر برنامج التتبُّع على Slack على Cloud Run
الخطوات التالية
- إكمال المزيد من البرامج التعليمية حول Cloud Run
مزيد من المعلومات
- يمكنك الاطّلاع على أمثلة أخرى على عمليات الدمج بين Google Cloud وSlack على GitHub.
- جرِّب ميزات Google Cloud الأخرى بنفسك. يمكنك الاطّلاع على البرامج التعليمية.