如何制作 Slack 机器人 Mendix
大家好,欢迎光临。作为开发者布道者,我为 Mendix,我在这里的职责很大一部分是花大量时间监控 Mendix 社区 Slack 频道 (点击这里!).
当然,我们在工作区安装了一些很棒的工具,这让我开始思考——制作一个 Slack 机器人到底需要什么,以及可以使用什么来完成 Mendix 独自的?
在网上搜索后,我发现每个例子都极其复杂,需要 Java、Python 或 Javascript 的大量编码技能。虽然我也可以沿着这条路走下去,但我决心以低代码的方式做到这一点。不过我很高兴我坚持了下来,因为我现在可以告诉你们这实际上有多么简单,你们所有人也可以使用 Mendix 没别的!
今天我们做什么?
在本教程中,我们将制作一个可以使用 RESTful API 发送消息的 Slack 机器人。它还将订阅频道内的事件,因此该机器人将能够回复频道中发送的提及或某些关键字。
入门
在我们开始之前,请确保您已注册 Slack 并设置了 Slack 工作区,并且有一个可以添加机器人的频道。此外,由于 Slack 会将消息发布到您应用的已发布 REST 服务,因此为了在开发过程中在本地测试您的应用,我建议使用隧道工具将您的本地主机公开到 Web(我使用 恩格罗克 为了这)。
在 Slack 上设置机器人
要开始,您可以访问 https://api.slack.com/apps?new_classic_app=1 并点击“创建新应用程序“。

选择“从头开始”并为您的机器人命名,我将创建一个新的机器人并将其命名为消息机器人。选择您为此创建的 Slack 工作区以在其中开发您的应用程序,然后单击“建立应用程式“。

创建应用程序后,您可以转到“OAuth 和权限” 我们这里想要的是机器人的 token,所以在“适用于您的工作区的 OAuth 令牌” 点击 “安装到工作场所”。 现在,它会提示我们需要为我们的机器人添加一个范围。向下滚动页面,您将看到一个标题为“机器人令牌范围”这就是我们所需要的,因此单击“添加 OAuth 范围”,我们想要的是 聊天:写, 或 公共频道 你可以加 聊天:write.public.

这将允许机器人在聊天中实际发布消息。现在,根据您要执行的操作,您可能必须添加其他范围,因此如果您遇到任何错误,请查看这些范围,您应该能够找出您希望机器人执行的操作所需的范围。
现在返回 OAuth 并单击 “安装到工作场所” 再次。然后单击允许,它将为您生成一个机器人令牌。
如果它以类似“ 韓國-您的代币价值”。

获得该信息后,我们可以使用它以及频道 ID 作为机器人向频道发送消息。为此,我准备了一个简单的应用程序,我将在这里构建一个方法,使用 Slack 的 API 作为机器人发送消息
以机器人身份发送消息
此版本适用于大多数能够使用 HTTP 方法或 REST 调用(Java、JavaScript、Python 等)的传统编程堆栈 - 您甚至可以尝试 Postman 在开始开发应用程序之前。我们需要做的就是使用 Slack 为我们的应用程序创建一个身份验证系统,然后我们需要集成用于发布消息的 API,然后我们需要发布一个 REST 端点,Slack 可以在该端点上发布频道中事件的消息
事件可以是消息、反应、频道中的提及等,可以将 Slack 事件视为类似于 Web 钩子
要将消息发送到服务,您必须提供服务的端点。在本例中,它是 https://slack.com/api/chat.postMessage
由于端点将 HTTP 方法的类型描述为 POST,因此我们需要确保在这里也使用 POST。

你还需要一些标题。我们想添加一个标题 内容类型 这需要'应用程序/json'. 接下来我们需要另一个名为 授权,这就是我们可以使用我们之前获得的机器人令牌的地方。您希望此标头的值为“持票人',然后a 空间 ' ',然后你的 代币价值.

现在要发送消息,我们必须为其提供 JSON 主体,因为这是一个 POST HTTP 方法。以下是我们将要使用的简化结构,您可以查看完整的 API 文档页面 开始.
{
“channel”:”{1}”,
“text”:”{2}”
}

请注意,在 Studio Pro 中,您可能需要 提供一个额外的花括号 { 在请求之前。
此请求已精简到最基本的要素 — 它只有字符串形式的频道和字符串形式的文本。您可以使用许多其他选项,例如附件和图标以及许多其他很酷的东西。所以去查看文档页面并尝试一下。您可以看到我在这里使用占位符,只是为了使用标准将我的值从微流传递到请求中 Mendix REST 操作。
它确实向我们发送了回复,但我没有在这里处理它,而是您可以运行您的应用程序并进行测试,如果成功,您应该在调用此微流时在频道中看到一条消息!
要测试消息发送,您需要您的频道 ID,您可以从 Slack 频道的 URL 获取该 ID(频道 URL 中最后一个“/”后面的最终值),然后您就可以作为您的机器人发送第一条消息!请记住,您需要确保您的机器人首先添加到频道中,为此,只需在频道中使用机器人 @ 提及并添加它们即可。
您的邮件现在应该从您的 Mendix 每当您运行此微流时,应用程序都会将其发送到 Slack 并出现在频道中,就像机器人发送它们一样。
让你的应用订阅频道中的活动
为了让 Slack 能够将消息发布到我们的 Mendix 应用程序,我们需要在 Slack 机器人的设置中启用事件。通过启用此功能,Slack 将向我们应用程序的已发布 REST 服务发布更新。我们可以使用它来实现逻辑来处理用户在使用频道时可能触发的不同类型的事件。您可以订阅特定事件,为其设置特定端点,也可以将所有更新发布到同一端点,并构建自己的逻辑来处理每个唯一事件。例如,一个很好的用途是让机器人在有人对消息做出反应或新用户加入频道时执行某些操作。对于我的构建,我只添加了一个事件端点,然后在我的微流中处理已发布 REST 服务调用的所有逻辑 Mendix 应用
为此,请转到 api.slack.com 中的“事件订阅|”。

将“启用事件”设置为“开”,您将看到一个“请求 URL”字段。这时我们需要使用我之前提到的工具打开隧道。NGROK 工具会从您的本地主机打开安全连接,并以安全的方式将其作为可用端点公开到 Web。
打开文件资源管理器并找到您下载的 ngrok.exe 文件。现在在您的终端或命令提示符中打开此 exe。您也可以单击 exe 文件的“打开”以在终端中打开它。然后输入“ngrok http {您的 MENDIX 应用端口号}”,我通常使用端口 8080 作为默认端口 Mendix 应用程序配置,但这可以使用您喜欢的任何端口号,例如“恩格罗克 http 5000” 就可以了,只要你的 Mendix app 也设置为在端口 5000 上运行。

按回车键,ngrok 将打开端点,你应该看到类似这样的内容:

您应该知道这会打开 HTTP 和 HTTPS 端点,Slack 需要使用 HTTPS。
处理事件 Mendix
我们现在有一个可以在 Slack 中使用的实时端点,但我们需要在设置已发布的 REST 服务后再回到该端点。
切换回 Studio Pro,在项目资源管理器中单击鼠标右键,然后选择在“其他”下添加已发布的 REST 服务。

为您的服务命名,我将我的命名为“SlackBot”,然后单击“确定”,

接下来向名为“SlackEvent”的服务添加资源,然后单击“确定”

然后向服务添加一个操作,在这里我们定义我们的 API 方法(GET、POST、PUT、PATCH、DELETE)、配置它自己的操作路径,并配置一个微流来处理端点的逻辑。
不需要设置操作路径,默认情况下端点将是这样的:
https://{LocalHost}/rest/{Service_Name}/{Version_Number}/{Resource_Name}/{Operation_Path}
以下是如何设置操作的示例:

我们现在有一个可以接受请求的有效 URL,但在处理每种事件类型之前还有很多工作要做.....身份验证。
认证
一开始我有点困惑,但其实很简单。当我们在 Slack 中添加事件端点时,它们的 API 将向端点发送一个挑战,其请求正文中包含一个“挑战”值,如下所示:
{
"token":"your_token",
"challenge":"your_ChallangeValue",
"type":"url_verification"
}
你所要做的就是在流程第一次被调用时,将这个挑战字符串发回给他们

在 Slack 中设置事件的 RequestURL
如果一切正确,我们可以制定一个 URL,将其添加到 Slack 事件订阅页面中。该 URL 应该是您的 NGROK https 端点的组合,其余部分将是您已发布服务的服务端点。
就像是: https://{NGROK_HTTPS_URL}/{Your_Published_Rest_Operation}
我的最终结果如下:
https://ff98-86-181-134-55.ngrok.io/rest/slackbot/v1/SlackEvent/Event
请记住,NGROK 仅用于开发,因此每 2 小时会超时一次,此后您必须为本地主机生成一个新的 URL。一旦投入生产,就不需要这样做了,您只需使用您的云 URL 即可。
您可以在事件页面上将此值设置为请求 URL。如果成功,Slack 会告诉您它已验证端点。

如果出现问题,您可以正常调试微流,设置您的 REST 消耗 以及 REST 发布 日志级别也可能有助于您通过控制台更深入地了解出现的问题。

在您自定义机器人动作之前我们需要处理的最后一件事是确保它能够识别自己,否则您可能会创建一个无限循环,如果我们不过滤掉它在频道中的活动,那么每当机器人向群组发布消息时它就会触发自身。
为此,我们必须导入 Slack 为我们的应用提供的 REST 服务请求负载。负载如下所示:
{
"token":"dKyT4vmA1NJLt6vq8o1WurMd",
"team_id":"T02LUP42T19",
"api_app_id":"A02MJE1059N",
"event":{
"bot_id":"B02NK4L1XHN",
"type":"message",
"text":"Hello from Mendix",
"user":"U02MEPHFY2K",
"ts":"1637273612.003700",
"team":"T02LUP42T19",
"bot_profile":{
"id":"B02NK4L1XHN",
"deleted":false,
"name":"message bot",
"updated":1637253238,
"app_id":"A02MEP8D37Z",
"icons":{
"image_36":"https://a.slack-edge.com/80588/img/plugins/app/bot_36.png",
"image_48":"https://a.slack-edge.com/80588/img/plugins/app/bot_48.png",
"image_72":"https://a.slack-edge.com/80588/img/plugins/app/service_72.png"
},
"team_id":"T02LUP42T19"
},
"channel":"C02LRPR0XGD",
"event_ts":"1637273612.003700",
"channel_type":"channel"
},
"type":"event_callback",
"event_id":"Ev02MGFCNHP1",
"event_time":1637273612,
"authorizations":[
{
"enterprise_id":null,
"team_id":"T02LUP42T19",
"user_id":"U02LUPJ8T4J",
"is_bot":true,
"is_enterprise_install":false
}
],
"is_ext_shared_channel":false,
"event_context":"4-eyJldCI6Im1lc3NhZ2UiLCJ0aWQiOiJUMDJMVVA0MlQxOSIsImFpZCI6IkEwMk1KRTEwNTlOIiwiY2lkIjoiQzAyTFJQUjBYR0QifQ"
}
创建 JSON 结构,粘贴 JSON,然后单击 R刷新 在 Structure 部分中,您可以单击 OK 关闭窗口。

接下来创建一个导入映射,在 Schema 源下,选择您创建的 JSON 结构。确保选择所有字段以获取所需的所有详细信息,或者挑选您需要的内容。

单击“确定”关闭窗口,然后在映射编辑器的左上角选择“自动映射”。

你现在应该看到类似这样的内容:

最后,使用此映射导入 HTTPRequest 并添加检查以查看发布消息的用户是否是机器人,如果是机器人则不执行任何操作并返回空。

现在,您可以自由地以任何方式处理任何事件。我的快速方法是使用 包含 以及 找到最适合您的地方 关键字来检查消息的内容。此方法允许您添加任意数量的独占拆分,通过这样做,您可以在微流中创建对话树,这是一种简单的方法(但您可以更进一步,将每个响应存储在数据库中,这将使此设置在运行时可配置)。要发送此响应,只需重用我们之前用于发送测试消息的 postMessage API。
以下是我的示例

斜线命令
斜线命令到底是什么?简单来说,它们类似于 web-hook。当用户输入带有斜线“/”的某个关键字(Slack 中的设置)时,Slack 会将更新推送到唯一的端点。
这确实是事件和斜线命令之间的最大区别。只需在已发布的 REST 服务上添加一个新方法,对于我的示例,我保持简单。当用户输入 /ping 时,机器人将响应 pong。我知道有点像“Hello world”,但我主要是在这里玩玩。
添加一个新的端点,并在操作路径中输入Ping,这也是一种POST方法。

然后在处理逻辑的微流中,只需将响应的内容属性设置为“Pong”。

最后,在 Slack 中,转到左侧菜单中的 Slash 命令,然后单击“创建新命令”

您的终端将再次是来自 恩格罗克 和 HTTP 方法的 URL.

全部完成
恭喜,您已经成功了。现在您可以测试您的应用并了解您的机器人!别忘了,您必须将您的机器人添加到 Slack 频道,以便他们获取发送到事件端点的更新。只需在 Slack 中发送 @YourBotName,它就会要求为您添加机器人。由于 Slack 的 API 有许多其他功能可供使用,如果您想要更具体的内容,请告诉我。
在你离开之前,以下是我和我的机器人进行的简短对话 -

编码愉快!
