إنشاء روبوت Slack باستخدام Node.js على Cloud Run

1. نظرة عامة

5f529fb87abc11c9.png

في هذا الدرس التطبيقي حول الترميز، ستتعلّم كيفية إنشاء برنامج تتبُّع Slack باستخدام مجموعة أدوات Botkit وتشغيله على Google Cloud. ستتمكّن من التفاعل مع برنامج التتبُّع في قناة Slack مباشرة.

المُعطيات

  • كيفية إنشاء دمج مخصّص لبرنامج تتبُّع في Slack
  • كيفية تأمين أسرار Slack باستخدام المدير السري
  • كيفية نشر برنامج تتبُّع Slack على Cloud Run، وهو نظام حوسبة أساسي مُدار بالكامل يضبط تلقائيًا الحاويات التي لا تتضمّن حالة

المتطلبات

  • مشروع على Google Cloud
  • متصفح، مثل Chrome أو Firefox

كيف ستستخدم هذا البرنامج التعليمي؟

القراءة فقط اقرأها وأكمِل التمارين

ما هو تقييمك لتجربتك في استخدام Google Cloud؟

حديث متوسط بارع

2. الإعداد والمتطلبات

إعداد بيئة ذاتية

  1. سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

98e4187c97cf2e0e.png

37d264871000675d.png

c20a9642aaa18d11.png

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

بدء Cloud Shell

بينما يمكن إدارة Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا البرنامج التعليمي Cloud Shell، وهي بيئة سطر أوامر يتم تشغيلها في السحابة الإلكترونية.

تفعيل Cloud Shell

  1. من Cloud Console، انقر على تفعيل Cloud Shell d1264ca30785e435.png.

84688aa223b1c3a2.png

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

d95252b003979716.png

من المفترَض أن تستغرق عملية توفير المتطلبات اللازمة والاتصال بخدمة Cloud Shell بضع دقائق فقط.

7833d5e1c5d18f54.png

يتم تحميل هذا الجهاز الافتراضي مع جميع أدوات التطوير اللازمة. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت ويتم تشغيله في Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة. يمكنك تنفيذ معظم عملك، إن لم يكن كلّه، في هذا الدرس التطبيقي حول الترميز باستخدام متصفّح.

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

  1. شغِّل الأمر التالي في 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`
  1. شغّل الأمر التالي في 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 تتيح لك إنشاء عمليات دمج مخصّصة. يمكنك إنشاء مساحة عمل مجانًا إذا لم يكن لديك مساحة ترغب في استخدامها في هذا البرنامج التعليمي.

aa1f0fda82263bf8.png

5- إنشاء مستخدم لبرنامج تتبُّع Slack

يمكن لمستخدم برنامج التتبُّع الاستماع إلى الرسائل على Slack ونشر الرسائل وتحميل الملفات. ستنشئ في هذا الدرس التطبيقي برنامج تتبُّع لنشر رسالة ترحيب بسيطة.

إنشاء تطبيق Slack جديد

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

إنشاء مستخدم برنامج تتبُّع

  • انتقِل إلى الصفحة الرئيسية للتطبيق في اللوحة الجانبية اليمنى ضمن الميزات.

414213b184fcc992.png

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

74a6fa87c64c2b23.png

  • انتقِل للأعلى وانقر على الزر تثبيت التطبيق في Workspace.
  • سيؤدي هذا الإجراء إلى تثبيت التطبيق إلى فريقك وإضافة مستخدم روبوت الدردشة الذي أنشأته للتو وإنشاء رمز مميّز لبرنامج التتبُّع.
  • انقر على السماح عندما يُطلب منك ذلك. للسماح لبرنامج التتبُّع بالمحادثة في مساحة العمل.

تفعيل الرسائل والأوامر

  • انتقِل للأسفل من أجل عرض علامات التبويب وتأكَّد من تفعيل كلا الخيارين:

5ca52f7abbdc15c.png

الحصول على سر توقيع العميل

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

74cfd6616fa71dc4.png

  • حفظ المفتاح السرّي في متغيّر بيئة:
CLIENT_SIGNING_SECRET=PASTE_THE_SIGNING_SECRET

الحصول على الرمز المميز لبرنامج التتبُّع

  • انتقِل إلى OAuth الأذونات ضمن الميزات.
  • انقر على الزر نسخ لنسخ نص رمز الدخول إلى بروتوكول OAuth التابع لبرنامج التتبُّع إلى الحافظة.

6f5a18069471101.png

  • احفظ الرمز المميز لبرنامج التتبُّع في متغيّر بيئة:
BOT_TOKEN=PASTE_THE_BOT_TOKEN

لا داعي للقلق. يمكنك الرجوع إلى صفحة الإعداد هذه من صفحة إدارة التطبيقات إذا كنت بحاجة إلى الحصول على هذه الرموز المميزة مرة أخرى.

6- احمِ أسرارك

نريد التأكّد من أنّ الرمز المميّز لبرنامج التتبُّع وسر توقيع العميل قد تم تخزينه بأمان. ويؤدي الترميز الثابت في رمز المصدر إلى الكشف عن هذه الأسرار عن طريق الخطأ عن طريق نشرها للتحكم في الإصدار أو تضمينها في صورة Docker.

يوفّر المدير السري طريقة آمنة وملائمة لتخزين مفاتيح واجهة برمجة التطبيقات وكلمات المرور والشهادات وغيرها من البيانات الحسّاسة. يوفّر 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:

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. سيسمح لك عميل "المدير السري" بالوصول إلى المفاتيح السرّية التي حفظتها في خطوة سابقة.

بعد ذلك، لدينا دالتنا لاسترداد الأسرار:

/**
 * 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 Build لإنشاء صورة حاوية (راجِع النشر من رمز المصدر).
  • في حال توفّر Dockerfile في دليل رمز المصدر، تستخدمه Cloud Build لإنشاء صورة حاوية.
  • ونظرًا إلى أنّها ليست كذلك، تطلب خدمة Cloud Build Buildpacks لتحليل المصدر وإنشاء صورة جاهزة للإنتاج تلقائيًا.
  • ترصد Buildpacks ملف البيان package.json وتنشئ صورة Node.js.
  • يحدّد حقل scripts.start طريقة تشغيل التطبيق.
  • يحدد الحقل engines.node إصدار Node.js للصورة الأساسية للحاوية.
  • في وقت النشر، يتم تطبيق إصلاحات الأمان المعروفة تلقائيًا.

أنت جاهز لنشر التطبيق!

8. نشر التطبيق

تستخدم Slack Events API الردود التلقائية على الويب لإرسال رسائل صادرة عن الأحداث. عند تهيئة تطبيق Slack، يجب تقديم عنوان URL متاح للجميع لكي تتمكّن واجهة برمجة تطبيقات Slack من الاتصال به.

ويُعد Cloud Run حلاً جيدًا لاستضافة أهداف الرد التلقائي على الويب. وهو يتيح لك استخدام أي لغة أو وقت تشغيل من اختيارك، كما أنّه يوفّر تزامنًا، ما يعني أنّ تطبيقك سيتمكّن من التعامل مع حجم أكبر من البيانات.

استرداد رقم تعريف مشروعك

تحديد متغير بيئة PROJECT_ID:

PROJECT_ID=$(gcloud config get-value core/project)

تحديد منطقة Cloud Run

إنّ Cloud Run هو نظام إقليمي، ما يعني أنّ البنية الأساسية التي تدير خدمة Cloud Run تقع في منطقة محدّدة وتديرها Google لتكون متاحة بشكلٍ متكرّر في جميع المناطق ضمن تلك المنطقة. حدِّد المنطقة التي ستستخدمها في عملية النشر، مثل:

REGION="us-central1"

تعديل الأذونات

للوصول إلى الأسرار من "المدير السري"، يجب منح حساب خدمة 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:

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. انقر على Enter للتحقّق من صحة ما يلي:

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. انسخها إلى الحافظة لاستخدامها في الخطوة التالية.

أصبحت خدمتك مباشرة الآن ومتاحة للجميع. انتقِل إلى وحدة تحكُّم التشغيل في السحابة الإلكترونية للحصول على مزيد من المعلومات. fee46ea7c8483d56.png

يمكنك معرفة وقت إنشاء آخر نسخة سابقة وعدد الزيارات التي تتلقّاها والاطّلاع على السجلات. إذا نقرنا على السجلّات، يتبيّن لنا أنّ وحدة التحكّم في Botkit قيد التشغيل وجاهزة لتلقّي الرسائل.

لنبدأ الآن بإرسال الرسائل من قناة Slack.

9. تفعيل أحداث Slack

كما رأينا سابقًا، يحدد رمز kittenbot نقطة نهاية نسبية لهدف الرد التلقائي على الويب.

kittenbot.js

 const controller = new Botkit({
    webhook_uri: '/api/messages',
    adapter: adapter,
  });

وهذا يعني أنّ عنوان URL الكامل سيكون الجزء الأساسي من خدمة Cloud Run، بالإضافة إلى /api/messages.

تفعيل الأحداث

في صفحة إدارة التطبيقات، انتقِل إلى قسم الاشتراكات في الأحداث على الشريط الجانبي، وفعِّل الخيار تفعيل الأحداث. إدخال عنوان URL للخدمة:

PASTE_THE_SERVICE_URL/api/messages

5179a99339839999.png

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

اشتراك

يمكنك الاشتراك في جميع أحداث برامج تتبُّع الرسائل.

1e8f200390908a9b.png

انقر على حفظ التغييرات في أسفل الصفحة. سيُطلب منك إعادة تثبيت تطبيقك. اتّبِع التعليمات التي تظهر على الشاشة وانقر على السماح.

في هذه المرحلة، يصبح روبوت الدردشة جاهزًا بالكامل. سيؤدي استخدام الرسائل في مساحة العمل إلى إرسال رسائل Slack إلى خدمة Cloud Run الخاصة بك، والتي ستستجيب بتحية بسيطة.

10. اختبار روبوت الدردشة

إرسال رسالة مباشرة إلى Kittenbot:

1f442dd7fd7b5773.png

يُرجى إضافة kittenbot إلى قناتك من خلال إدخال "@kittenbot". ثم النقر على "دعوتهم":

9788d2167ce47167.png

أصبح بإمكان جميع المستخدمين في قناتك التفاعل مع Kittenbot.

9c0d1d7907a51767.png

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

1ff0c2347bf464e8.png

يستجيب الهريرة الصغيرة على كل رسالة بقول "Meow. 😎".

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

جرّب بنفسك

eca12b3463850d52.png

تهانينا! لقد حدّثت للتو برنامج تتبُّع Slack قيد التشغيل على Cloud Run إلى إصدار جديد.

الأوامر التي تبدأ بشرطة مائلة

ماذا لو لم تكن تريد إجراء محادثة مع المستخدم؟ ماذا لو كنت تفضّل تشغيل إجراء باستخدام أمر واحد بسيط؟

يوفّر Slack هذه الوظيفة من خلال أوامر Slash، التي تسمح للمستخدمين باستدعاء تطبيقك عن طريق إدخال الأمر في مربّع الرسالة.

تفعيل أوامر Slack Slash

  • انتقِل إلى قسم أوامر Slash ضمن الميزات في صفحة "إدارة التطبيقات".
  • انقر على إنشاء أمر جديد.
  • اضبط الأمر /cats باستخدام عنوان URL لخدمة kittenbot. تذكَّر استخدام نقطة النهاية نفسها التي استخدمتها لتفعيل واجهة برمجة تطبيقات الأحداث. هذا هو عنوان URL الخاص بك، بالإضافة إلى '/api/messages'.

e34d393c14308f28.png

  • اتّبِع التعليمات لتحديث التطبيق والأذونات.

إضافة أوامر Slash إلى وحدة التحكّم

اطّلِع على كيفية إضافة معالج للأوامر التي تبدأ بشرطة مائلة داخل دالة console.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

c67f6fe1ffcafec8.png

سيردّ برنامج التتبُّع على شكل 8 قطط، ولا يمكن لأحد سواك الاطّلاع عليها:

9c1b256987fd379a.png

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/...

أخيرًا، احذف حزمة Cloudbuild:

gsutil rm -r gs://${PROJECT_ID}_cloudbuild/

مخرجات الأمر

Removing gs://<PROJECT_ID>_cloudbuild/...

13. تهانينا!

528302981979de90.png

أصبحت تعرف الآن كيفية تشغيل برنامج تتبُّع Slack على Cloud Run.

لقد تعمقنا في استكشاف هذه التكنولوجيا فقط، وننصحك باستكشاف المزيد من خلال عمليات نشر Cloud Run.

المواضيع التي تناولناها

  • إنشاء تكامل مخصّص لبرنامج تتبُّع في Slack
  • حافِظ على أسرارك في Slack باستخدام Secret Manager
  • نشر برنامج تتبُّع Slack على Cloud Run

الخطوات التالية

مزيد من المعلومات