Создайте бота Slack с помощью Node.js в Cloud Run

1. Обзор

5f529fb87abc11c9.png

В этой лаборатории кода вы узнаете, как создать бота Slack с помощью набора инструментов Botkit и запустить его в Google Cloud . Вы сможете взаимодействовать с ботом в живом канале Slack.

Что вы узнаете

  • Как создать собственную интеграцию бота в Slack
  • Как защитить ваши секреты Slack с помощью Secret Manager
  • Как развернуть бота Slack на Cloud Run , полностью управляемой вычислительной платформе, которая автоматически масштабирует ваши контейнеры без сохранения состояния.

Что вам понадобится

  • Проект Google Cloud
  • Браузер, такой как Chrome или Firefox.

Как вы будете использовать этот урок?

Прочтите только до конца Прочитайте его и выполните упражнения.

Как бы вы оценили свой опыт работы с Google Cloud?

Новичок Средний Опытный

2. Настройка и требования

Самостоятельная настройка среды

  1. Войдите в Google Cloud Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

98e4187c97cf2e0e.png

37d264871000675d.png

c20a9642aaa18d11.png

  • Имя проекта — это отображаемое имя для участников этого проекта. Это строка символов, не используемая API Google. Вы всегда можете обновить его.
  • Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (невозможно изменить после его установки). Cloud Console автоматически генерирует уникальную строку; обычно тебя не волнует, что это такое. В большинстве лабораторий кода вам потребуется указать идентификатор проекта (обычно идентифицируемый как PROJECT_ID ). Если вам не нравится сгенерированный идентификатор, вы можете создать другой случайный идентификатор. Кроме того, вы можете попробовать свой собственный и посмотреть, доступен ли он. Его нельзя изменить после этого шага и он сохраняется на протяжении всего проекта.
  • К вашему сведению, есть третье значение — номер проекта , которое используют некоторые API. Подробнее обо всех трех этих значениях читайте в документации .
  1. Затем вам необходимо включить выставление счетов в Cloud Console, чтобы использовать облачные ресурсы/API. Прохождение этой лаборатории кода не будет стоить много, если вообще что-то стоить. Чтобы отключить ресурсы и избежать выставления счетов за пределами этого руководства, вы можете удалить созданные вами ресурсы или удалить проект. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .

Запустить Cloud Shell

Хотя Google Cloud можно управлять удаленно с вашего ноутбука, в этом руководстве вы будете использовать Cloud Shell , среду командной строки, работающую в облаке.

Активировать Cloud Shell

  1. В Cloud Console нажмите «Активировать Cloud Shell». d1264ca30785e435.png .

84688aa223b1c3a2.png

Если вы запускаете Cloud Shell впервые, вы увидите промежуточный экран с описанием того, что это такое. Если вам был представлен промежуточный экран, нажмите «Продолжить» .

d95252b003979716.png

Подготовка и подключение к Cloud Shell займет всего несколько минут.

7833d5e1c5d18f54.png

Эта виртуальная машина загружена всеми необходимыми инструментами разработки. Он предлагает постоянный домашний каталог объемом 5 ГБ и работает в Google Cloud, что значительно повышает производительность сети и аутентификацию. Большую часть, если не всю, работу в этой лаборатории кода можно выполнить с помощью браузера.

После подключения к Cloud Shell вы увидите, что вы прошли аутентификацию и что для проекта установлен идентификатор вашего проекта.

  1. Выполните следующую команду в Cloud Shell, чтобы подтвердить, что вы прошли аутентификацию:
gcloud auth list

Вывод команды

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте:
gcloud config list project

Вывод команды

[core]
project = <PROJECT_ID>

Если это не так, вы можете установить это с помощью этой команды:

gcloud config set project <PROJECT_ID>

Вывод команды

Updated property [core/project].

3. Включите API

В Cloud Shell включите API-интерфейсы Artifact Registry, Cloud Build, Cloud Run и Secret Manager:

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

Это выводит сообщение об успехе, подобное этому:

Operation "operations/..." finished successfully.

Теперь вы готовы подготовить и развернуть свое приложение...

4. Создайте рабочее пространство Slack.

Вам понадобится рабочее пространство Slack, где вы сможете создавать собственные интеграции. Вы можете бесплатно создать рабочую область, если у вас ее еще нет, и вы хотите использовать ее для этого урока.

aa1f0fda82263bf8.png

5. Создайте пользователя-бота Slack.

Пользователь бота может прослушивать сообщения в Slack, публиковать сообщения и загружать файлы. В этой лаборатории кода вы создадите бота для публикации простого приветственного сообщения.

Создайте новое приложение Slack.

  • Перейдите на страницу управления приложениями Slack .
  • Нажмите кнопку «Создать новое приложение» в правом верхнем углу.
  • Дайте приложению имя, например «Kittenbot».
  • Выберите команду Slack, в которой вы хотите ее установить.

Создать пользователя-бота

  • Перейдите на главную страницу приложения на левой панели в разделе «Функции».

414213b184fcc992.png

  • Назначьте область для токена вашего бота, нажав «Просмотреть области для добавления».
  • Прокрутите вниз до раздела «Области действия токена бота» и нажмите «Добавить область OAuth» . Выберите chat:write «Отправлять сообщения как Kittenbot»

74a6fa87c64c2b23.png

  • Прокрутите вверх и нажмите кнопку «Установить приложение в рабочую область» .
  • Это позволит установить приложение в вашу команду, добавить только что созданного пользователя-бота и сгенерировать токен бота.
  • При появлении запроса нажмите « Разрешить », чтобы разрешить боту общаться в чате в вашем рабочем пространстве.

Включить сообщения и команды

  • Прокрутите вниз до пункта «Показать вкладки» и убедитесь, что обе опции включены:

5ca52f7abbdc15c.png

Получить секрет подписи клиента

  • Перейдите в раздел «Основная информация» в разделе «Настройки» .
  • Прокрутите вниз до раздела «Секрет подписи» , нажмите «Показать», а затем скопируйте секрет в буфер обмена:

74cfd6616fa71dc4.png

  • Сохраните секрет в переменной среды:
CLIENT_SIGNING_SECRET=PASTE_THE_SIGNING_SECRET

Получить токен бота

  • Перейдите в раздел «OAuth и разрешения» в разделе «Функции» .
  • Нажмите кнопку «Копировать» , чтобы скопировать текст токена доступа OAuth пользователя бота в буфер обмена.

6f5a18069471101.png

  • Сохраните токен бота в переменной среды:
BOT_TOKEN=PASTE_THE_BOT_TOKEN

Не волнуйся. Вы можете вернуться на эту страницу конфигурации со страницы управления приложениями, если вам нужно снова получить эти токены.

6. Защитите свои секреты

Мы хотим гарантировать, что ваш токен бота и секрет подписи вашего клиента надежно хранятся. Их жесткое кодирование в исходном коде повышает вероятность случайного раскрытия этих секретов при публикации их в системе контроля версий или встраивании в образ Docker.

Secret Manager предоставляет безопасный и удобный метод хранения ключей API, паролей, сертификатов и других конфиденциальных данных. Secret Manager предоставляет центральное место и единый источник достоверной информации для управления, доступа и аудита секретов в Google Cloud.

Создайте свои секреты

Сохраните секрет подписи клиента и токен бота с помощью следующих команд:

  • Секрет подписи клиента
echo -n $CLIENT_SIGNING_SECRET | gcloud secrets create client-signing-secret \
  --replication-policy automatic \
  --data-file -
  • Токен бота
echo -n $BOT_TOKEN | gcloud secrets create bot-token \
  --replication-policy automatic \
  --data-file -

Получите доступ к своим секретам

Давайте подтвердим, что ваши секреты были созданы правильно и ваши разрешения работают. Получите доступ к своим секретам с помощью следующих команд:

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

Вы также можете просматривать свои секреты и управлять ими в консоли Google Cloud .

7. Получите пример кода

В Cloud Shell в командной строке выполните следующую команду, чтобы клонировать репозиторий GitHub :

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

Измените каталог на cloud-slack-bot/start .

cd cloud-slack-bot/start

Понимание кода

Откройте файл kittenbot.js с помощью предпочитаемого вами редактора командной строки (nano, vim, emacs...) или с помощью следующей команды, чтобы напрямую открыть текущую папку в редакторе Cloud Shell:

cloudshell workspace .

Код котенка-бота имеет две основные функции. Один из них — получить секреты, а другой — запустить бота.

Сначала импортируем зависимости:

котенокbot.js

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

SlackAdapter и SlackEventMiddleware — это пакеты, которые расширяют Botkit и позволяют боту легко переводить сообщения в API Slack и обратно. Клиент Secret Manager позволит вам получить доступ к секретам, которые вы сохранили на предыдущем этапе.

Далее у нас есть функция для получения секретов:

/**
 * Returns the secret string from Google Cloud Secret Manager
 * @param {string} name The name of the secret.
 * @return {Promise<string>} The string value of the secret.
 */
async function accessSecretVersion(name) {
  const client = new SecretManagerServiceClient();
  const projectId = process.env.PROJECT_ID;
  const [version] = await client.accessSecretVersion({
    name: `projects/${projectId}/secrets/${name}/versions/1`,
  });

  // Extract the payload as a string.
  const payload = version.payload.data.toString('utf8');

  return payload;
}

Эта функция возвращает строковые значения секретов, необходимых для аутентификации бота.

Следующая функция инициализирует бота:

/**
 * Function to initialize kittenbot.
 */
async function kittenbotInit() {
  const adapter = new SlackAdapter({
    clientSigningSecret: await accessSecretVersion('client-signing-secret'),
    botToken: await accessSecretVersion('bot-token'),
  });

  adapter.use(new SlackEventMiddleware());

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

  controller.ready(() => {
    controller.hears(
      ['hello', 'hi', 'hey'],
      ['message', 'direct_message'],
      async (bot, message) => {
        await bot.reply(message, 'Meow. :smile_cat:');
      }
    );
  });
}

Первая часть функции настраивает SlackAdapter с секретами, а затем указывает конечную точку для получения сообщений. Затем, как только контроллер включится, бот ответит на любое сообщение, содержащее «привет», «привет» или «привет», словом «Мяу. 😺».

Ознакомьтесь с этими конкретными частями манифеста приложения:

пакет.json

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

Вы можете развернуть приложение Node.js непосредственно из исходного кода с помощью Cloud Run. Под капотом происходит следующее:

  • Cloud Run вызывает Cloud Build для создания образа контейнера (см. Развертывание из исходного кода ).
  • Если Dockerfile присутствует в каталоге исходного кода, Cloud Build использует его для создания образа контейнера.
  • Поскольку это не так, Cloud Build вызывает Buildpacks для анализа исходного кода и автоматического создания готового к работе образа.
  • Buildpacks обнаруживает манифест package.json и создает образ Node.js.
  • Поле scripts.start определяет способ запуска приложения.
  • Поле engines.node определяет версию Node.js базового образа контейнера.
  • Во время развертывания автоматически применяются известные исправления безопасности.

Вы готовы развернуть приложение!

8. Разверните приложение

API Slack Events использует веб-перехватчики для отправки исходящих сообщений о событиях. При настройке приложения Slack вам необходимо предоставить общедоступный URL-адрес для проверки связи API Slack.

Cloud Run — хорошее решение для размещения целевых веб-перехватчиков. Он позволяет вам использовать любой язык или среду выполнения, которые вам нравятся, и обеспечивает параллелизм, то есть ваше приложение сможет обрабатывать гораздо больший объем.

Получите идентификатор вашего проекта

Определите переменную среды PROJECT_ID:

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

Определите свой регион Cloud Run

Cloud Run является региональным. Это означает, что инфраструктура, на которой работает ваш сервис Cloud Run, расположена в определенном регионе и управляется Google, чтобы быть резервно доступной во всех зонах в этом регионе. Определите регион, который вы будете использовать для развертывания, например:

REGION="us-central1"

Обновите разрешения

Чтобы иметь доступ к секретам из Secret Manager, учетной записи службы Cloud Run необходимо предоставить роль roles/secretmanager.secretAccessor .

Сначала сохраните учетную запись службы по умолчанию в переменной среды:

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

Подтвердите, что адрес электронной почты сохранен:

echo $SERVICE_ACCOUNT

Учетная запись службы имеет следующий формат: PROJECT_NUMBER-compute@developer.gserviceaccount.com .

Получив адрес электронной почты, включите роль для учетной записи службы:

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

Развертывание приложения

Служба Cloud Run предоставляет уникальную конечную точку и автоматически масштабирует базовую инфраструктуру для обработки входящих запросов.

Разверните приложение в Cloud Run:

gcloud run deploy kittenbot \
  --source . \
  --platform managed \
  --region $REGION \
  --set-env-vars PROJECT_ID=$PROJECT_ID \
  --allow-unauthenticated
  • При этом создается сервис под названием kittenbot .
  • Опция --source использует текущую папку для сборки приложения с помощью Cloud Build. Cloud Build автоматически определяет наличие файла package.json .
  • Альтернативно вы можете определить регион по умолчанию с помощью этой команды: gcloud config set run/region $REGION
  • Вы также можете сделать Cloud Run управляемым по умолчанию с помощью этой команды: gcloud config set run/platform managed
  • Опция --set-env-vars устанавливает переменные среды службы.
  • Опция --allow-unauthenticated делает службу общедоступной.

В первый раз вы получите приглашение создать репозиторий реестра артефактов. Нажмите 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)?

Это запустит загрузку вашего исходного кода в репозиторий реестра артефактов и сборку вашего образа контейнера:

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

Затем подождите немного, пока сборка и развертывание не будут завершены. В случае успеха в командной строке отображается URL-адрес службы:

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

Вы можете получить URL-адрес службы с помощью этой команды:

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

URL-адрес имеет следующий формат:

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

Этот URL-адрес будет основой для включения API Slack Events. Скопируйте его в буфер обмена, чтобы использовать на следующем шаге.

Ваш сервис теперь доступен и общедоступен! Перейдите в консоль Cloud Run для получения дополнительной информации. плата46ea7c8483d56.png

Вы можете узнать, когда была создана последняя ревизия, сколько трафика она получила, а также просмотреть журналы. Если мы щелкнем по журналам, мы увидим, что контроллер Botkit включен и готов получать сообщения.

Теперь давайте начнем отправлять сообщения из нашего канала Slack!

9. Включите события Slack

Как мы видели ранее, код нашего котенка-бота указывает относительную конечную точку для нашего целевого веб-перехватчика.

котенокbot.js

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

Это означает, что наш полный URL-адрес будет базовой частью службы Cloud Run плюс /api/messages .

Включить события

На странице управления приложениями перейдите в раздел «Подписки на события» на боковой панели и включите параметр «Включить события» . Введите URL-адрес вашего сервиса:

PASTE_THE_SERVICE_URL/api/messages

5179a99339839999.png

В зависимости от того, как быстро вы вводите URL-адрес, он может попытаться подтвердить его до того, как вы закончите. Если это не удалось, нажмите «Повторить попытку».

Подписаться

Подпишитесь на все события бота.

1e8f200390908a9b.png

Нажмите «Сохранить изменения» внизу страницы. Вам будет предложено переустановить приложение . Пройдите через подсказки и нажмите «Разрешить».

На этом этапе ваш бот полностью интегрирован! Сообщения в рабочей области заставят Slack отправлять сообщения в вашу службу Cloud Run, которая, в свою очередь, ответит простым приветствием.

10. Проверьте своего бота

Отправьте прямое сообщение Kittenbot:

1f442dd7fd7b5773.png

Добавьте котенка-бота на свой канал, введя «@kittenbot» и нажав «Пригласить их».:

9788d2167ce47167.png

Теперь каждый на вашем канале может взаимодействовать с Kittenbot!

9c0d1d7907a51767.png

Каждое сообщение в Slack запускает событие и отправляет сообщение HTTP POST в нашу службу Cloud Run. Если вы посмотрите журналы службы Cloud Run, вы увидите, что каждое сообщение соответствует записи POST в журнале.

1ff0c2347bf464e8.png

Котенок-бот отвечает на каждое сообщение «Мяу. 😺».

11. Бонус — обновите своего бота.

Этот дополнительный раздел должен занять несколько минут. Не стесняйтесь сразу перейти к очистке.

Разговорные темы

Нам бы хотелось, чтобы бот делал больше, чем просто говорил «мяу». Но как развернуть новую версию чего-то, работающего в Cloud Run?

Измените каталог на cloud-slack-bot/extra-credit :

cd ../extra-credit/

Откройте текущую папку в редакторе Cloud Shell:

cloudshell workspace .

Botkit предлагает возможность обрабатывать диалоги . Благодаря им бот может запрашивать дополнительную информацию и реагировать на сообщения, выходящие за рамки ответа в одно слово.

Определите диалог

Сначала посмотрите, как в конце файла определяются диалоговые функции:

// ...
const maxCats = 20;
const catEmojis = [
  ':smile_cat:',
  ':smiley_cat:',
  ':joy_cat:',
  ':heart_eyes_cat:',
  ':smirk_cat:',
  ':kissing_cat:',
  ':scream_cat:',
  ':crying_cat_face:',
  ':pouting_cat:',
  ':cat:',
  ':cat2:',
  ':leopard:',
  ':lion_face:',
  ':tiger:',
  ':tiger2:',
];

/**
 * Function to concatenate cat emojis
 * @param {number} numCats Number of cat emojis.
 * @return {string} The string message of cat emojis.
 */
function makeCatMessage(numCats) {
  let catMessage = '';
  for (let i = 0; i < numCats; i++) {
    // Append a random cat from the list
    catMessage += catEmojis[Math.floor(Math.random() * catEmojis.length)];
  }
  return catMessage;
}

/**
 * Function to create the kitten conversation
 * @param {Object} controller The botkit controller.
 * @return {Object} The BotkitConversation object.
 */
function createKittenDialog(controller) {
  const convo = new BotkitConversation('kitten-delivery', controller);

  convo.ask('Does someone need a kitten delivery?', [
    {
      pattern: 'yes',
      handler: async (response, convo, bot) => {
        await convo.gotoThread('yes_kittens');
      },
    },
    {
      pattern: 'no',
      handler: async (response, convo, bot) => {
        await convo.gotoThread('no_kittens');
      },
    },
    {
      default: true,
      handler: async (response, convo, bot) => {
        await convo.gotoThread('default');
      },
    },
  ]);

  convo.addQuestion(
    'How many would you like?',
    [
      {
        pattern: '^[0-9]+?',
        handler: async (response, convo, bot, message) => {
          const numCats = parseInt(response);
          if (numCats > maxCats) {
            await convo.gotoThread('too_many');
          } else {
            convo.setVar('full_cat_message', makeCatMessage(numCats));
            await convo.gotoThread('cat_message');
          }
        },
      },
      {
        default: true,
        handler: async (response, convo, bot, message) => {
          if (response) {
            await convo.gotoThread('ask_again');
          } else {
            // The response '0' is interpreted as null
            await convo.gotoThread('zero_kittens');
          }
        },
      },
    ],
    'num_kittens',
    'yes_kittens'
  );

  // If numCats is too large, jump to start of the yes_kittens thread
  convo.addMessage(
    'Sorry, {{vars.num_kittens}} is too many cats. Pick a smaller number.',
    'too_many'
  );
  convo.addAction('yes_kittens', 'too_many');

  // If response is not a number, jump to start of the yes_kittens thread
  convo.addMessage("Sorry I didn't understand that", 'ask_again');
  convo.addAction('yes_kittens', 'ask_again');

  // If numCats is 0, send a dog instead
  convo.addMessage(
    {
      text:
        'Sorry to hear you want zero kittens. ' +
        'Here is a dog, instead. :dog:',
      attachments: [
        {
          fallback: 'Chihuahua Bubbles - https://youtu.be/s84dBopsIe4',
          text: '<https://youtu.be/s84dBopsIe4|' + 'Chihuahua Bubbles>!',
        },
      ],
    },
    'zero_kittens'
  );

  // Send cat message
  convo.addMessage('{{vars.full_cat_message}}', 'cat_message');

  convo.addMessage('Perhaps later.', 'no_kittens');

  return convo;
}

Этот новый разговор направляет поток на основе ответов. Например, если пользователь отвечает «нет» на вопрос о котенке, он переходит к сообщению с надписью «no_kittens», которое является концом этой цепочки разговоров.

Добавление диалога в контроллер

Теперь, когда диалог определен, посмотрим, как добавить его в контроллер:

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

  // Add Kitten Dialog
  const convo = createKittenDialog(controller);
  controller.addDialog(convo);

  // Controller is ready
  controller.ready(() => {
    // ...
  });
}

Запустить диалог

Теперь это диалоговое окно доступно для использования контроллером. Посмотрите, как начинается разговор, когда чат-бот слышит слова «котенок», «котята», «кошка» или «кошки»:

  // ...

  controller.ready(() => {
    controller.hears(
      ['hello', 'hi', 'hey'],
      ['message', 'direct_message'],
      async (bot, message) => {
        await bot.reply(message, 'Meow. :smile_cat:');
        return;
      }
    );

    // START: listen for cat emoji delivery
    controller.hears(
      ['cat', 'cats', 'kitten', 'kittens'],
      ['message', 'direct_message'],
      async (bot, message) => {
        // Don't respond to self
        if (message.bot_id !== message.user) {
          await bot.startConversationInChannel(message.channel, message.user);
          await bot.beginDialog('kitten-delivery');
          return;
        }
      }
    );
    // END: listen for cat emoji delivery

    // ...
  });

  // ...

Обновите приложение

Повторно разверните приложение в Cloud Run:

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

Попробуйте это

eca12b3463850d52.png

Поздравляем! Вы только что обновили бота Slack, работающего в Cloud Run, до новой версии.

Слэш-команды

Что делать, если вы не хотите разговаривать с пользователем? Что, если вы предпочитаете просто вызвать действие с помощью одной простой команды?

Slack предлагает эту функциональность через команды Slash , которые позволяют пользователям вызывать ваше приложение, вводя команду в окно сообщения.

Включить команды Slack Slash

  • Перейдите в раздел «Команды слэша» в разделе «Функции» на странице управления приложениями.
  • Нажмите «Создать новую команду» .
  • Настройте команду /cats с URL-адресом службы вашего котенка-бота. Не забудьте использовать ту же конечную точку, которую вы использовали для включения API событий! Это ваш URL плюс '/api/messages' .

e34d393c14308f28.png

  • Следуйте инструкциям, чтобы обновить приложение и разрешения.

Добавьте команды слэша в свой контроллер

Посмотрите, как внутри функции контроллера.ready был добавлен обработчик для слэш-команд:

  // ...

  // Controller is ready
  controller.ready(() => {
    // ...

    // START: slash commands
    controller.on('slash_command', async (bot, message) => {
      const numCats = parseInt(message.text);
      const response = makeCatMessage(numCats);
      bot.httpBody({ text: response });
    });
    // END: slash commands
  });

  // ...

Попробуйте это

Введите /cats плюс число, чтобы отправить команду косой черты. Например: /cats 8

c67f6fe1ffcafec8.png

Бот ответит 8 котами, видимыми только вам:

9c1b256987fd379a.png

12. Очистка

Поздравляем, теперь у вас есть бот Slack, работающий в Cloud Run. Пришло время провести некоторую очистку используемых ресурсов (чтобы сэкономить на расходах и стать хорошим гражданином облака).

Удалить проект

Вы можете удалить весь проект прямо из Cloud Shell:

gcloud projects delete $PROJECT_ID

Альтернативно, если вы предпочитаете удалять разные ресурсы один за другим, перейдите к следующему разделу.

Удалить развертывание

gcloud run services delete kittenbot --region $REGION

Вывод команды

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

Удалите секрет подписи клиента

gcloud secrets delete client-signing-secret

Вывод команды

You are about to destroy the secret [client-signing-secret] and its
[1] version(s). This action cannot be reversed.
Do you want to continue (Y/n)?  y
Deleted secret [client-signing-secret].

Удалите секрет токена бота

gcloud secrets delete bot-token

Вывод команды

You are about to destroy the secret [bot-token] and its [1]
version(s). This action cannot be reversed.
Do you want to continue (Y/n)?  y
Deleted secret [bot-token].

Удаление сегментов хранилища

Сначала перечислите сегменты Google Cloud Storage, чтобы получить путь к сегменту:

gsutil ls

Вывод команды

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

Теперь удалите корзину артефактов:

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

Вывод команды

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

Наконец, удалите корзину CloudBuild:

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

Вывод команды

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

13. Поздравляем!

528302981979de90.png

Теперь вы знаете, как запустить бота Slack в Cloud Run!

Мы лишь поверхностно коснулись этой технологии и рекомендуем вам продолжить ее изучение с помощью собственных развертываний Cloud Run.

Что мы рассмотрели

  • Создание пользовательской интеграции бота в Slack
  • Защита ваших секретов Slack с помощью Secret Manager
  • Развертывание бота Slack в Cloud Run

Следующие шаги

Узнать больше