Создайте бота 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 и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

98e4187c97cf2e0e.png

37d264871000675d.png

c20a9642aaa18d11.png

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

Запустить Cloud Shell

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

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

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

84688aa223b1c3a2.png

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

d95252b003979716.png

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

7833d5e1c5d18f54.png

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

После подключения к 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

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

74a6fa87c64c2b23.png

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

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

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

5ca52f7abbdc15c.png

Получите секретный ключ для подписи клиента.

  • Перейдите в раздел «Основные сведения» в настройках .
  • Прокрутите вниз до пункта «Signing Secret» , нажмите «Show», а затем скопируйте секрет в буфер обмена:

74cfd6616fa71dc4.png

  • Сохраните секретный ключ в переменной окружения:
CLIENT_SIGNING_SECRET=PASTE_THE_SIGNING_SECRET

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

  • Перейдите в раздел OAuth & Permissions в меню Features .
  • Нажмите кнопку «Копировать» , чтобы скопировать текст токена доступа 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 .

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

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

kittenbot.js

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

Пакеты SlackAdapter и SlackEventMiddleware расширяют функциональность Botkit и позволяют боту легко переводить сообщения в Slack API и обратно. Клиент 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 с секретами, а затем указывает конечную точку для приема сообщений. После включения контроллера бот будет отвечать на любое сообщение, содержащее «hello», «hi» или «hey», фразой «Meow. 😺».

Обратите внимание на следующие разделы в манифесте приложения:

package.json

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

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

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

Приложение готово к развертыванию!

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

API событий Slack использует веб-хуки для отправки исходящих сообщений о событиях. При настройке приложения 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)?

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

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. Скопируйте его в буфер обмена, чтобы использовать на следующем шаге.

Ваш сервис запущен и доступен для всех! Для получения дополнительной информации перейдите в консоль Cloud Run . fee46ea7c8483d56.png

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

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

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

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

kittenbot.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 на свой канал, введя "@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 предоставляет эту функциональность с помощью команд слэша , которые позволяют пользователям вызывать ваше приложение, вводя команду в поле сообщения.

Включить команды Slack с косой чертой

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

e34d393c14308f28.png

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

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

Обратите внимание, как обработчик для команд с косой чертой был добавлен внутрь функции 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
  });

  // ...

Попробуйте!

Введите /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

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

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