Cloud Run'da Node.js ile Slack botu derleme

1. Genel Bakış

5f529fb87abc11c9.png

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

Neler öğreneceksiniz?

  • Slack'te özel bot entegrasyonu oluşturma
  • Secret Manager ile Slack sırlarınızı nasıl güvenceye alabilirsiniz?
  • 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

Bu eğitimi nasıl kullanacaksınız?

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

Google Cloud ile ilgili deneyiminizi nasıl değerlendirirsiniz?

Başlangıç Orta İleri

2. Kurulum ve şartlar

Yönlendirmesiz ortam kurulumu

  1. Google Cloud Console'da oturum açın ve 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. Bu bilgiyi istediğiniz zaman güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğinize (genellikle PROJECT_ID olarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Dilerseniz kendi adınızı deneyerek kullanılabilir olup olmadığını kontrol edebilirsiniz. Bu adım tamamlandıktan sonra değiştirilemez ve proje süresince geçerli kalır.
  • Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırılmayı önlemek için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.

Cloud Shell'i başlatma

Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir ancak 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 'i d1264ca30785e435.png 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 ekran gösterildiyse Devam'ı tıklayın.

d95252b003979716.png

Cloud Shell'in temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır.

7833d5e1c5d18f54.png

Bu sanal makineye, ihtiyaç duyacağınız tüm geliştirme araçları yüklenmiştir. 5 GB boyutunda kalıcı bir ana dizin bulunur ve Google Cloud'da çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu codelab'deki çalışmalarınızın neredeyse tamamını tarayıcıyla yapabilirsiniz.

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin, proje kimliğinize ayarlandığını görürsünüz.

  1. Kimliğinizin doğrulandığını onaylamak için Cloud Shell'de şu 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 projeniz hakkında bilgi sahibi olduğunu onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Değilse şu 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, aşağıdakine 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ınız olmalıdır. Bu eğitimde kullanmak istediğiniz bir çalışma alanınız yoksa ücretsiz olarak çalışma alanı oluşturabilirsiniz.

aa1f0fda82263bf8.png

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

Bot kullanıcıları, Slack'teki mesajları dinleyebilir, mesaj gönderebilir ve dosya yükleyebilir. Bu codelab'de, basit bir selamlama mesajı yayınlamak için bot oluşturacaksınız.

Yeni bir Slack uygulaması oluşturma

  • Slack uygulamaları yönetim 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 bölümünde Uygulama Ana Sayfası'na gidin.

414213b184fcc992.png

  • Eklenecek Kapsamları İncele'yi tıklayarak bot jetonunuza bir kapsam atayın.
  • Sayfayı aşağı kaydırarak Bot Token Scopes (Bot Jetonu Kapsamları) bölümüne gidin ve Add an OAuth Scope (OAuth Kapsamı Ekle) seçeneğini tıklayın. "Mesajları Kittenbot olarak gönder" seçeneğini belirlemek için chat:write simgesini seçin.

74a6fa87c64c2b23.png

  • Yukarı kaydırıp Uygulamayı çalışma alanınıza yükleyin düğmesini tıklayın.
  • Bu işlem, uygulamayı ekibinize yükler, yeni oluşturduğunuz bot kullanıcısını ekler ve bir bot jetonu oluşturur.
  • İstendiğinde, botun çalışma alanınızda sohbet etmesine izin vermek için "İzin ver"i 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.
  • İmza Gizli Anahtarı'na gidin, Göster'i tıklayın ve gizli anahtarı panonuza kopyalayın:

74cfd6616fa71dc4.png

  • Sırrı bir ortam değişkenine kaydedin:
CLIENT_SIGNING_SECRET=PASTE_THE_SIGNING_SECRET

Bot jetonunu alma

  • Özellikler bölümünde OAuth ve İzinler'e gidin.
  • Bot User OAuth Access Token (Bot Kullanıcısı OAuth Erişim Jetonu) metnini panonuza kopyalamak için Kopyala düğmesini tıklayın.

6f5a18069471101.png

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

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

6. Gizli anahtarlarınızın güvenliğini sağlama

Bot jetonunuzun ve istemci imzalama gizli anahtarınızın güvenli bir şekilde saklanmasını istiyoruz. Bunları kaynak kodda sabit kodlamak, sürüm denetiminde yayınlayarak veya bir Docker görüntüsüne yerleştirerek bu sırları yanlışlıkla açığa çıkarma olasılığını artırır.

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

Sırları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 dizelerinizin düzgün şekilde oluşturulduğunu ve izinlerinizin çalıştığını doğrulayalım. Aşağıdaki komutlarla sırlarınıza erişin:

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

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

7. Örnek kodu alın

Komut satırında Cloud Shell'i kullanarak GitHub deposunu klonlamak için 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 geçerli klasörü doğrudan Cloud Shell Düzenleyici'de açmak için aşağıdaki komutla açın:

cloudshell workspace .

Kittenbot kodunun iki temel işlevi vardır. Biri gizli anahtarları almak, diğeri ise botu çalıştırmak için kullanılır.

Öncelikle 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 botun mesajları Slack API'ye ve Slack API'den kolayca çevirmesine olanak tanıyan paketlerdir. Secret Manager istemcisi, önceki bir adımda kaydettiğiniz gizli anahtarlara erişmenize olanak tanır.

Ardından, sırları almak için kullandığımız işlev geliyor:

/**
 * 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, botun kimliğini doğrulamak için gereken sırların dize değerlerini döndürür.

Aşağıdaki işlev, botu 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'ı sırlarla yapılandırır ve ardından mesaj almak için bir uç nokta belirtir. Ardından, kumanda açıldığında bot, "hello", "hi" veya "hey" içeren tüm mesajlara "Miyav. 😺".

Uygulama manifestindeki şu bölümleri inceleyin:

package.json

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

Cloud Run ile Node.js uygulamasını doğrudan kaynaktan dağıtabilirsiniz. Perde arkasında şunlar gerçekleşir:

  • Cloud Run, bir container görüntüsü oluşturmak için Cloud Build'i çağırır (bkz. Kaynak koddan dağıtım).
  • Kaynak kodu dizininde Dockerfile varsa Cloud Build, container görüntüsü oluşturmak için bu dosyayı kullanır.
  • Bu nedenle 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.
  • Buildpack'ler package.json manifest'ini algılar ve bir Node.js görüntüsü oluşturur.
  • scripts.start alanı, uygulamanın nasıl başlatılacağı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 göndereceği herkese açık bir URL sağlamanız gerekir.

Cloud Run, webhook hedeflerini barındırmak için iyi bir çözümdür. Bu hizmet, istediğiniz dili veya çalışma zamanını kullanmanıza olanak tanır ve eşzamanlılık sağlar. Bu sayede uygulamanız çok daha yüksek hacimleri işleyebilir.

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ımlama

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

REGION="us-central1"

İzinleri güncelleme

Cloud Run hizmet hesabına, Secret Manager'daki gizli anahtarlara erişebilmesi için 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")

E-posta adresinin kaydedildiğini 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

Bir Cloud Run hizmeti, gelen istekleri işleyebilmek için benzersiz bir uç noktayı açığa çıkarır ve altta yatan 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 oluşturmak için mevcut klasörü kullanır. Cloud Build, package.json dosyasının varlığını otomatik olarak algılar.
  • Alternatif olarak, bu komutla varsayılan bir bölge tanımlayabilirsiniz: gcloud config set run/region $REGION
  • Ayrıca, bu komutla Cloud Run'ı varsayılan olarak yönetilen hale getirebilirsiniz: 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 hâle getirir.

İlk kez kullandığınızda Artifact Registry deposu oluşturmanız istenir. 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 kapsayıcı görüntünüzün oluşturulmasını 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 bekleyin. İşlem başarılı olduğunda 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 şu biçimdedir:

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

Bu URL, Slack Events API'yi etkinleştirmek için kullanılacak temel URL olacaktır. Sonraki adımda kullanmak için kodu panonuza kopyalayın.

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

Son düzeltmenin ne zaman oluşturulduğunu, ne kadar trafik aldığını görebilir ve günlükleri inceleyebilirsiniz. Günlükleri tıkladığımızda Botkit denetleyicisinin açık olduğunu ve mesaj 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 belirtiyor.

kittenbot.js

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

Bu durumda, tam URL'miz Cloud Run hizmetindeki temel bölüm ve /api/messages olacaktır.

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, siz bitirmeden önce doğrulama işlemi başlatılabilir. 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 Değişiklikleri Kaydet'i tıklayın. Uygulamanızı yeniden yüklemeniz istenir. İstemleri uygulayıp İzin ver'i tıklayın.

Bu noktada botunuz tamamen entegre edilmiş olur. Çalışma alanındaki mesajlar, Slack'in Cloud Run hizmetinize mesaj göndermesini tetikler. Bu hizmet de basit bir selamlama ile yanıt verir.

10. Bot'unuzu test etme

Kittenbot'a doğrudan mesaj gönderme:

1f442dd7fd7b5773.png

"@kittenbot" yazıp "Davet Et"i tıklayarak kittenbot'u kanalınıza ekleyin:

9788d2167ce47167.png

Artık kanalınızdaki herkes Kittenbot ile etkileşim kurabilir.

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 göz atarsanız her iletinin günlükteki bir POST girişine karşılık geldiğini görürsünüz.

1ff0c2347bf464e8.png

Kittenbot, her mesaja "Miyav. 😺".

11. Bonus: Bot'unuzu güncelleme

Bu isteğe bağlı bölüm birkaç dakika sürer. Doğrudan Temizleme bölümüne geçebilirsiniz.

Sohbet Dizileri

Botun sadece "miyav" demesini istemiyoruz. Ancak Cloud Run'da çalışan bir uygulamanın yeni sürümünü nasıl dağıtırsınız?

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

cd ../extra-credit/

Geçerli klasörü Cloud Shell Düzenleyici'de açma:

cloudshell workspace .

Botkit, görüşmeleri yönetme olanağı sunar. Bu sayede bot, daha fazla bilgi isteyebilir ve mesajlara tek kelimelik yanıtın ötesinde tepki verebilir.

İletişim kutusunu tanımlama

Öncelikle, dosyanın sonundaki sohbet işlevlerinin nasıl tanımlandığını inceleyin:

// ...
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 görüşme, yanıtlara göre ileti dizisini yönlendirir. Örneğin, kullanıcı yavru kedi sorusuna "hayır" yanıtını verirse bu ileti dizisinin sonu olan "no_kittens" etiketli mesaja atlanır.

İletişim kutusunu kumandaya ekleme

Konuşma tanımlandığına göre, 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 denetleyicinin kullanabileceği bu iletişim kutusunda, chatbot "kedi yavrusu", "kedi yavruları", "kedi" veya "kediler" kelimelerini duyduğunda sohbetin nasıl başladığını görün:

  // ...

  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 botunu yeni bir sürüme güncellediniz.

Eğik Çizgi Komutları

Kullanıcıyla sohbet etmek istemiyorsanız ne yapmalısınız? Peki, tek bir basit komutla bir işlemi tetiklemeyi tercih ederseniz ne olur?

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

Slack Slash komutlarını etkinleştirme

  • Uygulama Yönetimi Sayfanızdaki Özellikler bölümünde Slash Commands (Slash Komutları) bölümüne gidin.
  • Yeni Komut Oluştur'u tıklayın.
  • Kittenbot hizmet URL'nizle bir /cats komutu yapılandırın. Etkinlikler API'sini etkinleştirmek için kullandığınız uç noktayı kullanmayı unutmayın. Bu, URL'niz ve '/api/messages''dan oluşur.

e34d393c14308f28.png

  • Uygulamanızı ve izinlerinizi güncellemek için istemi uygulayın.

Denetleyicinize Slash Komutları ekleme

Eğik çizgi komutları için işleyicinin controller.ready işlevine nasıl eklendiğini görün:

  // ...

  // 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 yazıp 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 botunuz var. Kullanılan kaynakları temizleme zamanı (maliyetten tasarruf etmek ve iyi bir bulut kullanıcısı 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 ediyorsanız bir 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 sırrı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 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ı 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 yalnızca yüzeyini inceledik. Kendi Cloud Run dağıtımlarınızla daha fazla keşif yapmanızı öneririz.

İşlediğimiz konular

  • 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'a dağıtma

Sonraki Adımlar

Daha Fazla Bilgi