>  기사  >  웹 프론트엔드  >  Node.js 기반 Slack 봇 만들기

Node.js 기반 Slack 봇 만들기

WBOY
WBOY원래의
2023-08-28 19:49:021150검색

创建基于 Node.js 的 Slack 机器人

휴식은 팀 커뮤니케이션을 위한 새로운 업계 표준으로 빠르게 자리잡고 있습니다. 존재하다 사실 워낙 인기가 많아서 슬랙을 치면 구글에 들어왔을 때 예상대로 첫 번째 결과는 이 단어의 정의였습니다. 사전에서. Slack의 웹사이트는 매우 가깝습니다!

이것은 영어 사전에서 가장 흔한 단어는 거의 들어본 적이 없습니다. 일반적으로 Google의 정의 다음에는 여러 주요 사전에 대한 링크가 이어집니다. 웹사이트.

Slack이란 무엇인가요?

그 안에 가장 기본적으로 Slack은 메시징 시스템입니다. 팀에 직접 메시지를 보낼 수 있습니다. 실시간 활성화를 위한 멤버십 및 채널(비공개 또는 공개) 생성 팀 커뮤니케이션 및 협업. 더 알아보기 Slack에 대한 자세한 내용은 Slack의 특징.

이때 어느 시점에서는 Node.js가 어디에 있는지 궁금할 것입니다. 앞서 언급했듯이 가장 기본적인 수준에서 Slack은 메시징 시스템입니다. 하지만 무한히 확장 가능 맞춤 제작. Slack은 매우 유연한 시스템을 제공하여 다음을 포함한 팀 통합:

  • 맞춤형 환영 메시지 만들기 뉴스
  • 맞춤 이모티콘 만들기
  • 타사 설치 신청
  • 나만의 만들기 신청
  • 맞춤형 Slack 봇 만들기

이에는 이 기사에서는 Node.js를 사용하여 Slack 봇을 만드는 방법을 보여 드리겠습니다. 팀의 Slack 구성에 추가할 수 있습니다.

Slack 봇 정의

휴식 Bot의 임무는 Slack에서 보낸 이벤트를 수신하고 처리하는 것입니다. 대량의 이벤트가 전송됩니다 봇에 Node.js가 들어오는 곳입니다. 우리는 그렇게 하지 않기로 결정해야 해요 어떤 이벤트를 처리할지, 각 개별 이벤트를 어떻게 처리할지에만 신경쓰세요.

For 예를 들어, 봇이 처리할 몇 가지 일반적인 이벤트는 다음과 같습니다.

  • member_joined_channel
  • member_left_channel
  • 消息

이에는 이번 글에서는 Node.js 애플리케이션과 추가할 수 있는 Slack Bot을 만들어 보겠습니다. 이벤트에 따라 특정 작업을 수행하기 위해 팀 프로젝트에 받다.

먼저 Slack에서 봇을 만들어야 합니다. 두 가지 유형의 봇을 만들 수 있습니다:

  • 맞춤형 로봇
  • 앱 생성 및 봇 사용자 추가

Slack에서 앱을 작성하고 게시하려는 경우 App Bot 사용자가 더 적합하기 때문에 이 기사에서는 맞춤형 봇을 만드는 방법에 대해 설명합니다. 이 봇을 우리 팀에만 공개하고 싶다면 맞춤형 봇이면 충분합니다.

맞춤형 Slack 봇 만들기

맞춤형 봇은 여기(https://my.slack.com/apps/A0F7YS25R-bots)에서 생성할 수 있습니다. 이미 Slack 계정에 로그인되어 있는 경우 왼쪽의 구성 추가 버튼을 선택하세요. 그렇지 않으면 계속하기 전에 Slack 계정에 로그인하세요. Slack 계정이 없으면 무료로 가입할 수 있습니다.

이렇게 하면 봇의 사용자 이름을 묻는 새 페이지로 이동됩니다. 지금 사용자 이름을 입력하고 Slack의 이름 지정 지침을 따르세요. 멋진 봇 이름을 선택한 후 봇 구성 추가를 누르세요.

봇이 성공적으로 생성되면 Slack은 봇을 추가로 사용자 정의할 수 있는 페이지로 리디렉션합니다. 이 부분은 여러분의 창의적인 자아에게 맡기겠습니다. 이 페이지에 필요한 유일한 것은 xoxb-로 시작하는 API 토큰입니다. 나중에 사용하기 위해 이 토큰을 안전한 위치에 복사하거나 Node.js 애플리케이션에 토큰이 필요할 때까지 이 페이지를 열어 둘 수도 있습니다.

구성

코드 작성을 계속하기 전에 두 가지 Slack 구성이 더 필요합니다.

  1. 봇이 상호 작용할 기존 채널을 만들거나 선택하세요. 새 봇을 테스트할 때 새 채널을 생성하기로 선택합니다. 앱에서 곧 필요하므로 채널 이름을 기억해 두세요.
  2. 채널에 봇을 추가/초대하여 상호 작용하세요.

이제 Slack Bot이 구성되었으므로 Node.js 애플리케이션으로 넘어갈 차례입니다. Node.js가 이미 설치되어 있는 경우 다음 단계로 진행할 수 있습니다. 아직 Node.js가 설치되어 있지 않다면 먼저 Node.js 다운로드 페이지를 방문하여 시스템에 적합한 설치 프로그램을 선택하는 것이 좋습니다.

내 Slack Bot의 경우 npm init 프로세스를 실행하여 새 Node.js 애플리케이션을 생성하겠습니다. 애플리케이션을 설치할 위치로 설정된 명령 프롬프트를 사용하여 다음 명령을 실행할 수 있습니다.으아악

npm init,这会启动一个实用程序来帮助您配置新项目。它询问的第一件事是名称。它默认我的为 slackbot에 익숙하지 않으시다면 괜찮습니다. 애플리케이션 이름을 변경하려면 지금이 기회입니다. 그렇지 않으면 Enter를 눌러 다음 구성 단계로 진행하세요. 다음 옵션은 버전 및 설명입니다. 두 옵션을 모두 기본값으로 두고 Enter 키를 눌러 두 옵션을 계속 선택했습니다.

진입 지점

다음으로 필요한 것은 진입점입니다. 기본값은 index.js;然而,很多人喜欢使用 app.js。我不想参加这场辩论,并且考虑到我的应用程序不需要密集的项目结构,我将把我的应用程序保留为默认值 index.js입니다.

탭과 공백만큼 뜨거웠던 논쟁에서 회복한 후 몇 가지 질문으로 구성이 계속됩니다.

  • 테스트 명령
  • git 저장소
  • 키워드
  • 작가
  • 라이센스

이 문서의 목적을 위해 모든 옵션을 기본값으로 두었습니다. 마지막으로 모든 옵션이 구성되면 파일을 생성하기 전에 package.jsonEnter를 눌러 구성을 완료하라는 확인 메시지가 표시됩니다.

SDK 입력

Slack과 더 쉽게 상호작용할 수 있도록 아래와 같이 Slack Developer Kit도 설치하겠습니다.

으아악

드디어 코드를 작성할 준비가 되셨나요? 물론이죠. 먼저 Real-Time Messaging API(RTM)를 사용하여 Slack 메시지를 게시하는 Slack 개발자 키트 웹 사이트의 샘플 코드를 몇 가지 수정하여 사용하겠습니다.

제가 선택한

진입점 이 파일에 있다는 점을 고려하면요. index.js,是时候创建此文件了。 Slack 开发人员工具包网站上的示例大约有 20 行代码。我将一次将其分解为几行,只是为了解释这些行的作用。但请注意,所有这些行都应包含在您的 index.js

코드는 Slack 개발자 툴킷의 두 모듈로 시작됩니다.

으아악

은 봇이 수신하는 이벤트입니다. RtmClient 一旦实例化,将成为引用 RTM API 的机器人对象。 CLIENT_EVENTS

이러한 모듈을 포함시킨 후 로봇을 인스턴스화하고 시작할 수 있습니다.

으아악

위의 난독화된

API 토큰을 Slack Bot 생성 프로세스 중에 얻은 토큰으로 교체하세요.

기능에서 봇의 세션이 초기화됩니다. 그러면 내 봇을 인증하려고 시도합니다. 내 봇이 Slack에 성공적으로 연결되면 이벤트가 전송되어 애플리케이션을 계속 진행할 수 있습니다. 이러한 이벤트는 즉시 표시됩니다. RtmClient 上调用 start

클라이언트를 인스턴스화한 후 이벤트 중 하나 내에

가 생성됩니다. channel 变量,该变量将立即填充到 CLIENT_EVENTS 으아악

변수는 봇이 연결된 채널에 메시지를 보내는 등의 특정 작업을 수행하는 데 사용됩니다. channel

RTM 세션이 시작되고(rtm.start();) 봇에 유효한

API 토큰rtm.start();) 并为机器人提供有效的 API 令牌时,会生成一个 将发送 RTM.AUTHENTICATED이 제공되면 생성된 RTM.AUTHENTICATED 메시지를 보냅니다. 다음 몇 줄은 이 이벤트를 수신합니다:

으아악

RTM.AUTHENTICATED 이벤트가 수신되면 이전 코드는 Slack 팀 채널 목록에서 for 루프를 실행합니다. 제 경우에는 특별히 RTM.AUTHENTICATED 事件时,前面的代码会在 Slack 团队频道列表中执行 for 循环。就我而言,我专门寻找jamiestestchannel并确保我的机器人是该频道的成员。当满足该条件时,通道 ID 将存储在 channeljamiestestchannel

을 찾아서 내 봇이 해당 채널의 회원인지 확인했습니다. 이 조건이 충족되면 채널 ID가

변수에 저장됩니다.

디버그${rtmStartData.self.name}) 和团队名称成功进行身份验证(${rtmStartData.team.name}

디버깅을 돕기 위해 봇이 속한 이름(

)을 표시하여 봇이 식별되었음을 나타내는 메시지와 함께 콘솔 메시지가 기록됩니다. RTM.RTM_CONNECTION_OPENED 봇이 인증되면 또 다른 이벤트()가 발생합니다. 이는 봇이 완전히 연결되어 Slack과 상호 작용을 시작할 수 있음을 나타냅니다. 다음 코드 줄은 성공 시 Hello! 이벤트 리스너를 생성합니다. 메시지는 해당 채널(저의 경우

jamiestestchannel

)로 전송됩니다.

으아악

이제 Node 애플리케이션을 실행하고 봇이 자동으로 내 채널에 새 메시지를 게시하는 것을 볼 수 있습니다.

으아악 🎜이 명령을 실행한 결과(성공한 경우)는 두 가지입니다. 🎜
  1. 我收到调试消息,表明我的机器人已成功登录。这源自启动 RTM 客户端后触发的 RTM.AUTHENTICATED
  2. 我在 Slack 频道中收到一条Hello!消息。当应用程序接收并处理 RTM.RTM_CONNECTION_OPENED 事件消息时,会发生这种情况。

在继续和进一步增强我的应用程序之前,现在是回顾一下我到目前为止所做的工作的好时机:

  1. 创建了一个自定义 Slack 机器人。
  2. 创建了一个自定义 Slack 频道并邀请我的机器人加入。
  3. 创建了一个名为 slackbot 的新 Node.js 应用程序。
  4. 已将 Slack 开发者工具包安装到我的应用程序中。
  5. 创建了我的 index.js 文件,该文件使用我的自定义机器人中的 API 令牌 创建 RtmClient
  6. RTM.AUTHENTICATED 创建了一个事件侦听器,用于查找我的机器人所属的 Slack 频道。
  7. RTM.RTM_CONNECTION_OPENED 创建了一个事件侦听器,用于向我的 Slack 频道发送Hello!消息。
  8. 调用 RTM Start Session 方法来开始由我的事件侦听器处理的身份验证过程。

构建机器人

现在是真正的乐趣开始的时候了。 Slack 提供(我没有数)至少 50 个不同的事件可供我的自定义机器人监听和选择性处理。正如您从 Slack 事件列表中看到的,某些事件是 RTM API(我们正在使用的)自定义的,而其他事件是 Events API 自定义的。在撰写本文时,我的理解是 Node.js SDK 仅支持 RTM。

为了完成我的机器人,我将处理 message 事件;当然,这可能是最复杂的事件之一,因为它支持大量子类型,我稍后将探讨这些子类型。

以下是 Slack 中最基本的 message 事件的示例:

{
    "type": "message", 
    "channel": "C2147483705", 
    "user": "U2147483697", 
    "text": "Hello world", 
    "ts": "1355517523.000005" 
}

在这个 basic object, the three most important things I care about are:

  1. 频道。我希望确保此消息属于我的机器人所属的频道。
  2. 用户。这将使我能够直接与用户交互或根据用户身份执行特定操作。
  3. text。这可能是最重要的部分,因为它包含消息的内容。我的机器人只想响应某些类型的消息。

有些消息更为复杂。它们可以包含许多子属性,例如:

  • edited:一个子对象,描述哪个用户编辑了消息以及消息发生的时间。
  • subtype:定义多种不同类型之一的字符串,例如channel_join、channel_leave等。

  • is_starred:一个布尔值,指示此消息是否已加星标。

  • pinned_to:已固定此消息的通道数组。

  • reactions:一组反应对象,定义反应是什么(例如捂脸)、反应发生的次数以及对消息做出这种反应的用户数组。

我将扩展之前创建的 index.js 来监听 message 事件。为了减少代码冗余,以下示例将仅包含与 message 事件增强相关的部分代码。

必须做的第一件事是为我将要收听的 RTM_EVENTS 添加一个新模块。我已将其放置在我之前的两个模块下方:

var RTM_EVENTS = require('@slack/client').RTM_EVENTS;

处理 message 事件的代码我将放置在文件的底部。为了测试 message 事件是否正常工作,我创建了一个新的事件侦听器,它将 message 对象记录到控制台,如下所示:

rtm.on(RTM_EVENTS.MESSAGE, function(message) {
    console.log(message);
});

我现在可以重新运行我的 Node 应用程序 (node index.js)。当我在频道中输入消息时,以下内容将记录到我的控制台:

{ 
    type: 'message',
    channel: 'C6TBHCSA3',
    user: 'U17JRET09',
    text: 'hi',
    ts: '1503519368.000364',
    source_team: 'T15TBNKNW',
    team: 'T15TBNKNW' 
}

到目前为止,一切都很好。我的机器人已成功接收消息。下一个增量步骤是确保消息属于我的机器人所在的频道:

rtm.on(RTM_EVENTS.MESSAGE, function(message) {
    if (message.channel === channel)
        console.log(message);
});

现在,当我运行我的应用程序时,如果 message 事件适用于我的机器人所属的 channel,我只会看到调试消息。

我现在将扩展应用程序以向频道发送自定义消息,演示如何在消息中标记用户:

rtm.on(RTM_EVENTS.MESSAGE, function(message) {
    if (message.channel === channel)
        rtm.sendMessage("Stop, everybody listen, <@" + message.user + "> has something important to say!", message.channel);
});

现在,当任何人在频道中输入消息时,我的机器人都会发送自己的消息,如下所示:“停下来,大家听着,@endyourif 有重要的事情要说!”

好吧,不是很有用。相反,我将通过增强 message 事件侦听器以响应特定命令来完成我的机器人。这将通过执行以下操作来完成:

  1. 根据空格将 messagetext 部分拆分为一个数组。
  2. 检查第一个索引是否与我的机器人的用户名匹配。
  3. 如果是,我将查看第二个索引(如果存在)并将其视为我的机器人应执行的命令

为了轻松检测我的机器人是否被提及,我需要创建一个新变量来存储我的机器人用户 ID。下面是更新的代码部分,我之前在其中设置了 channel 变量。现在,它还将我的机器人的用户 ID 存储在名为 bot 的变量中。

let channel;
let bot;

rtm.on(CLIENT_EVENTS.RTM.AUTHENTICATED, (rtmStartData) => {
  for (const c of rtmStartData.channels) {
      if (c.is_member && c.name ==='jamiestestchannel') { channel = c.id }
  }
  console.log(`Logged in as ${rtmStartData.self.name} of team ${rtmStartData.team.name}`);
  
  bot = '<@' + rtmStartData.self.id + '>';
});

通过设置 bot 变量,我通过充实之前创建的 message 事件监听器来完成我的机器人,如下所示:

rtm.on(RTM_EVENTS.MESSAGE, function(message) {
    if (message.channel === channel) {
		if (message.text !== null) {
			var pieces = message.text.split(' ');
			
			if (pieces.length > 1) {
				if (pieces[0] === bot) {
					var response = '<@' + message.user + '>';
					
					switch (pieces[1].toLowerCase()) {
						case "jump":
							response += '"Kris Kross will make you jump jump"';
							break;
						case "help":
							response += ', currently I support the following commands: jump';
							break;
						default:
							response += ', sorry I do not understand the command "' + pieces[1] + '". For a list of supported commands, type: ' + bot + ' help';
							break;
					}
					
					rtm.sendMessage(response, message.channel);
				}
			}
		}
	}
});

以下代码将数组中的 text 对象的 message 属性基于空格进行拆分。接下来,我确保数组中至少有两个元素,最好是我的机器人和要执行的命令。

当数组中的第一个元素与我的机器人匹配时,我对数组中的第二个元素执行 switch 语句:命令。当前支持的命令有jumphelp。当一条消息发送到看起来像“@jamiestest跳转”的频道时,我的机器人将向原始用户回复一条特殊消息。

如果该命令未被识别,它将落入我的 switch 的默认 case 语句中,并使用如下所示的通用命令进行响应:“@endyourif,抱歉,我不明白命令“hi”。有关受支持命令的列表,请键入:@jamiestest help"。

结论

此时 point, my bot is complete! If you are interested in further enhancing your bot, here's a list of ideas:

  • 通过监听 team_join 事件来处理新团队成员的加入。当新团队成员加入时,最好向他们发送各种入职信息和/或文件,欢迎他们加入您的团队。
  • 增强我已启动的受支持命令列表。
  • 通过搜索数据库、Google、YouTube 等使命令具有交互性。
  • 在应用程序上创建机器人用户并创建您自己的自定义斜杠命令。

위 내용은 Node.js 기반 Slack 봇 만들기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.