یک ربات Slack با Node.js در Cloud Run بسازید

1. بررسی اجمالی

5f529fb87abc11c9.png

در این کد لبه، یاد خواهید گرفت که چگونه با استفاده از جعبه ابزار Botkit یک ربات Slack بسازید و آن را در Google Cloud اجرا کنید. می‌توانید در یک کانال زنده Slack با ربات تعامل داشته باشید.

چیزی که یاد خواهید گرفت

  • نحوه ایجاد یک ادغام سفارشی ربات در Slack
  • چگونه اسرار Slack خود را با Secret Manager ایمن کنید
  • نحوه استقرار یک ربات Slack در Cloud Run ، یک پلت فرم محاسباتی کاملاً مدیریت شده که به طور خودکار کانتینرهای بدون حالت شما را مقیاس می کند

آنچه شما نیاز دارید

چگونه از این آموزش استفاده خواهید کرد؟

فقط از طریق آن را بخوانید آن را بخوانید و تمرینات را کامل کنید

تجربه خود را با Google Cloud چگونه ارزیابی می کنید؟

تازه کار متوسط مسلط

2. راه اندازی و الزامات

تنظیم محیط خود به خود

  1. به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .

98e4187c97cf2e0e.png

37d264871000675d.png

c20a9642aaa18d11.png

  • نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. همیشه می توانید آن را به روز کنید.
  • شناسه پروژه در تمام پروژه‌های Google Cloud منحصربه‌فرد است و تغییرناپذیر است (پس از تنظیم نمی‌توان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید شناسه پروژه خود را ارجاع دهید (معمولاً با نام PROJECT_ID شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، می‌توانید خودتان را امتحان کنید، و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند.
  • برای اطلاع شما، یک مقدار سوم وجود دارد، یک شماره پروژه ، که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
  1. در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه هزینه زیادی نخواهد داشت. برای خاموش کردن منابع برای جلوگیری از تحمیل صورت‌حساب فراتر از این آموزش، می‌توانید منابعی را که ایجاد کرده‌اید حذف کنید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.

Cloud Shell را راه اندازی کنید

در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این آموزش شما از Cloud Shell استفاده می کنید، یک محیط خط فرمان که در Cloud اجرا می شود.

Cloud Shell را فعال کنید

  1. از Cloud Console، روی Activate Cloud Shell کلیک کنید d1264ca30785e435.png .

84688aa223b1c3a2.png

اگر این اولین باری است که Cloud Shell را راه اندازی می کنید، با یک صفحه میانی روبرو می شوید که آن را توصیف می کند. اگر با یک صفحه میانی مواجه شدید، روی Continue کلیک کنید.

d95252b003979716.png

تهیه و اتصال به Cloud Shell فقط باید چند لحظه طول بکشد.

7833d5e1c5d18f54.png

این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی ارائه می‌کند و در Google Cloud اجرا می‌شود، که عملکرد و احراز هویت شبکه را بسیار افزایش می‌دهد. بسیاری از کارهای شما، اگر نه همه، در این کد لبه با مرورگر قابل انجام است.

پس از اتصال به Cloud Shell، باید ببینید که احراز هویت شده اید و پروژه به ID پروژه شما تنظیم شده است.

  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. API ها را فعال کنید

از Cloud Shell، APIهای 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 بروید.
  • روی دکمه Create new app در گوشه سمت راست بالا کلیک کنید.
  • به برنامه یک نام مانند "Kittenbot" بدهید.
  • تیم Slack را در جایی که می‌خواهید نصب شود انتخاب کنید.

یک کاربر ربات ایجاد کنید

  • در پنل سمت چپ در قسمت Features به App Home بروید

414213b184fcc992.png

  • با کلیک بر روی Review Scopes to Add یک محدوده به توکن ربات خود اختصاص دهید
  • به پایین به Bot Token Scopes بروید و روی Add an OAuth Scope کلیک کنید. chat:write

74a6fa87c64c2b23.png

  • به بالا بروید و روی دکمه Install App to your Workspace کلیک کنید.
  • این برنامه را در تیم شما نصب می کند، کاربر رباتی را که ایجاد کرده اید اضافه می کند و یک نشانه ربات ایجاد می کند.
  • هنگامی که از شما خواسته شد، روی " Allow " کلیک کنید تا به ربات اجازه چت در فضای کاری شما داده شود.

پیام ها و دستورات را فعال کنید

  • به پایین بروید و به Show Tabs بروید و مطمئن شوید که هر دو گزینه فعال هستند:

5ca52f7abbdc15c.png

راز امضای مشتری را دریافت کنید

  • در زیر تنظیمات به اطلاعات پایه بروید.
  • به Signing Secret بروید، روی Show کلیک کنید و سپس راز را در کلیپ بورد خود کپی کنید:

74cfd6616fa71dc4.png

  • راز را در یک متغیر محیطی ذخیره کنید:
CLIENT_SIGNING_SECRET=PASTE_THE_SIGNING_SECRET

توکن ربات را دریافت کنید

  • در قسمت Features به OAuth & Permissions بروید.
  • روی دکمه Copy کلیک کنید تا متن Bot User OAuth Access Token را در کلیپ بورد خود کپی کنید.

6f5a18069471101.png

  • توکن ربات را در یک متغیر محیطی ذخیره کنید:
BOT_TOKEN=PASTE_THE_BOT_TOKEN

نگران نباشید. در صورت نیاز به دریافت مجدد این نشانه ها، می توانید از صفحه مدیریت برنامه ها به این صفحه پیکربندی بازگردید .

6. اسرار خود را ایمن کنید

ما می خواهیم اطمینان حاصل کنیم که رمز ربات و راز امضای مشتری شما به طور ایمن ذخیره می شوند. کدگذاری سخت آنها در کد منبع باعث می شود که به طور تصادفی این اسرار با انتشار آنها در کنترل نسخه یا جاسازی آنها در یک تصویر داکر فاش شود.

Secret Manager یک روش امن و راحت برای ذخیره کلیدهای API، گذرواژه‌ها، گواهی‌ها و سایر داده‌های حساس ارائه می‌دهد. 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 را فراخوانی می کند.
  • Buildpacks مانیفست package.json را شناسایی می کند و یک تصویر Node.js می سازد.
  • فیلد scripts.start نحوه راه اندازی برنامه را مشخص می کند.
  • فیلد engines.node نسخه Node.js تصویر پایه کانتینر را تعیین می کند.
  • در زمان استقرار، اصلاحات امنیتی شناخته شده به طور خودکار اعمال می شود.

شما آماده استقرار برنامه هستید!

8. برنامه را مستقر کنید

Slack Events API از webhook ها برای ارسال پیام های خروجی درباره رویدادها استفاده می کند. وقتی برنامه Slack را پیکربندی می‌کنید، باید یک URL در دسترس عموم برای Slack API برای پینگ ارائه دهید.

Cloud Run راه حل خوبی برای میزبانی از اهداف وب هوک است. این به شما امکان می دهد از هر زبان یا زمان اجرا که دوست دارید استفاده کنید و همزمانی را فراهم می کند، به این معنی که برنامه شما می تواند حجم بسیار بیشتری را مدیریت کند.

شناسه پروژه خود را بازیابی کنید

متغیر محیطی PROJECT_ID را تعریف کنید:

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

منطقه Cloud Run خود را تعریف کنید

Cloud Run منطقه‌ای است، به این معنی که زیرساختی که سرویس Cloud Run شما را اجرا می‌کند در یک منطقه خاص قرار دارد و توسط Google مدیریت می‌شود تا به‌طور اضافی در تمام مناطق آن منطقه در دسترس باشد. منطقه ای را که برای استقرار خود استفاده می کنید، تعریف کنید، به عنوان مثال:

REGION="us-central1"

مجوزها را به روز کنید

برای اینکه بتوانید از Secret Manager به اسرار دسترسی پیدا کنید، به حساب سرویس Cloud Run باید role 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 دریافت خواهید کرد. برای تأیید اعتبار روی 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 استفاده می شود. آن را در کلیپ بورد خود کپی کنید تا در مرحله بعد از آن استفاده کنید.

سرویس شما اکنون زنده و در دسترس عموم است! برای اطلاعات بیشتر به کنسول Cloud Run بروید. 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

روی Save Changes در پایین صفحه کلیک کنید. از شما خواسته می شود که برنامه خود را مجدداً نصب کنید . از طریق دستورات بروید و روی Allow کلیک کنید.

در این مرحله، ربات شما کاملاً یکپارچه شده است! پیام‌های موجود در فضای کاری Slack را تحریک می‌کند تا پیام‌هایی را به سرویس Cloud Run شما ارسال کند، که به نوبه خود با یک سلام ساده پاسخ می‌دهد.

10. ربات خود را تست کنید

ارسال یک پیام مستقیم به Kittenbot:

1f442dd7fd7b5773.png

با وارد کردن "kittenbot@" و سپس کلیک روی "دعوت از آنها"، kittenbot را به کانال خود اضافه کنید:

9788d2167ce47167.png

اکنون همه افراد در کانال شما می توانند با Kittenbot تعامل داشته باشند!

9c0d1d7907a51767.png

هر پیام در Slack یک رویداد را راه‌اندازی می‌کند و یک پیام HTTP POST به سرویس Cloud Run ما ارسال می‌کند. اگر به گزارش‌های سرویس Cloud Run نگاهی بیندازید، خواهید دید که هر پیام مربوط به یک ورودی POST در گزارش است.

1ff0c2347bf464e8.png

بچه گربه به هر پیامی با "میو. 😺" پاسخ می دهد.

11. پاداش - ربات خود را به روز کنید

این بخش اختیاری باید چند دقیقه طول بکشد. با خیال راحت مستقیم به پاکسازی بروید.

موضوعات گفتگو

ما دوست داریم ربات بیشتر از گفتن "میو" انجام دهد. اما چگونه می‌توان نسخه جدیدی از چیزی را که در Cloud Run اجرا می‌شود، مستقر کرد؟

دایرکتوری را به cloud-slack-bot/extra-credit تغییر دهید:

cd ../extra-credit/

پوشه فعلی را در Cloud Shell Editor باز کنید:

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(() => {
    // ...
  });
}

دیالوگ را فعال کنید

اکنون که دیالوگ برای استفاده از کنترلر در دسترس است، ببینید وقتی چت ربات «kitten»، «kittens»، «cat» یا «cats» را می‌شنود، چگونه مکالمه شروع می‌شود:

  // ...

  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 را فعال کنید

  • به بخش دستورات اسلش در قسمت ویژگی‌های صفحه مدیریت برنامه‌ها بروید.
  • روی Create New Command کلیک کنید.
  • یک فرمان /cats را با URL سرویس kittenbot خود پیکربندی کنید. به یاد داشته باشید که از همان نقطه پایانی که برای فعال کردن رویدادهای API استفاده کردید استفاده کنید! این نشانی اینترنتی شما به اضافه '/api/messages' است.

e34d393c14308f28.png

  • برای به‌روزرسانی برنامه و مجوزهای خود، فرمان را دنبال کنید.

دستورات اسلش را به کنترلر خود اضافه کنید

ببینید چگونه یک کنترل کننده برای دستورات اسلش در تابع 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

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

در نهایت، سطل ساخت ابر را حذف کنید:

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

مراحل بعدی

بیشتر بدانید