Maison  >  Article  >  interface Web  >  Créer un bot Slack basé sur Node.js

Créer un bot Slack basé sur Node.js

WBOY
WBOYoriginal
2023-08-28 19:49:021101parcourir

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

La détente est Devient rapidement la nouvelle norme de l’industrie en matière de communication d’équipe. exister En fait, c'est si populaire que quand je tape slack Lorsque je suis entré sur Google, comme je m'y attendais, le premier résultat a été la définition de ce mot. du dictionnaire. Le site Web de Slack arrive juste derrière !

C'est Presque inconnu pour le mot le plus courant du dictionnaire anglais. En règle générale, les définitions de Google sont suivies de liens vers plusieurs dictionnaires de premier plan. site web.

Qu'est-ce que Slack ?

Dedans À la base, Slack est un système de messagerie. Il permet d'envoyer des messages directs aux équipes Adhésion et création de chaînes (privées ou publiques) pour faciliter le temps réel Communication et collaboration en équipe. apprendre encore plus Pour plus d’informations sur Slack, vous pouvez consulter les Caractéristiques.

En ce moment À un moment donné, vous vous demandez peut-être où entre en jeu Node.js. Comme je l'ai mentionné, à son niveau le plus élémentaire, Slack est un système de messagerie ; Cependant, il peut être étendu à l'infini sur mesure. Slack propose un système très flexible pour personnaliser votre Intégration d'équipe comprenant :

  • Créez un message de bienvenue personnalisé Actualités
  • Créez des emojis personnalisés
  • Installer un tiers Candidature
  • Créez le vôtre Candidature
  • Créez un bot Slack personnalisé

Dans ce Dans cet article, je vais montrer comment créer un bot Slack à l'aide de Node.js Peut être ajouté à la configuration Slack de votre équipe.

Définition du robot Slack

Détente Le travail du Bot consiste à recevoir les événements envoyés par Slack et à les traiter. Un grand nombre d'événements seront envoyés à votre bot, c'est là qu'intervient Node.js. nous devons décider de ne pas Pensez simplement aux événements à gérer et à la manière de gérer chaque événement individuel.

pour Par exemple, certains événements courants que le bot gérera sont :

  • member_joined_channel
  • member_left_channel
  • 消息

Dans ce Dans cet article, je vais créer une application Node.js et un Slack Bot qui pourront être ajoutés à votre projet d'équipe pour effectuer des actions spécifiques en fonction d'événements recevoir.

Tout d'abord, je dois créer un bot sur Slack. Deux types de bots peuvent être créés :

  • Robot personnalisé
  • Créez une application et ajoutez des utilisateurs de robots

Cet article portera sur la création d'un bot personnalisé, car si vous envisagez d'écrire et de publier des applications sur Slack, l'utilisateur d'App Bot serait plus approprié. Étant donné que je souhaite que ce bot soit privé pour mon équipe, un bot personnalisé suffira.

Créez un bot Slack personnalisé

Des robots personnalisés peuvent être créés ici : https://my.slack.com/apps/A0F7YS25R-bots. Si vous êtes déjà connecté à votre compte Slack, sélectionnez le bouton Ajouter une configuration à gauche. Sinon, veuillez vous connecter à votre compte Slack avant de continuer. Si vous n'avez pas de compte Slack, vous pouvez vous inscrire gratuitement.

Cela vous mènera à une nouvelle page vous demandant le nom d’utilisateur de votre bot. Entrez votre nom d'utilisateur maintenant, en veillant à suivre les directives de dénomination de Slack. Après avoir choisi un merveilleux nom de bot, appuyez sur Ajouter une configuration de bot.

Après avoir créé le bot avec succès, Slack vous redirigera vers une page permettant une personnalisation plus poussée du bot. Je laisse cette partie à votre créativité. La seule chose dont cette page a besoin est un xoxb-Jeton API qui commence par . Je peux copier ce jeton dans un emplacement sûr pour une utilisation ultérieure, ou je peux simplement garder cette page ouverte jusqu'à ce que nous ayons besoin du jeton pour notre application Node.js.

Configuration

Avant de continuer à écrire du code, nous avons besoin de deux configurations Slack supplémentaires :

  1. Créez ou sélectionnez un canal existant avec lequel votre bot interagira. Lorsque je teste un nouveau bot, je choisis de créer une nouvelle chaîne. N'oubliez pas le nom de la chaîne, car vous en aurez bientôt besoin dans l'application.
  2. Ajoutez/invitez votre bot à la chaîne pour interagir avec lui.

Maintenant que le Slack Bot est configuré, il est temps de passer à l'application Node.js. Si Node.js est déjà installé, vous pouvez passer à l'étape suivante. Si Node.js n'est pas encore installé, je vous recommande de visiter d'abord la page de téléchargement de Node.js et de sélectionner le programme d'installation approprié pour votre système.

Pour mon Slack Bot, je vais créer une nouvelle application Node.js en exécutant le processus npm init Avec une invite de commande définie à l'endroit où vous souhaitez que votre application soit installée, vous pouvez exécuter les commandes suivantes :

.
mkdir slackbot
cd slackbot
npm init

Si vous n'êtes pas familier avec npm init,这会启动一个实用程序来帮助您配置新项目。它询问的第一件事是名称。它默认我的为 slackbot, je suis d'accord avec ça. Si vous souhaitez modifier le nom de votre application, c'est votre chance ; sinon, appuyez sur Entrée pour passer à l'étape de configuration suivante. Les options suivantes sont Version et Description. J'ai laissé les deux options par défaut et j'ai simplement appuyé sur la touche Entrée pour continuer à sélectionner les deux options.

Point d'entrée

La prochaine chose requise est le point d'entrée. La valeur par défaut est index.js;然而,很多人喜欢使用 app.js。我不想参加这场辩论,并且考虑到我的应用程序不需要密集的项目结构,我将把我的应用程序保留为默认值 index.js.

Après vous être remis d'une dispute qui aurait pu être aussi vive que les tabulations contre les espaces, la configuration continue avec quelques questions :

  • Commande de test
  • dépôt git
  • mots-clés
  • Auteur
  • Licence

Pour les besoins de cet article, j'ai laissé toutes les options par défaut. Enfin, une fois toutes les options configurées, une confirmation du package.json fichier s'affiche avant de le créer. Appuyez sur Entrée pour terminer la configuration.

Entrez le SDK

Pour faciliter l'interaction avec Slack, j'installerai également le kit de développement Slack comme indiqué ci-dessous :

npm install @slack/client --save

Êtes-vous enfin prêt à écrire du code ? Bien sûr que je le suis. Tout d’abord, j’utiliserai l’exemple de code du site Web Slack Developer Kit qui publie un message Slack à l’aide de l’API de messagerie en temps réel (RTM), avec quelques ajustements.

Étant donné que le point d'entrée que j'ai choisi était index.js,是时候创建此文件了。 Slack 开发人员工具包网站上的示例大约有 20 行代码。我将一次将其分解为几行,只是为了解释这些行的作用。但请注意,所有这些行都应包含在您的 index.js dans le dossier.

Le code commence par deux modules de la boîte à outils du développeur Slack :

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

RtmClient 一旦实例化,将成为引用 RTM API 的机器人对象。 CLIENT_EVENTS est l'événement que le bot écoutera.

Après avoir inclus ces modules, vous pouvez instancier et démarrer le robot :

var rtm = new RtmClient('xoxb-*************************************');
rtm.start();

Assurez-vous de remplacer le API Token masqué ci-dessus par le jeton que vous avez obtenu lors du processus de création de Slack Bot.

Dans ma fonction RtmClient 上调用 start initialisera la session du bot. Cela va essayer d'authentifier mon bot. Lorsque mon bot se connecte avec succès à Slack, un événement est envoyé, permettant à mon application de continuer. Ces événements seront affichés immédiatement.

Après l'instanciation du client, un channel 变量,该变量将立即填充到 CLIENT_EVENTS sera créé au sein de l'un des événements.

let channel;

channel Les variables seront utilisées pour effectuer des actions spécifiques, telles que l'envoi de messages au canal auquel le bot est connecté.

Lorsqu'une session RTM est démarrée (rtm.start();) et que le bot reçoit un rtm.start();) 并为机器人提供有效的 API 令牌时,会生成一个 将发送 RTM.AUTHENTICATEDJeton API

valide, un sera généré Envoyer un message RTM.AUTHENTICATED. Les prochaines lignes écoutent cet événement :

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}`);
});
RTM.AUTHENTICATED 事件时,前面的代码会在 Slack 团队频道列表中执行 for 循环。就我而言,我专门寻找jamiestestchannel并确保我的机器人是该频道的成员。当满足该条件时,通道 ID 将存储在 channelLorsque l'événement RTM.AUTHENTICATED est reçu, le code précédent exécute une boucle for dans la liste des canaux de l'équipe Slack. Dans mon cas, j'ai spécifiquement recherché

jamiestestchannel

et je me suis assuré que mon bot était membre de cette chaîne. Lorsque cette condition est remplie, l'ID de la chaîne sera stocké dans la variable

.

${rtmStartData.self.name}) 和团队名称成功进行身份验证(${rtmStartData.team.name}Débug

Pour faciliter le débogage, un message de console est enregistré avec un message indiquant que le bot a été identifié en affichant son nom (RTM.RTM_CONNECTION_OPENED) auquel il appartient. Une fois le bot authentifié, un autre événement () est déclenché, ce qui indique que le bot est entièrement connecté et peut commencer à interagir avec Slack. La ligne de code suivante crée un écouteur d'événement ; en cas de succès, un message Hello !

Le message sera envoyé à cette chaîne (dans mon cas,

jamiestestchannel

).

rtm.on(CLIENT_EVENTS.RTM.RTM_CONNECTION_OPENED, function () {
  rtm.sendMessage("Hello!", channel);
});

À ce stade, je peux désormais exécuter mon application Node et regarder mon bot publier automatiquement un nouveau message sur ma chaîne :🎜
node index.js
🎜Les résultats de l'exécution de cette commande (en cas de succès) sont doubles : 🎜
  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 等使命令具有交互性。
  • 在应用程序上创建机器人用户并创建您自己的自定义斜杠命令。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn