Cloud Run'da Node.js ile Slack botu derleme

1. Genel Bakış

5f529fb87abc11c9.png

Bu codelab'de, Botkit araç setini kullanarak bir Slack botu oluşturmayı ve bu botu Google Cloud'da çalıştırmayı öğreneceksiniz. Bot ile canlı bir Slack kanalında etkileşim kurabilirsiniz.

Neler öğreneceksiniz?

  • Slack'te bot özel entegrasyonu oluşturma
  • Secret Manager ile Slack gizli anahtarlarınızın güvenliğini sağlama
  • Durum bilgisiz container'larınızı otomatik olarak ölçeklendiren, tümüyle yönetilen bir bilgi işlem platformu olan Cloud Run'da Slack botu dağıtma

İhtiyacınız olanlar

  • Bir Google Cloud projesi
  • Chrome veya Firefox gibi bir tarayıcı

Bu eğiticiden nasıl yararlanacaksınız?

Yalnızca okuma Okuyun ve alıştırmaları tamamlayın

Google Cloud deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Yeterli

2. Kurulum ve şartlar

Kendi hızınızda ortam kurulumu

  1. Google Cloud Console'da oturum açıp yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

98e4187c97cf2e0e.png

37d264871000675d.png

c20a9642aaa18d11.png

  • Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. İstediğiniz zaman güncelleyebilirsiniz.
  • Proje Kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. bunun ne olduğunu umursamıyorsunuz. Çoğu codelab'de proje kimliğinizi (genellikle PROJECT_ID olarak tanımlanır) belirtmeniz gerekir. Oluşturulan kimliği beğenmezseniz rastgele bir kimlik daha oluşturabilirsiniz. Alternatif olarak, kendi ölçümünüzü deneyip mevcut olup olmadığına bakabilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince kalır.
  • Bilginiz olması açısından, bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu değerlerin üçü hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Sonraki adımda, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. Bu eğitim dışında faturalandırmanın tekrarlanmasını önlemek amacıyla kaynakları kapatmak için oluşturduğunuz kaynakları silebilir veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.

Cloud Shell'i başlatma

Google Cloud dizüstü bilgisayarınızdan uzaktan çalıştırılabilse de bu eğitimde, Cloud'da çalışan bir komut satırı ortamı olan Cloud Shell'i kullanacaksınız.

Cloud Shell'i etkinleştirme

  1. Cloud Console'da, Cloud Shell'i etkinleştir d1264ca30785e435.png simgesini tıklayın.

84688aa223b1c3a2.png

Cloud Shell'i ilk kez başlatıyorsanız ne olduğunu açıklayan bir ara ekran gösterilir. Ara bir ekran görüntülendiyse Devam'ı tıklayın.

d95252b003979716.png

Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.

7833d5e1c5d18f54.png

Gereken tüm geliştirme araçları bu sanal makinede yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Bu codelab'deki çalışmalarınızın tamamı olmasa bile büyük bir kısmı tarayıcıyla yapılabilir.

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin proje kimliğinize ayarlandığını göreceksiniz.

  1. Kimlik doğrulamanızın tamamlandığını onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud auth list

Komut çıkışı

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. gcloud komutunun projenizi bildiğini onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Doğru değilse aşağıdaki komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

3. API'leri etkinleştirme

Cloud Shell'den Artifact Registry, Cloud Build, Cloud Run ve Secret Manager API'lerini etkinleştirin:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  run.googleapis.com \
  secretmanager.googleapis.com

Bu işlem, şuna benzer bir başarı mesajı verir:

Operation "operations/..." finished successfully.

Artık uygulamanızı hazırlayıp dağıtmaya hazırsınız...

4. Slack çalışma alanı oluşturma

Özel entegrasyonlar oluşturmanıza izin verilen bir Slack çalışma alanına ihtiyacınız vardır. Bu eğitim için kullanmak istediğiniz çalışma alanı yoksa ücretsiz olarak bir çalışma alanı oluşturabilirsiniz.

aa1f0fda82263bf8.png

5. Slack bot kullanıcısı oluşturma

Bot kullanıcısı Slack'teki mesajları dinleyebilir, mesaj yayınlayabilir ve dosya yükleyebilir. Bu codelab'de, basit bir karşılama mesajı yayınlamak için bir bot oluşturacaksınız.

Yeni Slack uygulaması oluşturma

  • Slack uygulama yönetimi sayfasına gidin.
  • Sağ üst köşedeki Yeni uygulama oluştur düğmesini tıklayın.
  • Uygulamaya "Kittenbot" gibi bir ad verin.
  • Uygulamanın yüklenmesini istediğiniz Slack ekibini seçin.

Bot kullanıcısı oluşturma

  • Sol taraftaki panelde Özellikler'in altındaki Uygulama Ana Sayfası'na gidin

414213b184fcc992.png

  • Eklenecek Kapsamları İncele'yi tıklayarak bot jetonunuza kapsam atayın.
  • Bot Jeton Kapsamları bölümüne gidip OAuth Kapsamı Ekle'yi tıklayın. "Mesajları Kittenbot olarak gönder"i chat:write seçin

74a6fa87c64c2b23.png

  • Yukarı kaydırın ve Uygulamayı Çalışma Alanınıza Yükle düğmesini tıklayın.
  • Bu işlem, uygulamayı ekibinize yükler, az önce oluşturduğunuz bot kullanıcısını ekler ve bir bot jetonu oluşturur.
  • İstendiğinde "İzin ver"i tıklayın. tıklayın.

Mesajları ve komutları etkinleştirme

  • Sekmeleri Göster'e gidin ve her iki seçeneğin de etkinleştirildiğinden emin olun:

5ca52f7abbdc15c.png

İstemci imzalama gizli anahtarını alma

  • Ayarlar bölümündeki Temel Bilgiler'e gidin.
  • Signing Secret (İmzalama Gizli Anahtarı) bölümüne gidin, Show (Göster) seçeneğini tıklayın ve gizli anahtarı panonuza kopyalayın:

74cfd6616fa71dc4.png

  • Gizli anahtarı bir ortam değişkenine kaydedin:
CLIENT_SIGNING_SECRET=PASTE_THE_SIGNING_SECRET

Bot jetonunu alma

  • OAuth & Özellikler bölümündeki İzinler'i tıklayın.
  • Bot Kullanıcısı OAuth Erişim Jetonu metnini panonuza kopyalamak için Copy (Kopyala) düğmesini tıklayın.

6f5a18069471101.png

  • Bot jetonunu bir ortam değişkenine kaydedin:
BOT_TOKEN=PASTE_THE_BOT_TOKEN

Endişelenmeyin. Bu jetonları tekrar almanız gerekiyorsa uygulama yönetimi sayfasından bu yapılandırma sayfasına geri dönebilirsiniz.

6. Sırlarınızın güvende olmasını sağlayın

Bot jetonunuzun ve istemci imzalama gizli anahtarınızın güvenli bir şekilde saklandığından emin olmak istiyoruz. Bunların kaynak koduna sabit olarak kodlanması, bu gizli anahtarların sürüm kontrolünde yayınlanması veya bir Docker görüntüsüne yerleştirilmesi yoluyla yanlışlıkla açığa çıkmasına yol açabilir.

Secret Manager; API anahtarları, şifreler, sertifikalar ve diğer hassas verileri depolamak için güvenli ve kullanışlı bir yöntem sunar. Secret Manager, gizli anahtarları Google Cloud genelinde yönetmek, denetlemek ve bunlara erişmek için merkezi bir konum ve tek bir bilgi kaynağı sağlar.

Gizli anahtarlarınızı oluşturma

Aşağıdaki komutları kullanarak istemci imzalama gizli anahtarınızı ve bot jetonunuzu kaydedin:

  • İstemci imzalama gizli anahtarı
echo -n $CLIENT_SIGNING_SECRET | gcloud secrets create client-signing-secret \
  --replication-policy automatic \
  --data-file -
  • Bot jetonu
echo -n $BOT_TOKEN | gcloud secrets create bot-token \
  --replication-policy automatic \
  --data-file -

Gizli Anahtarlarınıza erişme

Gizli anahtarlarınızın doğru şekilde oluşturulduğunu ve izinlerinizin çalıştığını onaylayalım. Aşağıdaki komutları kullanarak gizli anahtarlarınıza erişin:

echo $(gcloud secrets versions access 1 --secret client-signing-secret)
echo $(gcloud secrets versions access 1 --secret bot-token)

Gizli anahtarlarınızı Google Cloud Console'da da görüntüleyip yönetebilirsiniz.

7. Örnek kodu alın

GitHub deposunu klonlamak için Cloud Shell'de komut satırında aşağıdaki komutu çalıştırın:

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

Dizini cloud-slack-bot/start olarak değiştirin.

cd cloud-slack-bot/start

Kodu Anlama

kittenbot.js dosyasını tercih ettiğiniz komut satırı düzenleyicisiyle (nano, vim, emacs...) veya aşağıdaki komutla açarak geçerli klasörü doğrudan Cloud Shell Düzenleyici'de açın:

cloudshell workspace .

yavru kedi kodunun iki ana işlevi vardır. Biri sırları almak, diğeri ise bot'u çalıştırmaktır.

İlk olarak bağımlılıkları içe aktarırız:

kittenbot.js

const { Botkit } = require('botkit');
const {
  SlackAdapter,
  SlackEventMiddleware,
} = require('botbuilder-adapter-slack');
const { SecretManagerServiceClient } = require('@google-cloud/secret-manager');

SlackAdapter ve SlackEventMiddleware, Botkit'i genişleten ve bot'un Slack API'ye gelen ve Slack API'den gelen mesajları kolayca çevirmesine olanak tanıyan paketlerdir. Secret Manager istemcisi, önceki adımda kaydettiğiniz gizli anahtarlara erişmenizi sağlar.

Şimdi de gizli anahtarları alma fonksiyonumuz var:

/**
 * 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;
}

Bu işlev, bot'un kimliğini doğrulamak için gereken gizli anahtarların dize değerlerini döndürür.

Sonraki işlev, bot'u başlatır:

/**
 * 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:');
      }
    );
  });
}

İşlevin ilk bölümü, SlackAdapter'ı gizli anahtarlarla yapılandırır ve ardından mesaj almak için bir uç nokta belirtir. Kumanda etkinleştirildikten sonra bot, "merhaba", "merhaba" veya "merhaba" içeren tüm mesajlara yanıt verir. "Miyav. 😺".

Uygulama manifest dosyasındaki şu özel bölümlere göz atın:

package.json

{
  // ...
  "scripts": {
    "start": "node kittenbot.js",
    // ...
  },
  "engines": {
    "node": "16"
  },
  // ...
}

Node.js uygulamasını Cloud Run ile doğrudan kaynaktan dağıtabilirsiniz. Arka planda aşağıdaki işlemler gerçekleşir:

  • Cloud Run, container görüntüsü derlemek için Cloud Build'i çağırır (Kaynak kodundan dağıtma bölümüne bakın).
  • Kaynak kodu dizininde Dockerfile varsa Cloud Build bunu kullanarak bir container görüntüsü oluşturur.
  • Aksi halde Cloud Build, kaynağı analiz etmek ve üretime hazır bir görüntüyü otomatik olarak oluşturmak için Buildpacks'i çağırır.
  • Buildpacks, package.json manifestini algılar ve bir Node.js görüntüsü oluşturur.
  • scripts.start alanı, uygulamanın nasıl başlatıldığını belirler.
  • engines.node alanı, kapsayıcı temel görüntüsünün Node.js sürümünü belirler.
  • Dağıtım sırasında bilinen güvenlik düzeltmeleri otomatik olarak uygulanır.

Uygulamayı dağıtmaya hazırsınız.

8. Uygulamayı dağıtın

Slack Events API, etkinliklerle ilgili giden mesajları göndermek için webhook'ları kullanır. Slack Uygulaması'nı yapılandırırken Slack API'nin ping atması için herkesin erişebileceği bir URL sağlamanız gerekir.

Cloud Run, webhook hedefleri barındırmak için iyi bir çözümdür. İstediğiniz dili veya çalışma zamanını kullanmanıza olanak tanır ve eşzamanlılık sağlar. Bu da uygulamanızın çok daha fazla iş yükünü kaldırabileceği anlamına gelir.

Proje kimliğinizi alma

PROJECT_ID ortam değişkenini tanımlayın:

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

Cloud Run bölgenizi tanımlayın

Cloud Run bölgeseldir. Yani Cloud Run hizmetinizi çalıştıran altyapı belirli bir bölgede bulunur ve Google tarafından yönetilir. Bu sayede, söz konusu bölgedeki tüm alt bölgelerde yedek olarak kullanılabilir. Dağıtımınız için kullanacağınız bölgeyi tanımlayın. Örneğin:

REGION="us-central1"

İzinleri güncelleme

Secret Manager'daki gizli anahtarlara erişebilmek için Cloud Run hizmet hesabına roles/secretmanager.secretAccessor rolü verilmelidir.

Öncelikle, varsayılan hizmet hesabını bir ortam değişkenine kaydedin:

SERVICE_ACCOUNT=$(gcloud iam service-accounts list \
  --format "value(email)" \
  --filter "displayName:Compute Engine default service account")

Şu e-posta adresini kaydettiğinizi onaylayın:

echo $SERVICE_ACCOUNT

Hizmet hesabı şu biçimdedir: PROJECT_NUMBER-compute@developer.gserviceaccount.com.

E-posta adresini aldıktan sonra hizmet hesabı için rolü etkinleştirin:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT \
  --role roles/secretmanager.secretAccessor

Uygulamayı dağıtma

Cloud Run hizmeti, gelen istekleri karşılamak için benzersiz bir uç nokta sunar ve temel altyapıyı otomatik olarak ölçeklendirir.

Uygulamayı Cloud Run'a dağıtın:

gcloud run deploy kittenbot \
  --source . \
  --platform managed \
  --region $REGION \
  --set-env-vars PROJECT_ID=$PROJECT_ID \
  --allow-unauthenticated
  • Bu işlem, kittenbot adlı bir hizmet oluşturur.
  • --source seçeneği, uygulamayı Cloud Build ile derlemek için geçerli klasörü kullanır. Cloud Build, package.json dosyasının varlığını otomatik olarak algılar.
  • Alternatif olarak şu komutla da varsayılan bir bölge tanımlayabilirsiniz: gcloud config set run/region $REGION
  • Ayrıca, şu komutla Cloud Run'ın varsayılan olarak yönetilmesini de sağlayabilirsiniz: gcloud config set run/platform managed
  • --set-env-vars seçeneği, hizmet ortamı değişkenlerini ayarlar.
  • --allow-unauthenticated seçeneği, hizmeti herkese açık hale getirir.

İlk kez Artifact Registry deposu oluşturma istemi alırsınız. Doğrulamak için Enter'a dokunun:

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)?

Bu işlem, kaynak kodunuzun Artifact Registry deposuna yüklenmesini ve container görüntünüzün derlemesini başlatır:

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

Ardından, derleme ve dağıtım tamamlanana kadar biraz bekleyin. İşlem başarılı olursa komut satırında hizmet URL'si gösterilir:

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

Hizmet URL'sini şu komutla alabilirsiniz:

SERVICE_URL=$( \
  gcloud run services describe kittenbot \
  --platform managed \
  --region $REGION \
  --format "value(status.url)" \
)
echo $SERVICE_URL

URL'nin biçimi aşağıdaki gibidir:

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

Bu URL, Slack Events API'yi etkinleştirmek için kullanılan temel olacak. Sonraki adımda kullanmak üzere panonuza kopyalayın.

Hizmetiniz artık yayında ve herkesin kullanımına açık. Daha fazla bilgi için Cloud Run konsoluna gidin. fee46ea7c8483d56.png

En son düzeltmenin ne zaman oluşturulduğunu ve ne kadar trafik aldığını görebilir ve günlüklere bakabilirsiniz. Günlükleri incelediğimizde Botkit denetleyicisinin açık ve mesajları almaya hazır olduğunu görebiliriz.

Şimdi Slack kanalımızdan mesaj göndermeye başlayalım.

9. Slack etkinliklerini etkinleştirme

Daha önce gördüğümüz gibi kittenbot kodumuz webhook hedefimiz için göreli bir uç nokta belirtir.

kittenbot.js

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

Bu, tam URL'mizin Cloud Run hizmetinin temel parçasına ek olarak /api/messages olacağı anlamına gelir.

Etkinlikleri etkinleştirme

Uygulama yönetimi sayfasında, kenar çubuğundaki Etkinlik Abonelikleri bölümüne gidin ve Etkinlikleri Etkinleştir'i açın. Hizmet URL'nizi girin:

PASTE_THE_SERVICE_URL/api/messages

5179a99339839999.png

URL'yi ne kadar hızlı yazdığınıza bağlı olarak, işleminiz tamamlanmadan önce URL'yi doğrulamaya çalışabilir. Başarısız olursa, "Yeniden dene"yi tıklayın.

Abone ol

Tüm mesaj botu etkinliklerine abone olun.

1e8f200390908a9b.png

Sayfanın alt kısmında bulunan Değişiklikleri Kaydet'i tıklayın. Uygulamanızı Yeniden Yüklemeniz istenir. İstemleri gözden geçirin ve İzin ver'i tıklayın.

Bot'unuz bu noktada tamamen entegre edilmiştir. Çalışma alanındaki mesajlar, Cloud Run hizmetinize mesaj göndermesi için Slack'i tetikler ve bu da basit bir selamlamayla yanıt verir.

10. Bot'unuzu test edin

Kittenbot'a doğrudan mesaj gönderme:

1f442dd7fd7b5773.png

"@kittenbot" yazarak kanalınıza kittenbot ekleyin ve ardından "Onları Davet Et"i tıklayarak:

9788d2167ce47167.png

Artık kanalınızdaki herkes Kittenbot ile etkileşime geçebilir.

9c0d1d7907a51767.png

Slack'teki her mesaj bir etkinliği tetikler ve Cloud Run hizmetimize bir HTTP POST mesajı gönderir. Cloud Run hizmet günlüklerine bakarsanız her mesajın günlükteki bir POST girişine karşılık geldiğini görürsünüz.

1ff0c2347bf464e8.png

Yavru kedi, her mesaja "Miyav. 😺".

11. Bonus - Bot'unuzu güncelleyin

İsteğe bağlı bu bölüm birkaç dakika sürecektir. Doğrudan Temizlik bölümüne geçebilirsiniz.

Sohbet İleti Dizileri

Bot'un yalnızca "miyav" demekten daha fazlasını yapmasını istiyoruz. Peki, Cloud Run'da çalışan bir öğenin yeni sürümünü nasıl dağıtabilirsiniz?

Dizini şu şekilde değiştirin: cloud-slack-bot/extra-credit:

cd ../extra-credit/

Mevcut klasörü Cloud Shell Düzenleyici'de açın:

cloudshell workspace .

Botkit, sohbetleri yönetme olanağı sunar. Bunlar sayesinde bot, daha fazla bilgi isteyebilir ve mesajlara tek kelimelik bir yanıtın ötesinde tepki verebilir.

İletişim kutusunu tanımlama

Öncelikle, dosyanın sonunda konuşma işlevlerinin nasıl tanımlandığına bakın:

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

Bu yeni ileti dizisi, verilen yanıtlara göre ileti dizisini yönlendirir. Örneğin, kullanıcı "hayır" yanıtı verirse ardından, "no_kittens" etiketli mesaja geçer ve bu ileti dizisinde son bulur.

İletişim kutusunu kumandaya ekleme

Görüşme tanımlandığına göre, şimdi bunu denetleyiciye nasıl ekleyeceğinizi öğrenin:

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

İletişim kutusunu tetikleme

Artık kumandanın kullanabileceği iletişim kutusu olduğuna göre chatbot "kedi yavrusu", "kedi", "kedi" veya "kedi" ifadesini duyduğunda konuşmanın nasıl başladığına bakabilirsiniz:

  // ...

  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

    // ...
  });

  // ...

Uygulamayı güncelleme

Uygulamayı Cloud Run'a yeniden dağıtın:

gcloud run deploy kittenbot \
  --source . \
  --platform managed \
  --region $REGION \
  --set-env-vars PROJECT_ID=$PROJECT_ID \
  --allow-unauthenticated

Deneyin

eca12b3463850d52.png

Tebrikler! Cloud Run'da çalışan bir Slack bot'unu yeni bir sürüme güncellediniz.

Eğik çizgi komutları

Kullanıcıyla görüşme yapmak istemiyorsanız ne olur? Bir işlemi basit bir komutla tetiklemeyi tercih ederseniz ne olur?

Slack bu işlevi, kullanıcıların komutu mesaj kutusuna girerek uygulamanızı çağırmasına olanak tanıyan Eğik çizgi komutları aracılığıyla sunar.

Slack Slash Komutlarını Etkinleştir

  • Uygulama Yönetimi Sayfanızda Özellikler'in altındaki Eğik Çizgi Komutları bölümüne gidin.
  • Create New Command'ı (Yeni Komut Oluştur) tıklayın.
  • Kittenbot hizmet URL'nizle bir /cats komutu yapılandırın. Events API'yi etkinleştirmek için kullandığınız uç noktayı kullanmayı unutmayın. Bu URL'nizle birlikte '/api/messages'.

e34d393c14308f28.png

  • Uygulamanızı ve izinlerinizi güncellemek için istemi takip edin.

Denetleyicinize Eğik Çizgi Komutları Ekleme

Eğik çizgi komutları için bir işleyicinin,control.sold işlevine nasıl eklendiğini öğrenin:

  // ...

  // 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
  });

  // ...

Deneyin

Eğik çizgi komutunu göndermek için /cats ve bir sayı girin. Örnek: /cats 8

c67f6fe1ffcafec8.png

Bot, yalnızca sizin görebileceğiniz 8 kediyle yanıt verir:

9c1b256987fd379a.png

12. Temizleme

Tebrikler, artık Cloud Run'da çalışan bir Slack bot'unuz var. Kullanılan kaynakları biraz temizlemenin zamanı geldi (maliyet tasarrufu yapmak ve iyi bir bulut vatandaşı olmak için).

Projeyi silme

Projenin tamamını doğrudan Cloud Shell'den silebilirsiniz:

gcloud projects delete $PROJECT_ID

Alternatif olarak, farklı kaynakları tek tek silmeyi tercih ederseniz sonraki bölüme geçin.

Dağıtımı silme

gcloud run services delete kittenbot --region $REGION

Komut çıkışı

Service [kittenbot] will be deleted.
Do you want to continue (Y/n)?  y
Deleted service [kittenbot].

İstemci imzalama gizli anahtarınızı silme

gcloud secrets delete client-signing-secret

Komut çıkışı

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

Bot jetonu gizli anahtarınızı silme

gcloud secrets delete bot-token

Komut çıkışı

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

Depolama alanı paketlerini silme

Öncelikle paket yolunu almak için Google Cloud Storage paketlerini listeleyin:

gsutil ls

Komut çıkışı

gs://[REGION.]artifacts.<PROJECT_ID>.appspot.com/
gs://<PROJECT_ID>_cloudbuild/

Şimdi, yapılar paketini silin:

gsutil rm -r gs://[REGION.]artifacts.${PROJECT_ID}.appspot.com/

Komut çıkışı

Removing gs://[REGION.]artifacts.<PROJECT_ID>.appspot.com/...

Son olarak, Cloudbuild paketini silin:

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

Komut çıkışı

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

13. Tebrikler!

528302981979de90.png

Artık Cloud Run'da Slack botu çalıştırmayı biliyorsunuz.

Bu teknolojinin henüz yolun başındayız. Kendi Cloud Run dağıtımlarınızı kullanarak daha fazlasını keşfetmenizi öneririz.

İşlediklerimiz

  • Slack'te özel bot entegrasyonu oluşturma
  • Secret Manager ile Slack gizli anahtarlarınızın güvenliğini sağlama
  • Slack botunuzu Cloud Run'da dağıtma

Sonraki Adımlar

Daha Fazla Bilgi