Tạo bot Slack bằng Node.js trên Cloud Run

1. Tổng quan

5f529fb87abc11c9.pngS

Trong lớp học lập trình này, bạn sẽ tìm hiểu cách tạo bot Slack bằng bộ công cụ Botkit và chạy bot này trên Google Cloud. Bạn sẽ có thể tương tác với bot này trên một kênh phát trực tiếp của Slack.

Kiến thức bạn sẽ học được

  • Cách tạo công cụ tích hợp tuỳ chỉnh cho bot trong Slack
  • Cách bảo vệ các bí mật của Slack bằng Người quản lý bí mật
  • Cách triển khai bot Slack trên Cloud Run, một nền tảng điện toán được quản lý toàn diện, có thể tự động mở rộng quy mô các vùng chứa không có trạng thái

Bạn cần có

  • Một dự án trên Google Cloud
  • Một trình duyệt như Chrome hoặc Firefox

Bạn sẽ sử dụng hướng dẫn này như thế nào?

Chỉ có thể đọc Đọc và hoàn thành bài tập

Bạn đánh giá thế nào về trải nghiệm khi sử dụng Google Cloud?

Người mới tập Trung cấp Thành thạo

2. Thiết lập và yêu cầu

Thiết lập môi trường theo tiến độ riêng

  1. Đăng nhập vào Google Cloud Console rồi tạo dự án mới hoặc sử dụng lại dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

98e4187c97cf2e0e.png.

37d264871000675d.png.

c20a9642aaa18d11.png

  • Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng. Bạn luôn có thể cập nhật ứng dụng.
  • Mã dự án là duy nhất trong tất cả các dự án Google Cloud và không thể thay đổi (không thể thay đổi sau khi đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường bạn không quan tâm đến sản phẩm đó là gì. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham khảo Mã dự án của mình (thường được xác định là PROJECT_ID). Nếu không thích mã đã tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Ngoài ra, bạn có thể thử cách riêng của mình để xem có thể sử dụng hay không. Bạn không thể thay đổi mã này sau bước này và mã vẫn giữ nguyên trong thời gian dự án.
  • Đối với thông tin của bạn, có giá trị thứ ba, Project Number (Số dự án), mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu này.
  1. Tiếp theo, bạn sẽ phải bật tính năng thanh toán trong Cloud Console để sử dụng API/tài nguyên trên đám mây. Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Để tắt các tài nguyên nhằm tránh phát sinh việc thanh toán ngoài hướng dẫn này, bạn có thể xoá các tài nguyên bạn đã tạo hoặc xoá dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.

Khởi động Cloud Shell

Mặc dù bạn có thể vận hành Google Cloud từ xa bằng máy tính xách tay, nhưng trong hướng dẫn này, bạn sẽ sử dụng Cloud Shell, một môi trường dòng lệnh chạy trong Đám mây.

Kích hoạt Cloud Shell

  1. Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell d1264ca30785e435.png.

84688aa223b1c3a2.pngS

Nếu đây là lần đầu tiên khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian mô tả về Cloud Shell. Nếu bạn nhìn thấy màn hình trung gian, hãy nhấp vào Tiếp tục.

d95252b003979716.png

Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.

7833d5e1c5d18f54.pngS

Máy ảo này được tải tất cả các công cụ phát triển cần thiết. Dịch vụ này cung cấp thư mục gốc có dung lượng ổn định 5 GB và chạy trên Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Nhiều (nếu không nói là) tất cả công việc của bạn trong lớp học lập trình này đều có thể thực hiện bằng trình duyệt.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy mình đã được xác thực và dự án được đặt thành mã dự án.

  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list

Kết quả lệnh

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn:
gcloud config list project

Kết quả lệnh

[core]
project = <PROJECT_ID>

Nếu chưa, bạn có thể đặt chế độ này bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Kết quả lệnh

Updated property [core/project].

3. Bật các API

Trên Cloud Shell, hãy bật các API Artifact Registry, Cloud Build, Cloud Run và Secret Manager:

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

Thao tác này sẽ tạo ra một thông báo thành công tương tự như thông báo sau:

Operation "operations/..." finished successfully.

Giờ đây, bạn đã sẵn sàng chuẩn bị và triển khai ứng dụng...

4. Tạo không gian làm việc trên Slack

Bạn cần có một không gian làm việc của Slack để tạo các công cụ tích hợp tuỳ chỉnh. Bạn có thể tạo không gian làm việc miễn phí nếu chưa có không gian làm việc mà bạn muốn sử dụng cho hướng dẫn này.

aa1f0fda82263bf8.png

5. Tạo người dùng bot Slack

Người dùng bot có thể nghe tin nhắn trên Slack, đăng tin nhắn và tải tệp lên. Trong lớp học lập trình này, bạn sẽ tạo một bot để đăng một tin nhắn chào mừng đơn giản.

Tạo ứng dụng Slack mới

  • Truy cập trang quản lý ứng dụng Slack.
  • Nhấp vào nút Tạo ứng dụng mới ở góc trên bên phải.
  • Đặt tên cho ứng dụng, chẳng hạn như "Kittenbot".
  • Chọn nhóm Slack nơi bạn muốn cài đặt công cụ này.

Tạo người dùng bot

  • Chuyển đến Trang chủ ứng dụng trên bảng điều khiển bên trái trong phần Tính năng

414213b184fcc992.pngS

  • Chỉ định phạm vi cho mã thông báo bot của bạn bằng cách nhấp vào Review Scopes to Add (Xem xét phạm vi cần thêm)
  • Di chuyển xuống phần Bot Token Scopes (Phạm vi mã thông báo bot) rồi nhấp vào Add an OAuth Scope (Thêm phạm vi OAuth). Chọn chat:write để "Gửi tin nhắn dưới tên Kittenbot"

74a6fa87c64c2b23.pngS

  • Di chuyển lên rồi nhấp vào nút Cài đặt ứng dụng vào Workspace.
  • Thao tác này sẽ cài đặt ứng dụng vào nhóm của bạn, thêm người dùng bot mà bạn vừa tạo và tạo mã thông báo bot.
  • Khi được nhắc, hãy nhấp vào "Cho phép" để cho phép bot trò chuyện trong không gian làm việc của bạn.

Bật tin nhắn và lệnh

  • Di chuyển xuống mục Show tab (Hiện thẻ) và đảm bảo bật cả hai tuỳ chọn:

5ca52f7abbdc15c.png.

Lấy khoá bí mật ký ứng dụng

  • Chuyển tới Basic Information (Thông tin cơ bản) trong phần Settings (Cài đặt).
  • Di chuyển xuống phần Ký khoá bí mật, nhấp vào Hiển thị,sau đó sao chép mã bí mật vào bảng nhớ tạm:

74cfd6616fa71dc4.png.

  • Lưu giá trị bí mật trong một biến môi trường:
CLIENT_SIGNING_SECRET=PASTE_THE_SIGNING_SECRET

Nhận mã thông báo bot

  • Chuyển đến OAuth và Quyền trong phần Tính năng.
  • Nhấp vào nút Sao chép để sao chép Mã truy cập OAuth cho người dùng bot vào bảng nhớ tạm.

6f5a18069471101.pngS

  • Lưu mã thông báo bot trong một biến môi trường:
BOT_TOKEN=PASTE_THE_BOT_TOKEN

Đừng lo. Bạn có thể quay lại trang cấu hình này qua trang quản lý ứng dụng nếu cần lấy lại các mã thông báo này.

6. Bảo vệ bí mật của bạn

Chúng tôi muốn đảm bảo rằng mã thông báo bot và mật khẩu ký ứng dụng khách của bạn được lưu trữ an toàn. Việc mã hoá cứng các bí mật trong mã nguồn khiến mã nguồn có thể vô tình làm lộ các bí mật này bằng cách xuất bản chúng để quản lý phiên bản hoặc nhúng chúng vào một hình ảnh Docker.

Secret Manager (Trình quản lý bí mật) cung cấp một phương thức an toàn và thuận tiện để lưu trữ các khoá API, mật khẩu, chứng chỉ và những dữ liệu nhạy cảm khác. Secret Manager là nguồn thông tin chính xác duy nhất để quản lý, truy cập và kiểm tra các dữ liệu bí mật trên Google Cloud.

Tạo ra bí mật của bạn

Lưu khoá bí mật ký ứng dụng khách và mã bot bằng các lệnh sau:

  • Mật khẩu ký ứng dụng
echo -n $CLIENT_SIGNING_SECRET | gcloud secrets create client-signing-secret \
  --replication-policy automatic \
  --data-file -
  • Mã thông báo bot
echo -n $BOT_TOKEN | gcloud secrets create bot-token \
  --replication-policy automatic \
  --data-file -

Truy cập vào Khoá bí mật của bạn

Hãy xác nhận rằng bạn đã tạo các khoá bí mật đúng cách và các quyền của bạn đang hoạt động. Truy cập vào giá trị bí mật của bạn bằng các lệnh sau:

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

Bạn cũng có thể xem và quản lý các giá trị bí mật trong bảng điều khiển Google Cloud.

7. Nhận mã mẫu

Trong Cloud Shell trên dòng lệnh, hãy chạy lệnh sau để sao chép kho lưu trữ GitHub:

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

Thay đổi thư mục thành cloud-slack-bot/start.

cd cloud-slack-bot/start

Tìm hiểu mã

Mở tệp kittenbot.js bằng trình chỉnh sửa dòng lệnh mà bạn ưu tiên (nano, vim, emacs...) hoặc bằng lệnh sau để mở trực tiếp thư mục hiện tại trong Cloud Shell Editor:

cloudshell workspace .

Mã mèo con có hai chức năng chính. Một phương thức để truy xuất khoá bí mật và phương pháp còn lại là chạy bot.

Trước tiên, chúng ta nhập các phần phụ thuộc:

kittenbot.js

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

SlackAdapter và SlackEventMiddleware là các gói mở rộng Botkit và cho phép bot dễ dàng dịch tin nhắn đến và từ API Slack. Ứng dụng Người quản lý bí mật sẽ cho phép bạn truy cập vào các khoá bí mật mà bạn đã lưu ở bước trước.

Tiếp theo, chúng ta có hàm để truy xuất các giá trị bí mật:

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

Hàm này trả về các giá trị chuỗi của những mã bí mật cần thiết để xác thực bot.

Hàm tiếp theo sẽ khởi chạy bot:

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

Phần đầu tiên của hàm này định cấu hình SlackAdapter với các mã thông báo bí mật, sau đó chỉ định một điểm cuối để nhận thông báo. Sau đó, khi bộ điều khiển được bật, bot sẽ trả lời bất kỳ tin nhắn nào có chứa lời "xin chào", "Xin chào" hoặc "Xin chào" bằng chú thích "Meow. 😺".

Hãy xem những phần cụ thể sau đây trong tệp kê khai ứng dụng:

package.json

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

Bạn có thể triển khai ứng dụng Node.js trực tiếp từ nguồn bằng Cloud Run. Sau đây sẽ là những tính năng nâng cao:

  • Cloud Run gọi Cloud Build để tạo hình ảnh vùng chứa (xem phần Triển khai từ mã nguồn).
  • Nếu Dockerfile có trong thư mục mã nguồn, thì Cloud Build sẽ sử dụng mã này để tạo hình ảnh vùng chứa.
  • Vì không phải như vậy nên Cloud Build sẽ gọi Buildpacks để phân tích nguồn và tự động tạo một hình ảnh sẵn sàng cho việc phát hành công khai.
  • Buildpacks phát hiện tệp kê khai package.json và tạo hình ảnh Node.js.
  • Trường scripts.start xác định cách khởi động ứng dụng.
  • Trường engines.node xác định phiên bản Node.js của hình ảnh cơ sở vùng chứa.
  • Tại thời điểm triển khai, các bản sửa lỗi bảo mật đã biết sẽ tự động được áp dụng.

Bạn đã sẵn sàng triển khai ứng dụng!

8. Triển khai ứng dụng

API Sự kiện của Slack sử dụng webhook để gửi tin nhắn đi về các sự kiện. Khi định cấu hình ứng dụng Slack, bạn phải cung cấp một URL truy cập công khai để API Slack gửi ping.

Cloud Run là một giải pháp hiệu quả để lưu trữ các mục tiêu webhook. Công cụ này cho phép bạn sử dụng bất kỳ ngôn ngữ hoặc thời gian chạy nào mà bạn thích và cung cấp tính năng đồng thời, có nghĩa là ứng dụng của bạn sẽ có thể xử lý lưu lượng lớn hơn nhiều.

Truy xuất mã dự án

Xác định biến môi trường PROJECT_ID:

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

Xác định khu vực của bạn trong Cloud Run

Cloud Run mang tính khu vực, nghĩa là cơ sở hạ tầng chạy dịch vụ Cloud Run nằm ở một khu vực cụ thể và do Google quản lý để có thể sử dụng dự phòng trên tất cả các vùng trong khu vực đó. Xác định khu vực bạn sẽ dùng để triển khai, ví dụ:

REGION="us-central1"

Cập nhật quyền

Để có thể truy cập vào giá trị bí mật trên Secret Manager, tài khoản dịch vụ Cloud Run cần được cấp vai trò roles/secretmanager.secretAccessor.

Trước tiên, hãy lưu tài khoản dịch vụ mặc định vào một biến môi trường:

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

Xác nhận bạn đã lưu địa chỉ email:

echo $SERVICE_ACCOUNT

Tài khoản dịch vụ có định dạng sau: PROJECT_NUMBER-compute@developer.gserviceaccount.com.

Sau khi bạn có địa chỉ email, hãy bật vai trò này cho tài khoản dịch vụ:

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

Triển khai ứng dụng

Dịch vụ Cloud Run hiển thị một điểm cuối duy nhất và tự động mở rộng cơ sở hạ tầng cơ bản để xử lý các yêu cầu gửi đến.

Triển khai ứng dụng lên Cloud Run:

gcloud run deploy kittenbot \
  --source . \
  --platform managed \
  --region $REGION \
  --set-env-vars PROJECT_ID=$PROJECT_ID \
  --allow-unauthenticated
  • Thao tác này sẽ tạo một dịch vụ có tên là kittenbot.
  • Tuỳ chọn --source dùng thư mục hiện tại để xây dựng ứng dụng bằng Cloud Build. Cloud Build sẽ tự động phát hiện sự có mặt của tệp package.json.
  • Bạn có thể xác định một khu vực mặc định khác bằng lệnh sau: gcloud config set run/region $REGION
  • Bạn cũng có thể dùng lệnh sau để quản lý Cloud Run theo mặc định: gcloud config set run/platform managed
  • Tuỳ chọn --set-env-vars đặt các biến môi trường dịch vụ.
  • Tuỳ chọn --allow-unauthenticated sẽ cung cấp dịch vụ công khai.

Lần đầu tiên, bạn sẽ nhận được lời nhắc tạo một kho lưu trữ Artifact Registry. Nhấn Enter để xác thực:

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)?

Thao tác này sẽ khởi chạy quá trình tải mã nguồn của bạn lên kho lưu trữ Artifact Registry và bản dựng của hình ảnh vùng chứa:

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

Sau đó, hãy đợi trong giây lát cho đến khi quá trình tạo và triển khai hoàn tất. Khi thành công, dòng lệnh sẽ hiển thị URL dịch vụ:

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

Bạn có thể lấy URL dịch vụ bằng lệnh sau:

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

URL có định dạng như sau:

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

URL này sẽ là cơ sở dùng để bật API sự kiện Slack. Hãy sao chép tệp này vào bảng nhớ tạm để sử dụng trong bước tiếp theo.

Dịch vụ của bạn hiện đã hoạt động và công khai! Truy cập vào bảng điều khiển Cloud Run để biết thêm thông tin. fee46ea7c8483d56.png

Bạn có thể xem thời điểm tạo bản sửa đổi gần đây nhất, lưu lượng truy cập nhận được và xem nhật ký. Khi nhấp vào nhật ký, chúng ta có thể thấy rằng trình điều khiển Botkit đang bật và sẵn sàng nhận thông báo.

Bây giờ, hãy bắt đầu gửi thông báo từ kênh Slack của chúng tôi!

9. Bật sự kiện Slack

Như chúng ta đã thấy trước đó, mã mèo con của chúng ta chỉ định một điểm cuối tương đối cho mục tiêu webhook của chúng ta.

kittenbot.js

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

Tức là URL đầy đủ của chúng tôi sẽ là phần cơ sở của dịch vụ Cloud Run, cùng với /api/messages.

Bật sự kiện

Trên trang quản lý ứng dụng, hãy chuyển đến phần Gói thuê bao sự kiện trên thanh bên, rồi bật tuỳ chọn Bật sự kiện. Nhập URL dịch vụ của bạn:

PASTE_THE_SERVICE_URL/api/messages

5179a99339839999.pngS

Tuỳ thuộc vào tốc độ bạn nhập URL, URL có thể cố gắng xác minh trước khi bạn hoàn tất. Nếu không thành công, hãy nhấp vào "Thử lại".

Đăng ký

Đăng ký tất cả các sự kiện bot tin nhắn.

1e8f200390908a9b.png.

Nhấp vào Lưu thay đổi ở cuối trang. Bạn sẽ được nhắc Cài đặt lại ứng dụng. Làm theo lời nhắc rồi nhấp vào Cho phép.

Đến thời điểm này, bot của bạn đã hoàn toàn tích hợp! Tin nhắn trong không gian làm việc sẽ kích hoạt Slack gửi tin nhắn đến dịch vụ Cloud Run của bạn. Sau đó, dịch vụ này sẽ phản hồi bằng một lời chào đơn giản.

10. Thử nghiệm bot của bạn

Gửi tin nhắn trực tiếp tới Kittenbot:

1f442dd7fd7b5773.pngS

Thêm mèo con vào kênh của bạn bằng cách nhập "@myactivitybot" rồi nhấp vào "Mời Họ":

9788d2167ce47167.pngS

Giờ đây, mọi người trên kênh của bạn đều có thể tương tác với Kittenbot!

9c0d1d7907a51767.pngS

Mỗi thông báo trong Slack kích hoạt một sự kiện và gửi thông báo POST qua HTTP đến dịch vụ Cloud Run của chúng tôi. Nếu xem nhật ký dịch vụ Cloud Run, bạn sẽ thấy mỗi thông báo tương ứng với một mục nhập POST trong nhật ký.

1ff0c2347bf464e8.png.

Mèo con trả lời từng tin nhắn với nội dung "Meow. 😺".

11. Phần thưởng - Cập nhật bot của bạn

Phần không bắt buộc này thường mất vài phút. Bạn có thể chuyển thẳng đến phần Làm sạch.

Chuỗi trò chuyện

Chúng tôi muốn bot này làm được nhiều việc hơn ngoài việc chỉ nói "meow". Nhưng làm cách nào để triển khai phiên bản mới của một tính năng chạy trên Cloud Run?

Thay đổi thư mục thành cloud-slack-bot/extra-credit:

cd ../extra-credit/

Mở thư mục hiện tại trong Cloud Shell Editor:

cloudshell workspace .

Botkit có thể xử lý các cuộc trò chuyện. Với những tính năng này, bot có thể yêu cầu thêm thông tin và phản ứng với các tin nhắn ngoài việc trả lời một từ.

Xác định hộp thoại

Trước tiên, hãy xem cách định nghĩa các hàm đàm thoại ở cuối tệp:

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

Cuộc trò chuyện mới này sẽ chuyển hướng chuỗi cuộc trò chuyện dựa trên câu trả lời. Ví dụ: nếu người dùng trả lời "không" sang câu hỏi về mèo con, câu hỏi này sẽ chuyển thẳng đến tin nhắn có nhãn "no_METRICs", tức là phần kết thúc của chuỗi trò chuyện.

Thêm hộp thoại vào bộ điều khiển

Bây giờ, cuộc trò chuyện đã được xác định, hãy xem cách thêm cuộc trò chuyện vào bộ điều khiển:

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

Kích hoạt hộp thoại

Bộ điều khiển đã có thể sử dụng hộp thoại đó, hãy xem cách bắt đầu cuộc trò chuyện khi bot trò chuyện nghe thấy "mèo con", "mèo con", "mèo" hoặc "mèo":

  // ...

  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

    // ...
  });

  // ...

Cập nhật ứng dụng

Triển khai lại ứng dụng lên Cloud Run:

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

Dùng thử

eca12b3463850d52.png

Xin chúc mừng! Bạn vừa cập nhật một bot Slack chạy trên Cloud Run lên một phiên bản mới.

Lệnh trượt tuyết

Nếu bạn không muốn trò chuyện với người dùng đó thì sao? Nếu bạn chỉ muốn kích hoạt một hành động bằng một lệnh đơn giản thì sao?

Slack cung cấp chức năng này thông qua Lệnh Sllash, cho phép người dùng gọi ứng dụng của bạn bằng cách nhập lệnh vào hộp tin nhắn.

Bật các lệnh Dấu gạch chéo của Slack

  • Chuyển đến phần Lệnh chéo trong phần Tính năng trên trang Quản lý ứng dụng của bạn.
  • Nhấp vào Create New Command (Tạo lệnh mới).
  • Định cấu hình lệnh /cats bằng URL dịch vụ transactionbot. Hãy nhớ sử dụng chính điểm cuối mà bạn đã dùng để bật API Sự kiện! Đây là URL của bạn và '/api/messages'.

e34d393c14308f28.png

  • Làm theo lời nhắc để cập nhật ứng dụng và các quyền.

Thêm lệnh Dấu gạch chéo vào Bộ điều khiển

Hãy xem cách thêm trình xử lý cho lệnh dấu gạch chéo vào bên trong hàm console.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
  });

  // ...

Dùng thử

Nhập /cats cùng với một số để gửi lệnh dấu gạch chéo. Ví dụ: /cats 8

c67f6fe1ffcafec8.png

Bot sẽ trả lời bằng 8 chú mèo, chỉ bạn mới nhìn thấy:

9c1b256987fd379a.pngS

12. Dọn dẹp

Xin chúc mừng! Bạn hiện đã có một bot Slack đang chạy trên Cloud Run. Thời gian để dọn dẹp các tài nguyên được sử dụng (để tiết kiệm chi phí và trở thành một công dân tốt của công nghệ đám mây).

Xoá dự án

Bạn có thể xoá toàn bộ dự án trực tiếp từ Cloud Shell:

gcloud projects delete $PROJECT_ID

Hoặc nếu bạn muốn xoá từng tài nguyên khác nhau, hãy chuyển sang phần tiếp theo.

Xoá hoạt động triển khai

gcloud run services delete kittenbot --region $REGION

Kết quả của lệnh

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

Xoá khoá bí mật ký ứng dụng

gcloud secrets delete client-signing-secret

Kết quả của lệnh

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

Xoá mã bí mật của mã bot

gcloud secrets delete bot-token

Kết quả của lệnh

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

Xoá bộ chứa lưu trữ

Trước tiên, hãy liệt kê các bộ chứa Google Cloud Storage để lấy đường dẫn bộ chứa:

gsutil ls

Kết quả của lệnh

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

Bây giờ, hãy xoá bộ chứa cấu phần phần mềm:

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

Kết quả của lệnh

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

Cuối cùng, hãy xoá bộ chứa Cloudbuild:

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

Kết quả của lệnh

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

13. Xin chúc mừng!

528302981979de90.pngS

Giờ đây, bạn đã biết cách chạy bot Slack trên Cloud Run!

Chúng tôi mới chỉ mới tìm hiểu sơ qua về công nghệ này và chúng tôi khuyến khích bạn khám phá thêm thông qua hoạt động triển khai Cloud Run của riêng bạn.

Nội dung đã đề cập

  • Tạo công cụ tích hợp tuỳ chỉnh bot trong Slack
  • Bảo vệ các bí mật về Slack bằng Người quản lý bí mật
  • Triển khai bot Slack trên Cloud Run

Các bước tiếp theo

Tìm hiểu thêm