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

۱. مرور کلی

5f529fb87abc11c9.png

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

آنچه یاد خواهید گرفت

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

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

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

فقط تا انتها بخوانید آن را بخوانید و تمرین‌ها را انجام دهید

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

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

۲. تنظیمات و الزامات

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

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

98e4187c97cf2e0e.png

37d264871000675d.png

c20a9642aaa18d11.png

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

شروع پوسته ابری

اگرچه می‌توان از راه دور و از طریق لپ‌تاپ، گوگل کلود را مدیریت کرد، اما در این آموزش از Cloud Shell ، یک محیط خط فرمان که در فضای ابری اجرا می‌شود، استفاده خواهید کرد.

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

  1. از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید d1264ca30785e435.png .

۸۴۶۸۸aa۲۲۳b۱c۳a۲.png

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

d95252b003979716.png

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

7833d5e1c5d18f54.png

این ماشین مجازی مجهز به تمام ابزارهای توسعه مورد نیاز است. این ماشین یک دایرکتوری خانگی پایدار ۵ گیگابایتی ارائه می‌دهد و در فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی افزایش می‌دهد. بخش عمده‌ای از کار شما در این آزمایشگاه کد، اگر نگوییم همه، را می‌توان با یک مرورگر انجام داد.

پس از اتصال به 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].

۳. فعال کردن APIها

از 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.

اکنون، شما آماده آماده‌سازی و استقرار برنامه خود هستید...

۴. یک فضای کاری Slack ایجاد کنید

شما به یک فضای کاری Slack نیاز دارید که در آن بتوانید ادغام‌های سفارشی ایجاد کنید. اگر از قبل فضای کاری ندارید که بخواهید برای این آموزش از آن استفاده کنید، می‌توانید آن را به صورت رایگان ایجاد کنید .

aa1f0fda82263bf8.png

۵. یک کاربر ربات Slack ایجاد کنید

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

یک برنامه Slack جدید ایجاد کنید

  • به صفحه مدیریت برنامه‌های Slack بروید.
  • روی دکمه‌ی «ایجاد برنامه‌ی جدید» در گوشه‌ی بالا سمت راست کلیک کنید.
  • به برنامه یک نام بدهید، مثلاً «Kittenbot».
  • تیم Slack را که می‌خواهید در آن نصب شود، انتخاب کنید.

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

  • به صفحه اصلی برنامه در پنل سمت چپ، زیر بخش ویژگی‌ها بروید

414213b184fcc992.png

  • با کلیک روی «بررسی محدوده‌ها برای افزودن»، یک محدوده به توکن ربات خود اختصاص دهید.
  • به پایین اسکرول کنید تا به Bot Token Scopes برسید و روی Add an OAuth Scope کلیک کنید. گزینه chat:write را برای "ارسال پیام به عنوان Kittenbot" انتخاب کنید.

74a6fa87c64c2b23.png

  • به بالا بروید و روی دکمه‌ی «نصب برنامه در فضای کاری» کلیک کنید.
  • این کار برنامه را روی تیم شما نصب می‌کند، کاربر رباتی که ایجاد کرده‌اید را اضافه می‌کند و یک توکن ربات تولید می‌کند.
  • وقتی از شما خواسته شد، روی « مجاز » کلیک کنید تا به ربات اجازه دهید در فضای کاری شما چت کند.

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

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

5ca52f7abbdc15c.png

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

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

74cfd6616fa71dc4.png

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

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

  • به بخش «ویژگی‌ها» (Features) بروید و به بخش «OAuth & Permissions» بروید.
  • برای کپی کردن متن Bot User OAuth Access Token در کلیپ‌بورد خود، روی دکمه کپی کلیک کنید.

6f5a18069471101.png

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

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

۶. اسرار خود را ایمن نگه دارید

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

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 مشاهده و مدیریت کنید.

۷. کد نمونه را دریافت کنید

در خط فرمان 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 دو عملکرد اصلی دارد. یکی بازیابی اسرار و دیگری اجرای ربات.

ابتدا، وابستگی‌ها را وارد می‌کنیم:

کیتن‌بات.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 را با رمزها پیکربندی می‌کند و سپس یک نقطه پایانی برای دریافت پیام‌ها مشخص می‌کند. سپس، به محض روشن شدن کنترلر، ربات به هر پیامی که حاوی "hello"، "hi" یا "hey" باشد با "Meow. 😺" پاسخ می‌دهد.

این بخش‌های خاص را در مانیفست برنامه بررسی کنید:

بسته.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 manifest را شناسایی کرده و یک تصویر Node.js می‌سازد.
  • فیلد scripts.start نحوه شروع برنامه را تعیین می‌کند.
  • فیلد engines.node نسخه Node.js از تصویر پایه کانتینر را تعیین می‌کند.
  • در زمان استقرار، اصلاحات امنیتی شناخته‌شده به‌طور خودکار اعمال می‌شوند.

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

۸. اپلیکیشن را مستقر کنید

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

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

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

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

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

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

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

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 ایجاد کنید. برای تأیید، 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

با این دستور می‌توانید آدرس سرویس را دریافت کنید:

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 خود کنیم!

۹. رویدادهای Slack را فعال کنید

همانطور که قبلاً دیدیم، کد kittenbot ما یک نقطه پایانی نسبی برای هدف وب‌هوک ما مشخص می‌کند.

کیتن‌بات.js

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

این یعنی، آدرس اینترنتی کامل ما بخش پایه از سرویس Cloud Run به علاوه /api/messages خواهد بود.

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

در صفحه مدیریت برنامه‌ها ، به بخش اشتراک رویدادها در نوار کناری بروید و گزینه فعال کردن رویدادها را فعال کنید. آدرس اینترنتی سرویس خود را وارد کنید:

PASTE_THE_SERVICE_URL/api/messages

5179a99339839999.png

بسته به سرعت تایپ URL، ممکن است قبل از اتمام کار شما، سعی در تأیید آن داشته باشد. در صورت عدم موفقیت، روی «امتحان مجدد» کلیک کنید.

اشتراک

در تمام رویدادهای ربات پیام‌رسان مشترک شوید.

1e8f200390908a9b.png

روی ذخیره تغییرات در پایین صفحه کلیک کنید. از شما خواسته می‌شود که برنامه خود را دوباره نصب کنید . مراحل را دنبال کنید و روی اجازه دادن کلیک کنید.

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

۱۰. ربات خود را آزمایش کنید

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

۱f442dd7fd7b5773.png

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

9788d2167ce47167.png

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

9c0d1d7907a51767.png

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

۱ff0c2347bf464e8.png

این بچه گربه ربات به هر پیام با صدای «میو میو» پاسخ می‌دهد.

۱۱. جایزه - ربات خود را به‌روزرسانی کنید

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

موضوعات مکالمه‌ای

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

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

cd ../extra-credit/

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

cloudshell workspace .

بات‌کیت قابلیت مدیریت مکالمات را ارائه می‌دهد. با این قابلیت، ربات می‌تواند اطلاعات بیشتری درخواست کند و به پیام‌ها فراتر از یک پاسخ تک کلمه‌ای واکنش نشان دهد.

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

ابتدا، ببینید که توابع محاوره‌ای در انتهای فایل چگونه تعریف شده‌اند:

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

  • در صفحه مدیریت برنامه‌ها، به بخش دستورات اسلش (Slash Commands) در زیر بخش ویژگی‌ها (Features) بروید.
  • روی ایجاد دستور جدید کلیک کنید.
  • دستور /cats را با آدرس اینترنتی سرویس kittenbot خود پیکربندی کنید. به یاد داشته باشید که از همان نقطه پایانی که برای فعال کردن Events API استفاده کردید، استفاده کنید! این آدرس اینترنتی شماست، به علاوه '/api/messages' .

e34d393c14308f28.png

  • برای به‌روزرسانی برنامه و دسترسی‌های آن، دستورالعمل‌ها را دنبال کنید.

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

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

ربات با ۸ گربه پاسخ می‌دهد که فقط برای شما قابل مشاهده هستند:

9c1b256987fd379a.png

۱۲. پاکسازی

تبریک می‌گویم، شما اکنون یک ربات 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].

سطل‌های ذخیره‌سازی را حذف کنید

ابتدا، باکت‌های فضای ذخیره‌سازی ابری گوگل را فهرست کنید تا مسیر باکت را دریافت کنید:

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

۱۳. تبریک می‌گویم!

۵۲۸۳۰۲۹۸۱۹۷۹de۹۰.png

حالا می‌دانید که چگونه یک ربات Slack را در Cloud Run اجرا کنید!

ما فقط به طور سطحی به این فناوری پرداخته‌ایم و شما را تشویق می‌کنیم تا با پیاده‌سازی‌های Cloud Run خودتان، بیشتر در این زمینه کاوش کنید.

آنچه ما پوشش داده‌ایم

  • ایجاد یکپارچه‌سازی سفارشی ربات در Slack
  • ایمن‌سازی اسرار Slack شما با Secret Manager
  • استقرار ربات Slack خود در Cloud Run

مراحل بعدی

اطلاعات بیشتر