Tworzenie bota Slacka z Node.js w Cloud Run

1. Omówienie

5f529fb87abc11c9.png

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

Czego się nauczysz

  • Jak utworzyć niestandardową integrację bota w Slacku
  • Jak chronić obiekty tajne Slacka za pomocą usługi 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 wykorzystasz ten samouczek?

Tylko do przeczytania Przeczytaj go i wykonaj ćwiczenia

Jak oceniasz swoje doświadczenia z Google Cloud?

Początkujący Poziom średnio zaawansowany Biegły
.

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

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

98e4187c97cf2e0e.png

37d264871000675d.png

c20a9642aaa18d11.png

  • Nazwa projektu jest wyświetlaną nazwą uczestników tego projektu. To ciąg znaków, który nie jest używany przez interfejsy API Google. W każdej chwili możesz ją zaktualizować.
  • Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić (po jego ustawieniu nie można go zmienić). Cloud Console automatycznie wygeneruje unikalny ciąg znaków. zwykle nieważne, co ona jest. W większości ćwiczeń w Codelabs musisz podać swój identyfikator projektu (zwykle identyfikowany jako PROJECT_ID). Jeśli nie podoba Ci się wygenerowany identyfikator, możesz wygenerować kolejny losowy. Możesz też spróbować własnych sił i sprawdzić, czy jest dostępna. Po wykonaniu tej czynności nie można jej już zmienić. Pozostanie ona przez cały czas trwania projektu.
  • Jest jeszcze trzecia wartość, numer projektu, z którego korzystają niektóre interfejsy API. Więcej informacji o wszystkich 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w Cloud Console, aby korzystać z zasobów Cloud/interfejsów API. Ukończenie tego ćwiczenia z programowania nic nie kosztuje. Aby wyłączyć zasoby w celu uniknięcia 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

Google Cloud można obsługiwać zdalnie z poziomu laptopa, ale w tym samouczku będziesz używać Cloud Shell – środowiska wiersza poleceń działającego w Cloud.

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 tej usługi. Jeśli wyświetlił się ekran pośredni, kliknij Dalej.

d95252b003979716.png

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

7833d5e1c5d18f54.png

Ta maszyna wirtualna ma wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Większość zadań w ramach tego ćwiczenia z programowania można wykonać w przeglądarce.

Po nawiązaniu połączenia z Cloud Shell powinno pojawić się potwierdzenie, że użytkownik jest uwierzytelniony, a projekt jest ustawiony na identyfikator Twojego projektu.

  1. Uruchom to polecenie w Cloud Shell, aby potwierdzić, że jesteś uwierzytelniony:
gcloud auth list

Dane wyjściowe polecenia

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Uruchom to polecenie w Cloud Shell, aby sprawdzić, czy polecenie gcloud zna Twój projekt:
gcloud config list project

Dane wyjściowe polecenia

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

Dane wyjściowe polecenia

Updated property [core/project].

3. Włączanie interfejsów API

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

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

Zostaje wyświetlony komunikat o powodzeniu podobny do tego:

Operation "operations/..." finished successfully.

Możesz teraz przygotować i wdrożyć aplikację...

4. Tworzenie obszaru roboczego w Slacku

Potrzebujesz obszaru roboczego Slacka, w którym możesz tworzyć niestandardowe integracje. Możesz bezpłatnie utworzyć obszar roboczy, jeśli nie masz jeszcze obszaru, którego chcesz użyć w tym samouczku.

aa1f0fda82263bf8.png

5. Tworzenie użytkownika bota Slacka

Użytkownik bota może słuchać wiadomości na Slacku, publikować wiadomości i przesyłać pliki. W ramach tego ćwiczenia w Codelabs utworzysz bota, który opublikuje prostą wiadomość powitalną.

Tworzenie nowej aplikacji Slack

  • Otwórz stronę zarządzania aplikacjami Slack.
  • Kliknij przycisk Utwórz nową aplikację w prawym górnym rogu.
  • Nazwij aplikację, na przykład „Kittenbot”.
  • Wybierz zespół Slacka, w którym chcesz go zainstalować.

Tworzenie użytkownika bota

  • W panelu bocznym po lewej stronie otwórz stronę główną aplikacji w sekcji Funkcje.

414213b184fcc992.png

  • Przypisz zakres do tokena bota, klikając Przejrzyj zakresy do dodania.
  • Przewiń w dół do sekcji Zakresy tokenów bota i kliknij Dodaj zakres protokołu OAuth. Aby wybrać „Wysyłaj wiadomości jako Kittenbot”, wybierz chat:write

74a6fa87c64c2b23.png

  • Przewiń w górę i kliknij przycisk Zainstaluj aplikację w swoim obszarze roboczym.
  • Spowoduje to zainstalowanie aplikacji w Twoim zespole, dodanie utworzonego przez Ciebie użytkownika bota i wygenerowanie tokena bota.
  • Gdy zobaczysz komunikat, kliknij Zezwól. aby autoryzować bota do czatowania w 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

  • Otwórz Informacje podstawowe w sekcji Ustawienia.
  • Przewiń w dół do sekcji Podpisz tajny klucz, kliknij Pokaż,a następnie skopiuj tajny klucz do schowka:

74cfd6616fa71dc4.png

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

Uzyskiwanie tokena bota

  • Otwórz sekcję OAuth i Uprawnienia w sekcji Funkcje.
  • Kliknij przycisk Kopiuj, aby skopiować do schowka tekst Token dostępu OAuth użytkownika bota.

6f5a18069471101.png

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

Bez obaw. Jeśli chcesz ponownie uzyskać te tokeny, możesz wrócić na tę stronę konfiguracji ze strony zarządzania aplikacjami .

6. Chroń swoje tajemnice

Chcemy mieć pewność, że Twój token bota i tajny klucz podpisywania klienta są przechowywane w bezpieczny sposób. Zakodowanie ich na stałe w kodzie źródłowym powoduje, że istnieje ryzyko ich przypadkowego ujawnienia przez opublikowanie ich w ramach kontroli wersji lub umieszczenie ich w obrazie Dockera.

Usługa Secret Manager to bezpieczna i wygodna metoda przechowywania kluczy interfejsu API, haseł, certyfikatów i innych danych wrażliwych. Usługa Secret Manager to centralne miejsce i jedno źródło danych umożliwiających zarządzanie obiektami tajnymi, uzyskiwanie do nich dostępu i ich kontrolowanie w Google Cloud.

Tworzenie obiektów tajnych

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

  • Tajny klucz podpisywania klienta
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 -

Uzyskaj dostęp do obiektów tajnych

Sprawdź, czy obiekty tajne zostały poprawnie utworzone, a uprawnienia działają. Uzyskaj dostęp do obiektów tajnych za pomocą tych poleceń:

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

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

7. Pobieranie przykładowego kodu

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

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

Zmień katalog na cloud-slack-bot/start.

cd cloud-slack-bot/start

Zrozumienie 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. Jednym z nich jest pobranie obiektów tajnych, a drugim uruchomienie 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, które rozszerzają możliwości Botkit i umożliwiają botowi łatwe tłumaczenie wiadomości do i z interfejsu Slack API. Klient usługi 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 obiektów tajnych niezbędnych do uwierzytelnienia bota.

Następna 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 z obiektami tajnymi, a następnie określa punkt końcowy do odbierania wiadomości. Następnie, gdy kontroler będzie włączony, bot będzie odpowiadać na wiadomości zawierające słowa „cześć”, „cześć” lub „hej”. i „Miow. 😺”.

Przejrzyj te elementy pliku manifestu 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. Przeprowadzamy te działania:

  • Cloud Run wywołuje Cloud Build, aby utworzyć obraz kontenera (patrz Wdrażanie z kodu źródłowego).
  • Jeśli w katalogu z kodem źródłowym znajduje się zasób Dockerfile, Cloud Build użyje go do utworzenia obrazu kontenera.
  • Ponieważ go nie ma, Cloud Build wywołuje Buildpacks, aby przeanalizować źródło i automatycznie wygenerować obraz gotowy do wykorzystania w środowisku produkcyjnym.
  • Buildpacks wykrywa plik manifestu 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 podstawowego kontenera.
  • Podczas wdrażania automatycznie stosowane są znane poprawki zabezpieczeń.

Możesz już 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, pod którym interfejs Slack API będzie mógł wysyłać pingi.

Cloud Run jest dobrym rozwiązaniem do hostowania celów webhooka. Pozwala ona na korzystanie z dowolnego języka i czasu działania oraz zapewnia równoczesność, co oznacza, że aplikacja będzie w stanie obsłużyć znacznie większą ilość treści.

Pobieranie identyfikatora projektu

Zdefiniuj zmienną środowiskową PROJECT_ID:

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

Definiowanie regionu Cloud Run

Cloud Run działa regionalnie, co oznacza, że infrastruktura, w której działa usługa Cloud Run, znajduje się w określonym regionie i jest zarządzana przez Google, aby zapewnić nadmiarową dostępność we wszystkich strefach w tym regionie. Określ region, którego będziesz używać we wdrożeniu, na przykład:

REGION="us-central1"

Aktualizowanie uprawnień

Aby uzyskać dostęp do obiektów tajnych z usługi Secret Manager, do konta usługi Cloud Run należy przypisać 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 adres e-mail został zapisany:

echo $SERVICE_ACCOUNT

Konto usługi ma ten format: PROJECT_NUMBER-compute@developer.gserviceaccount.com.

Po uzyskaniu adresu 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 kompilowania aplikacji za pomocą Cloud Build. Cloud Build automatycznie wykrywa obecność pliku package.json.
  • Region domyślny możesz też zdefiniować za pomocą tego polecenia: gcloud config set run/region $REGION
  • Możesz też domyślnie włączyć zarządzanie usługą Cloud Run za pomocą tego polecenia: gcloud config set run/platform managed
  • Opcja --set-env-vars ustawia zmienne środowiskowe usługi.
  • Opcja --allow-unauthenticated powoduje udostępnienie usługi publicznie.

Za pierwszym razem zobaczysz prośbę o utworzenie repozytorium Artifact Registry. Naciśnij Enter, aby sprawdzić poprawność:

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 uruchomienie przesyłania kodu źródłowego do repozytorium Artifact Registry i kompilacji 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 następujący format:

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

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

Twoja usługa jest teraz dostępna publicznie. Otwórz konsolę Cloud Run, aby dowiedzieć się więcej. fee46ea7c8483d56.png

Możesz zobaczyć, kiedy została utworzona ostatnia wersja i ile generuje ona ruchu, oraz przejrzeć logi. Jeśli klikniemy logi, zobaczymy, że kontroler Botkit jest włączony i gotowy do odbierania komunikatów.

A teraz zacznijmy wysyłać wiadomości z naszego kanału na Slacku.

9. Włącz zdarzenia w Slacku

Jak widzieliśmy wcześniej, nasz kod Kittenbota określa względny punkt końcowy dla elementu docelowego webhooka.

kittenbot.js

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

Oznacza to, że pełny adres URL będzie podstawową częścią z usługi Cloud Run plus /api/messages.

Włącz zdarzenia

Na stronie zarządzania aplikacjami otwórz sekcję Subskrypcje wydarzeń na pasku bocznym i włącz opcję Włącz wydarzenia. Podaj adres URL swojej usługi:

PASTE_THE_SERVICE_URL/api/messages

5179a99339839999.png

W zależności od tego, jak szybko wpisujesz adres URL, może on spróbować sprawdzić go przed zakończeniem. Jeśli się nie uda, kliknij „Spróbuj ponownie”.

Subskrybuj

Subskrybuj wszystkie zdarzenia dotyczące bota 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 Twój bot jest już w pełni zintegrowany. Komunikaty w obszarze roboczym aktywują Slacka do wysyłania wiadomości do usługi Cloud Run, która z kolei wyśle proste powitanie.

10. Przetestuj bota

Wyślij wiadomość na czacie do Kittenbota:

1f442dd7fd7b5773.png

Dodaj kittenbota do swojego kanału, wpisując „@kittenbot” i kliknij „Zaproś”.:

9788d2167ce47167.png

Teraz wszyscy na Twoim kanale mogą wchodzić w interakcję z Kittenbotem.

9c0d1d7907a51767.png

Każda wiadomość w Slacku aktywuje zdarzenie i wysyła wiadomość HTTP POST do naszej usługi Cloud Run. W logach usługi Cloud Run zobaczysz, że każdy komunikat odpowiada wpisowi POST w dzienniku.

1ff0c2347bf464e8.png

Na każdą wiadomość kotek odpowiada: „Miau. 😺”.

11. Dodatkowo – zaktualizuj bota

Wykonanie tej opcjonalnej sekcji powinno zająć kilka minut. Możesz od razu przejść do narzędzia Czyszczenie.

Wątki z wątkami

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

Zmień katalog na cloud-slack-bot/extra-credit:

cd ../extra-credit/

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

cloudshell workspace .

Botkit umożliwia obsługę rozmów. Dzięki nim bot może prosić o więcej informacji i reagować na wiadomości nie tylko na podstawie odpowiedzi 1 słowem.

Definiowanie okna

Najpierw sprawdź na końcu pliku sposób definiowania funkcji konwersacyjnych:

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

W nowej rozmowie pokierujemy wątek na podstawie odpowiedzi. Jeśli na przykład użytkownik odpowie „nie” na pytanie z kotami, przechodzi do wiadomości o nazwie „brak_kotów”, która jest końcem wątku.

Dodawanie okna do kontrolera

Po zdefiniowaniu wątku zobacz, jak dodać go 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łanie okna

Kontroler jest już dostępny, sprawdź, jak zaczyna się rozmowa, gdy czatbot usłyszy „kotek”, „koty”, „kot” lub „koty”:

  // ...

  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

Wdróż ponownie 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 zaktualizowałeś bota Slacka działającego w Cloud Run do nowej wersji.

Polecenia po ukośniku

Co zrobić, jeśli użytkownik nie chce rozmawiać? A jeśli wolisz wywoływać działanie za pomocą jednego prostego polecenia?

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

Włącz polecenia po ukośniku w Slacku

  • Przejdź do sekcji Polecenia po ukośniku w obszarze Funkcje na stronie zarządzania aplikacjami.
  • 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óry został użyty do włączenia interfejsu Events API. To jest 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 dodano moduł obsługi poleceń po ukośniku w funkcji 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
  });

  // ...

Wypróbuj

Wpisz /cats plus liczbę, by wysłać polecenie po ukośniku. Na przykład: /cats 8

c67f6fe1ffcafec8.png

Bot w odpowiedzi wyświetli 8 kotów widocznych tylko dla Ciebie:

9c1b256987fd379a.png

12. Czyszczenie

Gratulacje! Teraz w Cloud Run jest uruchomiony bot Slack. Czas na pozbycie się zbędnych zasobów (aby zmniejszyć koszty i zadbać o dobre korzystanie z chmury).

Usuwanie projektu

Cały projekt możesz usunąć bezpośrednio w Cloud Shell:

gcloud projects delete $PROJECT_ID

Jeśli wolisz pojedynczo usuwać różne zasoby, przejdź do następnej sekcji.

Usuwanie wdrożenia

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

Usuwanie zasobników na dane

Najpierw wymień zasobniki 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

Teraz już wiesz, jak uruchomić bota na Slacku w Cloud Run.

Dostrzegaliśmy już tylko najgłębsze możliwości tej technologii i zachęcamy do dalszych poszukiwań we własnych wdrożeniach Cloud Run.

Omówione zagadnienia

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

Następne kroki

Więcej informacji