本教程演示了如何使用 Cloud Run functions 来实现搜索 Google Knowledge Graph API 的 Slack 斜杠命令。
直观呈现数据流
Slack Slash 命令教程应用中的数据流涉及以下几个步骤:
- 用户在 Slack 频道中执行
/kg <search_query>
Slash 命令。 - Slack 将命令载荷发送到 Cloud Functions 函数的触发器端点。
- Cloud Functions 函数将包含用户的搜索查询的请求发送给 Knowledge Graph API。
- Knowledge Graph API 返回所有匹配的结果作为响应。
- Cloud Functions 函数将响应的格式设置为 Slack 消息。
- Cloud Functions 函数将消息发送回 Slack。
- 用户在 Slack 频道中看到经过格式化的响应。
直观展示上述步骤可能有所帮助:
创建 Knowledge Graph API 密钥
在 Google Cloud 控制台“凭证”页面中,点击创建凭证按钮,然后选择 API 密钥。记住此密钥,因为您将在下一部分中使用该密钥访问 Knowledge Graph API。
准备函数
将示例应用代码库克隆到本地机器:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
Ruby
git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
切换到包含 Cloud Run functions 函数示例代码的目录:
Node.js
cd nodejs-docs-samples/functions/slack/
Python
cd python-docs-samples/functions/slack/
Go
cd golang-samples/functions/slack/
Java
cd java-docs-samples/functions/slack/
Ruby
cd ruby-docs-samples/functions/slack/
部署函数
如需部署在您(或 Slack)向函数的端点发出 HTTP POST 请求时执行的函数,请在包含示例代码(如果是 Java,则为 pom.xml
文件)的目录中运行以下命令:
将 YOUR_SLACK_SIGNING_SECRET
替换为应用配置的基本信息页面中由 Slack 提供的签名密钥,并将 YOUR_KG_API_KEY
替换为您刚刚创建的 Knowledge Graph API 密钥。
Node.js
gcloud functions deploy kgSearch \ --runtime nodejs22 \
--trigger-http \
--set-env-vars "SLACK_SECRET=YOUR_SLACK_SIGNING_SECRET
,KG_API_KEY=YOUR_KG_API_KEY
" \
--allow-unauthenticated
使用 --runtime
标志可以指定支持的 Node.js 版本的运行时 ID 来运行您的函数。
Python
gcloud functions deploy kg_search \ --runtime python312 \
--trigger-http \
--set-env-vars "SLACK_SECRET=YOUR_SLACK_SIGNING_SECRET
,KG_API_KEY=YOUR_KG_API_KEY
" \
--allow-unauthenticated
使用 --runtime
标志可以指定支持的 Python 版本的运行时 ID 来运行您的函数。
Go
gcloud functions deploy KGSearch \ --runtime go121 \
--trigger-http \
--set-env-vars "SLACK_SECRET=YOUR_SLACK_SIGNING_SECRET
,KG_API_KEY=YOUR_KG_API_KEY
" \
--allow-unauthenticated
Java
gcloud functions deploy java-slack-function \ --entry-point functions.SlackSlashCommand \ --runtime java17 \ --memory 512MB \
--trigger-http \
--set-env-vars "SLACK_SECRET=YOUR_SLACK_SIGNING_SECRET
,KG_API_KEY=YOUR_KG_API_KEY
" \
--allow-unauthenticated
使用 --runtime
标志可以指定支持的 Java 版本的运行时 ID 来运行您的函数。
Ruby
gcloud functions deploy kg_search --runtime ruby33 \
--trigger-http \
--set-env-vars "SLACK_SECRET=YOUR_SLACK_SIGNING_SECRET
,KG_API_KEY=YOUR_KG_API_KEY
" \
--allow-unauthenticated
使用 --runtime
标志可以指定支持的 Ruby 版本的运行时 ID 来运行您的函数。
配置应用
在部署函数后,您需要创建一个 Slack Slash 命令。每次该命令被触发时,都会将查询发送给您的 Cloud Functions 函数:
创建一个 Slack 应用来托管您的 Slack Slash 命令。将该应用关联至您有权安装集成的 Slack 团队。
转到 Slash commands 并点击 Create new command 按钮。
输入
/kg
作为该命令的名称。输入该命令的网址:
Node.js
https://YOUR_REGION-YOUR_PROJECT_ID.cloudfunctions.net/kgSearch
Python
https://YOUR_REGION-YOUR_PROJECT_ID.cloudfunctions.net/kg_search
Go
https://YOUR_REGION-YOUR_PROJECT_ID.cloudfunctions.net/KGSearch
Java
https://YOUR_REGION-YOUR_PROJECT_ID.cloudfunctions.net/java-slack-function
Ruby
https://YOUR_REGION-YOUR_PROJECT_ID.cloudfunctions.net/kg_search
其中,
YOUR_REGION
是部署 Cloud Functions 函数的区域,YOUR_PROJECT_ID
是您的 Cloud 项目 ID。当您的函数完成部署后,这两个值会显示在您的终端。
点击保存。
转到基本信息。
点击将应用安装到工作区 (Install your app to your workspace),然后按照屏幕上的说明为工作区启用应用。
您的 Slack Slash 命令应该很快就能使用。
了解代码
导入依赖项
应用必须导入多个依赖项才能与 Google Cloud Platform 服务进行通信:
Node.js
Python
Go
Java
Ruby
接收网络钩子
以下函数会在您(或 Slack)向其端点发出 HTTP POST 请求时执行:
Node.js
Python
Go
Java
Ruby
以下函数通过验证 Slack 提供的 X-Slack-Signature
标头对传入的请求进行身份验证:
Node.js
Python
Go
Java
Ruby
查询 Knowledge Graph API
以下函数会向 Knowledge Graph API 发送一个包含用户搜索查询的请求:
Node.js
Python
Go
Java
Ruby
设置 Slack 消息的格式
最后,以下函数会将来自 Knowledge Graph 的结果转换为将向用户显示的富格式 Slack 消息:
Node.js
Python
Go
Java
Ruby
Slack API 超时
Slack API 预期您的函数在收到 webhook 请求后的 3 秒内响应。
本教程中的命令通常不需要 3 秒便能响应。对于运行时间较长的命令,我们建议配置一个函数来推送请求(包括其 response_url
),以将其发布到充当任务队列的 Pub/Sub 主题。
然后,您可以再创建一个由 Pub/Sub 触发的函数来处理这些任务并将结果发送回 Slack 的 response_url
。
使用 Slash 命令
在 Slack 频道中输入命令:
/kg giraffe
查看日志以确保执行已完成:
gcloud functions logs read --limit 100