Tworzenie bota Slacka z Node.js w Cloud Run

1. Przegląd

5f529fb87abc11c9.png

Z tego przewodnika dowiesz się, jak utworzyć bota do Slacka za pomocą zestawu narzędzi Botkit i uruchomić go w Google Cloud. Będziesz mieć możliwość interakcji z botem na kanale Slack na żywo.

Czego się nauczysz

  • Jak utworzyć niestandardową integrację bota w Slacku
  • Jak zabezpieczyć obiekty tajne Slacka za pomocą Secret Manager
  • Jak wdrożyć bota Slacka w Cloud Run, w pełni zarządzanej platformie obliczeniowej, która automatycznie skaluje bezstanowe kontenery

Czego potrzebujesz

Jak zamierzasz korzystać z tego samouczka?

Tylko przeczytaj Przeczytaj i wykonaj ćwiczenia

Jak oceniasz korzystanie z Google Cloud?

Początkujący Średnio zaawansowany Zaawansowany

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.

98e4187c97cf2e0e.png

37d264871000675d.png

c20a9642aaa18d11.png

  • Nazwa projektu to wyświetlana nazwa uczestników tego projektu. Jest to ciąg znaków, który nie jest używany przez interfejsy API Google. Zawsze możesz ją zaktualizować.
  • Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić po ustawieniu. Konsola Cloud automatycznie generuje unikalny ciąg znaków. Zwykle nie musisz się nim przejmować. W większości ćwiczeń z programowania musisz odwoływać się do identyfikatora projektu (zwykle oznaczanego jako PROJECT_ID). Jeśli wygenerowany identyfikator Ci się nie podoba, możesz wygenerować inny losowy identyfikator. Możesz też spróbować własnej nazwy i sprawdzić, czy jest dostępna. Po tym kroku nie można go zmienić i pozostaje on taki przez cały czas trwania projektu.
  • Warto wiedzieć, że istnieje też trzecia wartość, numer projektu, której używają niektóre interfejsy API. Więcej informacji o tych 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w konsoli Cloud, aby korzystać z zasobów i interfejsów API Google Cloud. Wykonanie tego laboratorium nie będzie kosztować dużo, a może nawet nic. Aby wyłączyć zasoby i uniknąć naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub projekt. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.

Uruchamianie Cloud Shell

Z Google Cloud można korzystać zdalnie na laptopie, ale w tym samouczku będziesz używać Cloud Shell, czyli środowiska wiersza poleceń działającego w chmurze.

Aktywowanie Cloud Shell

  1. W konsoli Cloud kliknij Aktywuj Cloud Shell d1264ca30785e435.png.

84688aa223b1c3a2.png

Jeśli uruchamiasz Cloud Shell po raz pierwszy, zobaczysz ekran pośredni z opisem tego środowiska. Jeśli pojawił się ekran pośredni, kliknij Dalej.

d95252b003979716.png

Uzyskanie dostępu do środowiska Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.

7833d5e1c5d18f54.png

Ta maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera również stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i usprawnia proces uwierzytelniania. Większość zadań w tym module, a być może wszystkie, możesz wykonać w przeglądarce.

Po połączeniu z Cloud Shell zobaczysz, że uwierzytelnianie zostało już przeprowadzone, a projekt jest już ustawiony na Twój identyfikator projektu.

  1. Aby potwierdzić, że uwierzytelnianie zostało przeprowadzone, uruchom w Cloud Shell to polecenie:
gcloud auth list

Wynik polecenia

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Aby potwierdzić, że polecenie gcloud zna Twój projekt, uruchom w Cloud Shell to polecenie:
gcloud config list project

Wynik polecenia

[core]
project = <PROJECT_ID>

Jeśli nie, możesz go ustawić za pomocą tego polecenia:

gcloud config set project <PROJECT_ID>

Wynik polecenia

Updated property [core/project].

3. Włączanie interfejsów API

W Cloud Shell włącz interfejsy Artifact Registry API, Cloud Build API, Cloud Run API i Secret Manager API:

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

Wyświetli się komunikat o powodzeniu podobny do tego:

Operation "operations/..." finished successfully.

Teraz możesz przygotować i wdrożyć aplikację…

4. Tworzenie obszaru roboczego Slacka

Musisz mieć obszar roboczy w Slacku, w którym możesz tworzyć integracje niestandardowe. Jeśli nie masz jeszcze obszaru roboczego, którego chcesz użyć w tym samouczku, możesz go utworzyć bezpłatnie.

aa1f0fda82263bf8.png

5. Tworzenie użytkownika bota Slacka

Użytkownik bota może nasłuchiwać wiadomości na Slacku, publikować wiadomości i przesyłać pliki. W tym ćwiczeniu utworzysz bota, który będzie publikować proste powitanie.

Tworzenie nowej aplikacji Slack

  • Otwórz stronę zarządzania aplikacjami Slack.
  • W prawym górnym rogu kliknij przycisk Utwórz nową aplikację.
  • Nadaj aplikacji nazwę, np. „Kittenbot”.
  • Wybierz zespół Slack, w którym chcesz zainstalować aplikację.

Tworzenie użytkownika bota

  • W panelu po lewej stronie w sekcji Funkcje kliknij Strona główna aplikacji.

414213b184fcc992.png

  • Przypisz zakres do tokena bota, klikając Sprawdź zakresy do dodania.
  • Przewiń w dół do sekcji Zakresy tokena bota i kliknij Dodaj zakres OAuth. Wybierz chat:write, aby „Wysyłać wiadomości jako Kittenbot”.

74a6fa87c64c2b23.png

  • Przewiń w górę i kliknij przycisk Zainstaluj aplikację w obszarze roboczym.
  • Spowoduje to zainstalowanie aplikacji w zespole, dodanie utworzonego właśnie użytkownika bota i wygenerowanie tokena bota.
  • Gdy pojawi się prośba, kliknij „Zezwól”, aby zezwolić botowi na czatowanie w Twoim obszarze roboczym.

Włączanie wiadomości i poleceń

  • Przewiń w dół do sekcji Pokaż karty i upewnij się, że obie opcje są włączone:

5ca52f7abbdc15c.png

Uzyskiwanie tajnego klucza podpisywania klienta

  • W sekcji Ustawienia kliknij Podstawowe informacje.
  • Przewiń w dół do sekcji Signing Secret (Klucz podpisu), kliknij Show (Pokaż), a potem skopiuj klucz do schowka:

74cfd6616fa71dc4.png

  • Zapisz obiekt tajny w zmiennej środowiskowej:
CLIENT_SIGNING_SECRET=PASTE_THE_SIGNING_SECRET

Uzyskiwanie tokena bota

  • W sekcji Funkcje kliknij OAuth i uprawnienia.
  • Kliknij przycisk Kopiuj, aby skopiować tekst Token dostępu OAuth użytkownika bota do schowka.

6f5a18069471101.png

  • Zapisz token bota w zmiennej środowiskowej:
BOT_TOKEN=PASTE_THE_BOT_TOKEN

Nie martw się. Jeśli będziesz potrzebować tych tokenów ponownie, możesz wrócić na tę stronę konfiguracji z strony zarządzania aplikacjami.

6. Chroń swoje tajemnice

Chcemy mieć pewność, że Twój token bota i tajny klucz podpisywania klienta są bezpiecznie przechowywane. Zakodowanie ich na stałe w kodzie źródłowym zwiększa prawdopodobieństwo przypadkowego ujawnienia tych informacji przez opublikowanie ich w systemie kontroli wersji lub osadzenie ich w obrazie Dockera.

Secret Manager to bezpieczna i wygodna metoda przechowywania kluczy interfejsu API, haseł, certyfikatów i innych danych wrażliwych. Secret Manager to centralne miejsce i jedno źródło wiarygodnych informacji do zarządzania tajnymi danymi, uzyskiwania do nich dostępu i przeprowadzania audytów w Google Cloud.

Tworzenie obiektów tajnych

Zapisz tajny klucz podpisywania klienta i token bota za pomocą tych poleceń:

  • Klucz tajny klienta do podpisywania
echo -n $CLIENT_SIGNING_SECRET | gcloud secrets create client-signing-secret \
  --replication-policy automatic \
  --data-file -
  • Token bota
echo -n $BOT_TOKEN | gcloud secrets create bot-token \
  --replication-policy automatic \
  --data-file -

Uzyskiwanie dostępu do obiektów tajnych

Sprawdźmy, czy Twoje klucze tajne zostały utworzone prawidłowo i czy uprawnienia działają. Uzyskaj dostęp do kluczy tajnych za pomocą tych poleceń:

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

Możesz też wyświetlać tajne klucze i zarządzać nimi w konsoli Google Cloud.

7. Pobieranie przykładowego kodu

W Cloud Shell w wierszu poleceń uruchom to polecenie, aby sklonować repozytorium GitHub:

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

Przejdź do katalogu cloud-slack-bot/start.

cd cloud-slack-bot/start

Wyjaśnienie kodu

Otwórz plik kittenbot.js w preferowanym edytorze wiersza poleceń (nano, vim, emacs...) lub za pomocą tego polecenia, aby bezpośrednio otworzyć bieżący folder w edytorze Cloud Shell:

cloudshell workspace .

Kod kittenbota ma 2 główne funkcje. Jedna służy do pobierania kluczy tajnych, a druga do uruchamiania bota.

Najpierw importujemy zależności:

kittenbot.js

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

SlackAdapter i SlackEventMiddleware to pakiety rozszerzające Botkit, które umożliwiają botowi łatwe tłumaczenie wiadomości na potrzeby interfejsu Slack API i z niego. Klient Secret Manager umożliwi Ci dostęp do obiektów tajnych zapisanych w poprzednim kroku.

Następnie mamy funkcję pobierania obiektów tajnych:

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

Ta funkcja zwraca wartości ciągów znaków z informacjami tajnymi potrzebnymi do uwierzytelnienia bota.

Kolejna funkcja inicjuje bota:

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

Pierwsza część funkcji konfiguruje SlackAdapter za pomocą kluczy tajnych, a następnie określa punkt końcowy do odbierania wiadomości. Gdy kontroler jest włączony, bot odpowiada na każdą wiadomość zawierającą słowa „hello”, „hi” lub „hey” słowem „Meow”. 😺".

Sprawdź te elementy w manifeście aplikacji:

package.json

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

Aplikację Node.js możesz wdrożyć bezpośrednio ze źródła za pomocą Cloud Run. W tle nastąpią te działania:

  • Cloud Run wywołuje Cloud Build, aby skompilować obraz kontenera (patrz Wdrażanie z kodu źródłowego).
  • Jeśli w katalogu kodu źródłowego znajduje się plik Dockerfile, Cloud Build używa go do utworzenia obrazu kontenera.
  • Jeśli tak nie jest, Cloud Build wywołuje pakiety kompilacji, aby przeanalizować źródło i automatycznie wygenerować obraz gotowy do wykorzystania w środowisku produkcyjnym.
  • Buildpack wykrywa manifest package.json i tworzy obraz Node.js.
  • Pole scripts.start określa sposób uruchamiania aplikacji.
  • Pole engines.node określa wersję Node.js obrazu bazowego kontenera.
  • Podczas wdrażania automatycznie stosowane są znane poprawki zabezpieczeń.

Możesz wdrożyć aplikację.

8. Wdrażanie aplikacji

Interfejs Slack Events API używa webhooków do wysyłania wiadomości wychodzących o zdarzeniach. Podczas konfigurowania aplikacji Slack musisz podać publicznie dostępny adres URL, na który interfejs Slack API będzie wysyłać pingi.

Cloud Run to dobre rozwiązanie do hostowania miejsc docelowych webhooka. Umożliwia to używanie dowolnego języka lub środowiska wykonawczego i zapewnia współbieżność, co oznacza, że aplikacja będzie w stanie obsłużyć znacznie większy ruch.

Pobieranie identyfikatora projektu

Zdefiniuj zmienną środowiskową PROJECT_ID:

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

Określanie regionu Cloud Run

Cloud Run działa regionalnie, co oznacza, że infrastruktura, która uruchamia Twoją usługę Cloud Run, znajduje się w określonym regionie i jest zarządzana przez Google w taki sposób, aby była redundantnie dostępna we wszystkich strefach w tym regionie. Określ region, w którym chcesz wdrożyć usługę, np.:

REGION="us-central1"

Zaktualizuj uprawnienia

Aby konto usługi Cloud Run mogło uzyskać dostęp do obiektów tajnych z usługi Secret Manager, musi mieć przypisaną rolę roles/secretmanager.secretAccessor.

Najpierw zapisz domyślne konto usługi w zmiennej środowiskowej:

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

Sprawdź, czy masz zapisany adres e-mail:

echo $SERVICE_ACCOUNT

Konto usługi ma następujący format: PROJECT_NUMBER-compute@developer.gserviceaccount.com.

Gdy uzyskasz adres e-mail, włącz rolę dla konta usługi:

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

Wdrażanie aplikacji

Usługa Cloud Run ujawnia unikalny punkt końcowy i automatycznie skaluje dotychczasową infrastrukturę pod kątem obsługi żądań przychodzących.

Wdróż aplikację w Cloud Run:

gcloud run deploy kittenbot \
  --source . \
  --platform managed \
  --region $REGION \
  --set-env-vars PROJECT_ID=$PROJECT_ID \
  --allow-unauthenticated
  • Spowoduje to utworzenie usługi o nazwie kittenbot.
  • Opcja --source używa bieżącego folderu do skompilowania aplikacji za pomocą Cloud Build. Cloud Build automatycznie wykrywa obecność pliku package.json.
  • Możesz też zdefiniować region domyślny za pomocą tego polecenia: gcloud config set run/region $REGION
  • Możesz też ustawić Cloud Run jako domyślną usługę zarządzaną za pomocą tego polecenia: gcloud config set run/platform managed
  • Opcja --set-env-vars ustawia zmienne środowiskowe usługi.
  • Opcja --allow-unauthenticated sprawia, że usługa jest dostępna publicznie.

Gdy zrobisz to po raz pierwszy, pojawi się prośba o utworzenie repozytorium Artifact Registry. Aby sprawdzić poprawność, kliknij 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)?

Spowoduje to przesłanie kodu źródłowego do repozytorium Artifact Registry i skompilowanie obrazu kontenera:

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

Następnie poczekaj chwilę na zakończenie kompilacji i wdrażania. Kiedy operacja zostanie wykonana, w wierszu poleceń wyświetli się URL usługi:

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

Adres URL usługi możesz uzyskać za pomocą tego polecenia:

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

Adres URL ma format:

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

Ten adres URL będzie podstawą do włączenia interfejsu Slack Events API. Skopiuj go do schowka, aby użyć go w następnym kroku.

Twoja usługa jest już aktywna i dostępna publicznie. Więcej informacji znajdziesz w konsoli Cloud Run. fee46ea7c8483d56.png

Możesz sprawdzić, kiedy została utworzona ostatnia wersja, jaki jest jej ruch i przejrzeć logi. Jeśli klikniemy dzienniki, zobaczymy, że kontroler Botkit jest włączony i gotowy do odbierania wiadomości.

Teraz zacznijmy wysyłać wiadomości z naszego kanału Slack.

9. Włączanie zdarzeń Slacka

Jak widzieliśmy wcześniej, kod kittenbota określa względny punkt końcowy dla naszego miejsca docelowego webhooka.

kittenbot.js

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

Oznacza to, że pełny adres URL będzie składać się z części podstawowej z usługi Cloud Run i /api/messages.

Włączanie Wydarzeń

Na stronie zarządzania aplikacjami w sekcji Subskrypcje zdarzeń na pasku bocznym włącz opcję Włącz zdarzenia. Wpisz adres URL usługi:

PASTE_THE_SERVICE_URL/api/messages

5179a99339839999.png

W zależności od tego, jak szybko wpiszesz adres URL, może on zostać zweryfikowany, zanim skończysz. Jeśli się nie uda, kliknij „Ponów”.

Subskrybuj

Subskrybuj wszystkie zdarzenia bota do obsługi wiadomości.

1e8f200390908a9b.png

U dołu strony kliknij Zapisz zmiany. Pojawi się prośba o ponowne zainstalowanie aplikacji. Postępuj zgodnie z instrukcjami i kliknij Zezwól.

Na tym etapie bot jest już w pełni zintegrowany. Wiadomości na obszarze roboczym spowodują, że Slack wyśle wiadomości do Twojej usługi Cloud Run, która z kolei odpowie prostym powitaniem.

10. Przetestuj bota

Wysyłanie wiadomości na czacie do Kittenbota:

1f442dd7fd7b5773.png

Dodaj kittenbota do swojego kanału, wpisując „@kittenbot”, a następnie klikając „Invite Them” (Zaproś).

9788d2167ce47167.png

Teraz każdy na Twoim kanale może wchodzić w interakcje z Kittenbotem.

9c0d1d7907a51767.png

Każda wiadomość w Slacku wywołuje zdarzenie i wysyła wiadomość HTTP POST do naszej usługi Cloud Run. Jeśli przyjrzysz się logom usługi Cloud Run, zobaczysz, że każda wiadomość odpowiada wpisowi POST w logu.

1ff0c2347bf464e8.png

Kittenbot odpowiada na każdą wiadomość słowem „Miau”. 😺".

11. Bonus – aktualizowanie bota

Ta opcjonalna sekcja powinna zająć kilka minut. Możesz przejść bezpośrednio do sekcji Czyszczenie.

Wątki konwersacyjne

Chcemy, aby bot robił coś więcej niż tylko mówił „miau”. Jak wdrożyć nową wersję czegoś, co działa w Cloud Run?

Przejdź do katalogu cloud-slack-bot/extra-credit:

cd ../extra-credit/

Otwórz bieżący folder w edytorze Cloud Shell:

cloudshell workspace .

Botkit umożliwia prowadzenie rozmów. Dzięki temu bot może prosić o więcej informacji i reagować na wiadomości, a nie tylko odpowiadać jednym słowem.

Określanie okna

Najpierw sprawdź, jak na końcu pliku zdefiniowane są funkcje konwersacyjne:

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

Nowa rozmowa kieruje wątkiem na podstawie odpowiedzi. Jeśli na przykład użytkownik odpowie „nie” na pytanie o kocięta, przejdzie do wiadomości z etykietą „no_kittens”, która jest końcem tego wątku rozmowy.

Dodawanie okna do kontrolera

Skoro rozmowa jest już zdefiniowana, zobacz, jak dodać ją do kontrolera:

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

Wywołaj okno

Teraz to okno jest dostępne dla kontrolera. Zobacz, jak rozpoczyna się rozmowa, gdy chatbot usłyszy słowo „kitten”, „kittens”, „cat” lub „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

    // ...
  });

  // ...

Zaktualizowanie aplikacji

Ponownie wdróż aplikację w Cloud Run:

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

Wypróbuj

eca12b3463850d52.png

Gratulacje! Właśnie udało Ci się zaktualizować do nowej wersji bota Slacka działającego w Cloud Run.

Polecenia rozpoczynające się ukośnikiem

Co zrobić, jeśli nie chcesz rozmawiać z użytkownikiem? A co, jeśli wolisz po prostu wywołać działanie za pomocą jednego prostego polecenia?

Slack oferuje tę funkcję za pomocą poleceń po ukośniku, które umożliwiają użytkownikom wywoływanie aplikacji przez wpisanie polecenia w polu wiadomości.

Włączanie poleceń rozpoczynających się ukośnikiem w Slacku

  • Na stronie zarządzania aplikacjami w sekcji Funkcje otwórz sekcję Polecenia z ukośnikiem.
  • Kliknij Utwórz nowe polecenie.
  • Skonfiguruj polecenie /cats, podając adres URL usługi kittenbot. Pamiętaj, aby użyć tego samego punktu końcowego, którego użyto do włączenia interfejsu Events API. Jest to Twój adres URL plus '/api/messages'.

e34d393c14308f28.png

  • Postępuj zgodnie z instrukcjami, aby zaktualizować aplikację i uprawnienia.

Dodawanie poleceń po ukośniku do kontrolera

Zobacz, jak w funkcji controller.ready dodano obsługę poleceń po ukośniku:

  // ...

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

  // ...

Wypróbuj

Wpisz /cats i liczbę, aby wysłać polecenie po ukośniku. Np. /cats 8

c67f6fe1ffcafec8.png

Bot odpowie 8 kotami, które będą widoczne tylko dla Ciebie:

9c1b256987fd379a.png

12. Czyszczenie

Gratulujemy! Bot Slack działa już w Cloud Run. Czas na wyczyszczenie używanych zasobów (aby zaoszczędzić i być dobrym użytkownikiem chmury).

Usuwanie projektu

Możesz usunąć cały projekt bezpośrednio z Cloud Shell:

gcloud projects delete $PROJECT_ID

Jeśli wolisz usuwać poszczególne zasoby, przejdź do następnej sekcji.

Usuń wdrożenie

gcloud run services delete kittenbot --region $REGION

Wynik polecenia

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

Usuwanie tajnego klucza podpisywania klienta

gcloud secrets delete client-signing-secret

Wynik polecenia

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

Usuwanie tajnego tokena bota

gcloud secrets delete bot-token

Wynik polecenia

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

Usuń zasobniki na dane

Najpierw wyświetl listę zasobników Google Cloud Storage, aby uzyskać ścieżkę do zasobnika:

gsutil ls

Wynik polecenia

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

Teraz usuń zasobnik artefaktów:

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

Wynik polecenia

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

Na koniec usuń zasobnik cloudbuild:

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

Wynik polecenia

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

13. Gratulacje!

528302981979de90.png

Wiesz już, jak uruchomić bota Slacka w Cloud Run.

Zaledwie zarysowaliśmy tę technologię i zachęcamy do dalszego poznawania jej możliwości w ramach własnych wdrożeń Cloud Run.

Omówione zagadnienia

  • Tworzenie niestandardowej integracji bota w Slacku
  • Zabezpieczanie obiektów tajnych Slacka za pomocą usługi Secret Manager
  • Wdrażanie bota Slacka w Cloud Run

Następne kroki

Więcej informacji