Cloud Run पर Node.js की मदद से Slack बॉट बनाएं

1. खास जानकारी

5f529fb87abc11c9.png

इस कोडलैब में, Botkit टूलकिट का इस्तेमाल करके Slack बॉट बनाने और उसे Google Cloud पर चलाने का तरीका बताया गया है. आपके पास लाइव Slack चैनल में बॉट से इंटरैक्ट करने का विकल्प होगा.

आपको क्या सीखने को मिलेगा

  • Slack में बॉट का कस्टम इंटिग्रेशन बनाने का तरीका
  • Secret Manager की मदद से, Slack के सीक्रेट को सुरक्षित रखने का तरीका
  • Cloud Run पर Slack बॉट को डिप्लॉय करने का तरीका. यह पूरी तरह से मैनेज किया गया कंप्यूट प्लैटफ़ॉर्म है, जो आपके स्टेटलेस कंटेनर को अपने-आप स्केल करता है

आपको किन चीज़ों की ज़रूरत होगी

  • Google Cloud प्रोजेक्ट
  • Chrome या Firefox जैसे ब्राउज़र

इस ट्यूटोरियल का इस्तेमाल कैसे किया जाएगा?

सिर्फ़ इसे पढ़ें इसे पढ़ें और एक्सरसाइज़ पूरी करें

Google Cloud का इस्तेमाल करने के अपने अनुभव को आप क्या रेटिंग देंगे?

शुरुआती सामान्य एडवांस

2. सेटअप और ज़रूरी शर्तें

अपने हिसाब से एनवायरमेंट सेट अप करना

  1. Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से कोई Gmail या Google Workspace खाता नहीं है, तो आपको एक खाता बनाना होगा.

98e4187c97cf2e0e.png

37d264871000675d.png

c20a9642aaa18d11.png

  • प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों के लिए डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करते. इसे कभी भी अपडेट किया जा सकता है.
  • प्रोजेक्ट आईडी, सभी 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 को पहली बार शुरू किया है, तो आपको एक इंटरमीडिएट स्क्रीन दिखेगी. इसमें 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. यह पुष्टि करने के लिए कि gcloud कमांड को आपके प्रोजेक्ट के बारे में पता है, Cloud Shell में यह कमांड चलाएं:
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 API चालू करें:

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 स्कोप जोड़ें पर क्लिक करें. "Kittenbot के तौर पर मैसेज भेजें" के लिए chat:write को चुनें

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. अपने सीक्रेट सुरक्षित करना

हम यह पक्का करना चाहते हैं कि आपके बॉट टोकन और क्लाइंट साइनिंग सीक्रेट को सुरक्षित तरीके से सेव किया जाए. सोर्स कोड में इन्हें हार्ड-कोड करने से, वर्शन कंट्रोल में पब्लिश करके या डॉकर इमेज में एम्बेड करके, इन सीक्रेट को गलती से सार्वजनिक किया जा सकता है.

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 Console में जाकर भी, सीक्रेट देखे और मैनेज किए जा सकते हैं.

7. सैंपल कोड पाना

कमांड-लाइन पर Cloud Shell में, GitHub repository को क्लोन करने के लिए, यह कमांड चलाएं:

git clone https://github.com/googlecodelabs/cloud-slack-bot.git

डायरेक्ट्री को cloud-slack-bot/start में बदलें.

cd cloud-slack-bot/start

कोड को समझना

अपनी पसंद के कमांड लाइन एडिटर (nano, vim, emacs...) की मदद से kittenbot.js फ़ाइल खोलें. इसके अलावा, 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"
  },
  // ...
}

Cloud Run की मदद से, सोर्स से सीधे तौर पर 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 ऐप्लिकेशन को कॉन्फ़िगर करते समय, आपको 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 सेवा खाते को 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 ...

इसके बाद, बिल्ड और डिप्लॉयमेंट पूरा होने तक इंतज़ार करें. सफल होने पर, कमांड लाइन में सेवा का यूआरएल दिखता है:

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

यूआरएल का फ़ॉर्मैट ऐसा होता है:

https://kittenbot-PROJECTHASH-REGIONID.a.run.app

इस यूआरएल का इस्तेमाल, Slack Events API को चालू करने के लिए किया जाएगा. इसे अपने क्लिपबोर्ड में कॉपी करें, ताकि अगले चरण में इसका इस्तेमाल किया जा सके.

आपकी सेवा अब लाइव है और सभी के लिए उपलब्ध है! ज़्यादा जानकारी के लिए, Cloud Run कंसोल पर जाएं. fee46ea7c8483d56.png

यह देखा जा सकता है कि आखिरी बदलाव कब किया गया था और उस बदलाव की वजह से कितना ट्रैफ़िक आ रहा है. साथ ही, लॉग भी देखे जा सकते हैं. लॉग पर क्लिक करने से पता चलता है कि Botkit कंट्रोलर चालू है और मैसेज पाने के लिए तैयार है.

अब हम अपने Slack चैनल से मैसेज भेजना शुरू करते हैं!

9. Slack इवेंट चालू करना

जैसा कि हमने पहले देखा था, हमारे kittenbot कोड में, वेबहुक टारगेट के लिए रिलेटिव एंडपॉइंट तय किया गया है.

kittenbot.js

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

इसका मतलब है कि हमारा पूरा यूआरएल, Cloud Run सेवा का बेस पार्ट होगा. साथ ही, इसमें /api/messages भी शामिल होगा.

इवेंट चालू करना

ऐप्लिकेशन मैनेज करने वाले पेज पर, साइडबार में मौजूद इवेंट की सदस्यताएं सेक्शन पर जाएं. इसके बाद, इवेंट चालू करें को टॉगल करके चालू करें. अपनी सेवा का यूआरएल डालें:

PASTE_THE_SERVICE_URL/api/messages

5179a99339839999.png

यूआरएल को तेज़ी से टाइप करने पर, हो सकता है कि पुष्टि की प्रोसेस पूरी होने से पहले ही शुरू हो जाए. अगर ऐसा नहीं होता है, तो "फिर से कोशिश करें" पर क्लिक करें.

सदस्यता लें

मैसेज बॉट के सभी इवेंट के लिए सदस्यता लें.

1e8f200390908a9b.png

पेज पर सबसे नीचे, बदलाव सेव करें पर क्लिक करें. आपको ऐप्लिकेशन फिर से इंस्टॉल करने के लिए कहा जाएगा. प्रॉम्प्ट पढ़ें और अनुमति दें पर क्लिक करें.

अब आपका बॉट पूरी तरह से इंटिग्रेट हो गया है! वर्कस्पेस में मौजूद मैसेज, Slack को आपकी Cloud Run सेवा पर मैसेज भेजने के लिए ट्रिगर करेंगे. इसके बाद, Slack आपको एक सामान्य अभिवादन वाला मैसेज भेजेगा.

10. अपने बॉट की जांच करें

Kittenbot को डायरेक्ट मैसेज भेजें:

1f442dd7fd7b5773.png

अपने चैनल में kittenbot को जोड़ने के लिए, "@kittenbot" डालें. इसके बाद, "उन्हें न्योता भेजें" पर क्लिक करें:

9788d2167ce47167.png

अब आपके चैनल का हर सदस्य, Kittenbot से इंटरैक्ट कर सकता है!

9c0d1d7907a51767.png

Slack में मौजूद हर मैसेज, एक इवेंट को ट्रिगर करता है. साथ ही, हमारी Cloud Run सेवा को एक एचटीटीपी पोस्ट मैसेज भेजता है. Cloud Run सेवा के लॉग देखने पर, आपको पता चलेगा कि हर मैसेज, लॉग में मौजूद POST एंट्री से मेल खाता है.

1ff0c2347bf464e8.png

Kittenbot, हर मैसेज का जवाब "म्याऊं. 😺".

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

डायलॉग को ट्रिगर करना

अब कंट्रोलर के लिए यह डायलॉग उपलब्ध है. देखें कि जब चैटबॉट "बिल्ली का बच्चा", "बिल्लियां", "बिल्ली" या "बिल्लियां" सुनता है, तो बातचीत कैसे शुरू होती है:

  // ...

  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

बधाई हो! आपने अभी-अभी Cloud Run पर चल रहे Slack बॉट को नए वर्शन में अपडेट किया है.

स्लैश कमांड

अगर आपको उपयोगकर्ता से बातचीत नहीं करनी है, तो क्या होगा? अगर आपको सिर्फ़ एक आसान कमांड से कोई कार्रवाई ट्रिगर करनी हो, तो क्या होगा?

Slack, यह सुविधा स्लैश कमांड के ज़रिए उपलब्ध कराता है. इसकी मदद से, उपयोगकर्ता मैसेज बॉक्स में कमांड डालकर आपके ऐप्लिकेशन को चालू कर सकते हैं.

Slack की स्लैश कमांड चालू करना

  • ऐप्लिकेशन मैनेज करने वाले पेज पर, सुविधाएं में जाकर स्लैश कमांड सेक्शन पर जाएं.
  • Create New Command पर क्लिक करें.
  • अपनी kittenbot सेवा के यूआरएल के साथ /cats कमांड को कॉन्फ़िगर करें. उस एंडपॉइंट का इस्तेमाल करना न भूलें जिसका इस्तेमाल आपने Events 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

इसके बाद, बॉट आपको आठ बिल्लियों की इमेज दिखाएगा. ये इमेज सिर्फ़ आपको दिखेंगी:

9c1b256987fd379a.png

12. साफ़-सफ़ाई सेवा

बधाई हो, अब आपके पास Cloud Run पर चलने वाला Slack बॉट है. इस्तेमाल किए गए संसाधनों को हटाने का समय आ गया है, ताकि लागत कम की जा सके और क्लाउड का बेहतर तरीके से इस्तेमाल किया जा सके.

प्रोजेक्ट मिटाना

पूरे प्रोजेक्ट को सीधे 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

अब आपको पता चल गया है कि Cloud Run पर Slack बॉट कैसे चलाया जाता है!

हमने इस टेक्नोलॉजी के बारे में सिर्फ़ बुनियादी जानकारी दी है. हमारा सुझाव है कि आप Cloud Run डिप्लॉयमेंट का इस्तेमाल करके, इस टेक्नोलॉजी के बारे में ज़्यादा जानें.

हमने क्या-क्या बताया

  • Slack में बॉट का कस्टम इंटिग्रेशन बनाना
  • Secret Manager की मदद से, Slack के सीक्रेट को सुरक्षित रखना
  • Cloud Run पर Slack बॉट डिप्लॉय करना

अगले चरण

ज़्यादा जानें