1. Tổng quan

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 đó trên Google Cloud. Bạn sẽ có thể tương tác với bot trong một kênh Slack đang hoạt động.
Kiến thức bạn sẽ học được
- Cách tạo chế độ tích hợp tuỳ chỉnh cho bot trong Slack
- Cách bảo mật bí mật của bạn trên Slack bằng Secret Manager
- Cách triển khai một bot Slack trên Cloud Run, một nền tảng điện toán được quản lý hoàn toàn, tự động mở rộng quy mô các vùng chứa không trạng thái của bạn
Bạn cần có
Bạn sẽ sử dụng hướng dẫn này như thế nào?
Bạn đánh giá thế nào về trải nghiệm của mình với Google Cloud?
2. Thiết lập và yêu cầu
Thiết lập môi trường theo tốc độ của riêng bạn
- Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một 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.



- 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ự mà các API của Google không sử dụng. Bạn luôn có thể cập nhật thông tin này.
- Mã dự án là giá trị duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là
PROJECT_ID). Nếu không thích mã nhận dạng được tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Hoặc bạn có thể thử tên người dùng của riêng mình để xem tên đó có được chấp nhận hay không. Bạn không thể thay đổi tên này sau bước này và tên này sẽ tồn tại trong suốt thời gian của dự án. - Để bạn nắm được thông tin, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
- Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên Cloud. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài phạm vi hướng dẫn này, bạn có thể xoá các tài nguyê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í trị giá 300 USD.
Khởi động Cloud Shell
Mặc dù có thể vận hành Google Cloud từ xa trên 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 trên Cloud.
Kích hoạt Cloud Shell
- Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell
.

Nếu đây là lần đầu tiên bạ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 thấy màn hình trung gian, hãy nhấp vào Tiếp tục.

Quá trình cung cấp và kết nối với Cloud Shell chỉ mất vài giây.

Máy ảo này được trang bị tất cả các công cụ phát triển cần thiết. Nền tảng này cung cấp một thư mục chính có dung lượng 5 GB và chạy trong Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện hầu hết, nếu không muốn nói là tất cả, công việc của mình trong lớp học lập trình này bằng trình duyệt.
Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án được đặt thành mã dự án của bạn.
- Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list
Đầu ra của lệnh
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- 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
Đầu ra của lệnh
[core] project = <PROJECT_ID>
Nếu không, bạn có thể đặt nó bằng lệnh sau:
gcloud config set project <PROJECT_ID>
Đầu ra của lệnh
Updated property [core/project].
3. Bật các API
Trong 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ẽ xuất 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 của mình...
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 trên Slack mà bạn được phép tạo các chế độ tích hợp tuỳ chỉnh. Bạn có thể tạo một không gian làm việc miễn phí nếu chưa có không gian làm việc nào mà bạn muốn dùng cho hướng dẫn này.

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 thông điệp chào đơn giản.
Tạo một ứng dụng Slack mới
- Chuyển đến 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 cùng bên phải.
- Đặt tên cho ứng dụng, chẳng hạn như "Kittenbot".
- Chọn nhóm Slack mà bạn muốn cài đặt.
Tạo người dùng bot
- Chuyển đến Trang chủ của ứng dụng trên bảng điều khiển bên trái trong mục Tính năng

- Chỉ định một phạm vi cho mã thông báo bot bằng cách nhấp vào Xem xét các 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 của 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"

- Di chuyển lên trên rồi nhấp vào nút Cài đặt ứng dụng vào không gian làm việc của bạn.
- Thao tác này sẽ cài đặt ứng dụng cho 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" để uỷ quyền cho 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 phần Hiện thẻ và đảm bảo cả hai lựa chọn đều được bật:

Lấy khoá bí mật để ký ứng dụng
- Chuyển đến phần Thông tin cơ bản trong phần Cài đặt.
- Di chuyển xuống phần Signing Secret (Khoá bí mật để ký), nhấp vào Show (Hiện), rồi sao chép khoá bí mật vào bảng nhớ tạm:

- Lưu khoá bí mật trong một biến môi trường:
CLIENT_SIGNING_SECRET=PASTE_THE_SIGNING_SECRET
Lấy mã thông báo của bot
- Chuyển đến mục OAuth và quyền trong phần Tính năng.
- Nhấp vào nút Sao chép để sao chép văn bản Bot User OAuth Access Token (Mã truy cập OAuth của người dùng bot) vào bảng nhớ tạm.

- Lưu mã thông báo của bot trong một biến môi trường:
BOT_TOKEN=PASTE_THE_BOT_TOKEN
Đừng lo lắng. Bạn có thể quay lại trang cấu hình này từ 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à khoá bí mật 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 khoá này trong mã nguồn có thể vô tình làm lộ các khoá này bằng cách xuất bản chúng vào hệ thống quản lý phiên bản hoặc nhúng chúng vào một hình ảnh docker.
Secret Manager cung cấp một phương thức an toàn và tiện lợi để lưu trữ khoá API, mật khẩu, chứng chỉ và các 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 bí mật của bạn
Lưu khoá bí mật ký ứng dụng khách và mã thông báo bot bằng các lệnh sau:
- Khoá bí mật để ký của ứng dụng khách
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 các giá trị bí mật của bạn
Hãy xác nhận rằng bạn đã tạo bí mật đúng cách và các quyền của bạn đang hoạt động. Truy cập vào các khoá bí mật 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 bí mật của mình 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 muố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ã kittenbot có 2 chức năng chính. Một là để truy xuất các khoá bí mật và khoá còn lại là để chạy bot.
Trước tiên, chúng ta sẽ 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à những gói mở rộng Botkit và cho phép bot dễ dàng dịch tin nhắn đến và đi từ Slack API. Ứng dụng Secret Manager 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 là hàm để truy xuất các khoá 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 khoá 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 sẽ định cấu hình SlackAdapter bằng các khoá bí mật, sau đó chỉ định một điểm cuối để nhận tin nhắn. Sau đó, khi bộ điều khiển bật, bot sẽ trả lời mọi tin nhắn có chứa "hello", "hi" hoặc "hey" bằng "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 là những gì sẽ xảy ra:
- Cloud Run gọi Cloud Build để tạo một hình ảnh vùng chứa (xem phần Triển khai từ mã nguồn).
- Nếu có
Dockerfiletrong thư mục mã nguồn, Cloud Build sẽ dùng tệp này để tạo một hình ảnh vùng chứa. - Vì không có, 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.
- Buildpack phát hiện tệp kê khai
package.jsonvà tạo một hình ảnh Node.js. - Trường
scripts.startxác định cách khởi động ứng dụng. - Trường
engines.nodexác định phiên bản Node.js của hình ảnh cơ sở vùng chứa. - Vào 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
Slack Events API 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 sẽ phải cung cấp một URL có thể truy cập công khai để API Slack ping.
Cloud Run là một giải pháp phù hợp để lưu trữ các mục tiêu webhook. Nền tảng 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 muốn và cung cấp khả năng xử lý đồng thời, nghĩa là ứng dụng của bạn sẽ có thể xử lý khối lượng dữ liệu 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 Cloud Run
Cloud Run là dịch vụ theo khu vực, tức là cơ sở hạ tầng chạy dịch vụ Cloud Run của bạn nằm ở một khu vực cụ thể và do Google quản lý để có thể hoạt động dự phòng trên tất cả các vùng trong khu vực đó. Xác định khu vực mà bạn sẽ sử dụng để triển khai, ví dụ:
REGION="us-central1"
Cập nhật quyền
Để có thể truy cập vào các bí mật trong Secret Manager, bạn cần cấp cho tài khoản dịch vụ Cloud Run 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 rằng 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 có địa chỉ email, hãy bật vai trò 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 quy mô cơ sở hạ tầng cơ bản để xử lý các yêu cầu đế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
--sourcesử dụng thư mục hiện tại để tạo ứng dụng bằng Cloud Build. Cloud Build tự động phát hiện sự hiện diện của tệppackage.json. - Ngoài ra, bạn có thể xác định một khu vực mặc định bằng lệnh này:
gcloud config set run/region $REGION - Bạn cũng có thể đặt Cloud Run làm dịch vụ được quản lý theo mặc định bằng lệnh sau:
gcloud config set run/platform managed - Lựa chọn
--set-env-varssẽ đặt các biến môi trường dịch vụ. - Lựa chọn
--allow-unauthenticatedgiúp 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 lên kho lưu trữ Artifact Registry và tạo bản dựng cho 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 một 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 của 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 của 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 Slack Events API. Sao chép mã này vào bảng nhớ tạm để dùng trong bước tiếp theo.
Dịch vụ của bạn hiện đã hoạt động và được cung cấp công khai! Truy cập vào bảng điều khiển Cloud Run để biết thêm thông tin. 
Bạn có thể xem thời điểm bản sửa đổi gần đây nhất được tạo, lưu lượng truy cập mà bản sửa đổi đó đang nhận được và xem nhật ký. Nếu nhấp vào nhật ký, chúng ta có thể thấy rằng bộ điều khiển Botkit đang bật và sẵn sàng nhận tin nhắn.
Bây giờ, hãy bắt đầu gửi tin nhắn từ kênh Slack của chúng ta!
9. Bật sự kiện Slack
Như chúng ta đã thấy, mã kittenbot của chúng ta chỉ định một điểm cuối tương đối cho mục tiêu webhook.
kittenbot.js
const controller = new Botkit({
webhook_uri: '/api/messages',
adapter: adapter,
});
Điều này có nghĩa là URL đầy đủ của chúng ta sẽ là phần cơ sở của dịch vụ Cloud Run, cộng với /api/messages.
Bật Sự kiện
Trong trang quản lý ứng dụng, hãy chuyển đến mục Đăng ký sự kiện trên thanh bên rồi bật Bật sự kiện. Nhập URL dịch vụ của bạn:
PASTE_THE_SERVICE_URL/api/messages

Tuỳ thuộc vào tốc độ nhập URL, có thể Google sẽ cố gắng xác minh trước khi bạn nhập xong. 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 của bot nhắn tin.

Nhấp vào Lưu thay đổi ở cuối trang. Bạn sẽ thấy lời nhắc Cài đặt lại ứng dụng. Hãy làm theo lời nhắc rồi nhấp vào Cho phép.
Đến đây là bạn đã tích hợp xong bot! Các 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 cho Kittenbot:

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

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

Mỗi tin nhắn trong Slack sẽ kích hoạt một sự kiện và gửi một thông báo HTTP POST đế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 rằng mỗi thông báo tương ứng với một mục nhập POST trong nhật ký.

Kittenbot sẽ trả lời mỗi tin nhắn bằng "Meow. 😺".
11. Phần thưởng – Cập nhật bot
Phần không bắt buộc này sẽ mất vài phút. Bạn có thể chuyển thẳng đến phần Dọn dẹp.
Chuỗi trò chuyện
Chúng ta muốn bot làm được nhiều việc hơn là chỉ nói "meo meo". Nhưng làm cách nào để triển khai một phiên bản mới của nội dung đang 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 Trình chỉnh sửa Cloud Shell:
cloudshell workspace .
Botkit có khả năng xử lý các cuộc trò chuyện. Với những thông tin này, bot có thể yêu cầu thêm thông tin và phản hồi tin nhắn ngoài một câu trả lời bằng một từ.
Xác định hộp thoại
Trước tiên, hãy xem cách các hàm đàm thoại được xác định ở 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ẽ điều hướng chuỗi dựa trên các câu trả lời. Ví dụ: nếu người dùng trả lời "không" cho câu hỏi về mèo con, thì hệ thống sẽ chuyển đến thông báo có nhãn "no_kittens", tức là cuối chuỗi hội thoại đó.
Thêm hộp thoại vào bộ điều khiển
Giờ đây, khi 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
Giờ đây, bộ điều khiển có thể sử dụng hộp thoại đó. Hãy xem cách cuộc trò chuyện bắt đầu khi chatbot nghe thấy "kitten" (mèo con), "kittens" (mèo con), "cat" (mèo) hoặc "cats" (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ử

Xin chúc mừng! Bạn vừa cập nhật một bot Slack đang chạy trên Cloud Run lên phiên bản mới.
Lệnh dấu gạch chéo
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 gạch chéo, 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 lệnh dấu gạch chéo của Slack
- Chuyển đến phần Lệnh gạch chéo trong mục Tính năng trên Trang quản lý ứng dụng.
- Nhấp vào Tạo lệnh mới.
- Định cấu hình lệnh
/catsbằng URL dịch vụ kittenbot của bạn. Hãy nhớ dùng cùng một điểm cuối mà bạn đã dùng để bật Events API! Đây là URL của bạn, cộng thêm'/api/messages'.

- Làm theo lời nhắc để cập nhật ứng dụng và quyền của bạn.
Thêm Lệnh gạch chéo vào Bộ điều khiển
Xem cách trình xử lý cho lệnh dấu gạch chéo được thêm vào bên trong hàm 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
});
// ...
Dùng thử
Nhập /cats kèm theo một số để gửi lệnh dấu gạch chéo. Ví dụ: /cats 8

Bot sẽ phản hồi bằng 8 bức ảnh mèo mà chỉ bạn mới thấy:

12. Dọn dẹp
Xin chúc mừng! Bạn hiện đã có một bot Slack chạy trên Cloud Run. Đã đến lúc dọn dẹp một số tài nguyên đã dùng (để tiết kiệm chi phí và trở thành một công dân đám mây gương mẫu).
Xoá dự án
Bạn có thể xoá toàn bộ dự án ngay trong Cloud Shell:
gcloud projects delete $PROJECT_ID
Hoặc nếu bạn muốn xoá từng tài nguyên, hãy chuyển sang phần tiếp theo.
Xoá hoạt động triển khai
gcloud run services delete kittenbot --region $REGION
Đầu ra 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 khách
gcloud secrets delete client-signing-secret
Đầu ra 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á giá trị bí mật của mã thông báo bot
gcloud secrets delete bot-token
Đầu ra 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á các 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
Đầu ra 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/
Đầu ra 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/
Đầu ra của lệnh
Removing gs://<PROJECT_ID>_cloudbuild/...
13. Xin chúc mừng!

Giờ đây, bạn đã biết cách chạy một bot Slack trên Cloud Run!
Chúng tôi mới chỉ khai thác một phần nhỏ của công nghệ này và bạn nên khám phá thêm bằng các hoạt động triển khai Cloud Run của riêng mình.
Nội dung đã đề cập
- Tạo chế độ tích hợp tuỳ chỉnh cho bot trong Slack
- Bảo mật các bí mật của bạn trên Slack bằng Secret Manager
- Triển khai bot Slack trên Cloud Run
Các bước tiếp theo
- Hoàn thành thêm các hướng dẫn về Cloud Run
Tìm hiểu thêm
- Hãy xem các ví dụ khác về việc tích hợp Google Cloud với Slack trên GitHub.
- Hãy tự mình dùng thử các tính năng khác của Google Cloud. Hãy xem các hướng dẫn của chúng tôi.