使用Node.js构建自己的自定义SlackBot

本文由Dan PrinceMatthew Wilkin进行同行评审。 感谢所有SitePoint的同行评审人员使SitePoint内容达到最佳状态!

Slack在开发人员和非开发人员技术社区中都有一定的吸引力和忠实粉丝。 其光滑的用户界面,保持沟通独立和相关的团队和渠道的概念,用于生产力的大量集成(Dropbox,Box,Google Calendar,Hangouts等)以及giphy和提醒等使使用起来很有趣。 此外,他们的API可以帮助开发人员扩展功能并为其团队建立自定义体验。

如果您正在考虑“ Slack所没有的独特之处,HipChat(或您喜欢的应用程序)也拥有所有这些!”,您可能想看看: http//slackvshipchat.com/

教程目标

本教程旨在帮助您使用一个简单的节点应用程序启动并运行,该应用程序将您的Slack频道变成自定义命令行终端。 我们将使用一个名为slack-terminalize的帮助程序模块( 免责声明 :我开发了它),该模块抽象了消息的初始处理。 它使用Slack的Real-Time API Node客户端,并准备了一个机器人来侦听并响应您的请求。

请注意,这里我们不会使用斜杠命令 ,而是将常规消息解释为命令。 因此,如果您想了解有关Slash Commands的信息,那么本教程可能不合适。

开始之前

我的假设是您具有JavaScript和NodeJS的使用知识,并且熟悉Slack术语:团队,渠道, 机器人集成 。 您将需要安装nodenpm ; 您可以按照SitePoint对npm的精彩介绍来设置开发环境。

发展松弛终端化的动机

尽管有很多花哨的hubot 脚本可以响应自然语言查询,但任何Linux爱好者都会同意,用短命令和最少的击键就可以实现很多。 简单的命令在移动设备中尤其有意义,它可以帮助您减少键入次数,执行更多操作。 如果您考虑使用命令行系统,那么大多数情况下,shell所做的就是艰巨的工作,即获取,解析,标记化和分派命令(我知道这简直是过分简化)。

考虑到这一点,我感到需要一个可以做到这一点的模块。 如果愿意,可以使用Slack通道的外壳。 借助过程和调度方法以及类似于插件的体系结构来添加自定义命令, 松弛终端化可以抽象化事物,因此您可以将更多精力放在定义应用程序的行为上。

聊够了,让我们开始吧

首先,让我们为您的团队创建一个新的机器人用户,它可以接受您的订单! 转到https://<your-team-name>.slack.com/services/new/bot ,为其选择一个用户名,然后点击添加Bot集成

Add Bot User

将显示的API令牌复制给您,因为这是您的机器人能够与渠道进行交互所必需的。 配置漫游器的其他详细信息,配置文件图像和真实姓名,然后点击保存集成

Save Bot User

现在,让我们克隆示例应用程序并安装依赖项:

git clone https://github.com/ggauravr/slack-sample-cli.git
cd slack-sample-cli
npm install

项目结构演练

package.json的依赖项列表中,唯一需要的依赖项是slack-terminalize ,但是由于该示例应用程序有一个示例来演示如何处理异步命令,因此使用请求模块进行REST调用。

Project Structure

配置/

您的应用可能需要的所有JSON文件都可以放在此处。 我说“可以”是因为它非常灵活,您可以通过配置参数将其更改为与其他目录一起使用(稍后再介绍)。 这只是构建应用程序的多种方式之一,但是,如果您不熟悉Slack集成,建议您坚持使用此方法。

命令.json

这就是添加自定义命令的小菜一碟。 每个命令都由一个键-值对表示:键是命令名(我称它为“ 主名” ),值是一个对象,该对象具有要用于命令的自定义键-值对。

在这里,我为每个命令使用以下自定义字段:

  • alias –这些是命令的别名(我们称其为次要名称 ),也可以在备用通道中使用它们来调用命令。 最好保留最小的名称作为主要名称,而保留更有意义,更长的名称作为别名。

  • description –命令的简短可读描述

  • help –帮助消息,执行诸如man <command-name>help <command-name>

  • exclude –一个标志,指示是否应在用户可用的命令列表中显示此命令。 一些命令可能只是出于开发目的和/或不需要暴露给用户的帮助者(例如,上面的错误命令)。

  • endpoint –命令应该与之交谈的REST端点,以防它依赖于任何外部服务来执行其任务

其中, alias是唯一查找到的将用户键入的命令映射到其主名称的键。 它们的其余部分是可选的,您可以随意使用命令对象内的任何字段。

命令/

这就是魔术发生的地方,是您定义命令行为的地方。 config / commands.json中指定的每个命令都应在此具有其匹配的实现,其文件名应与该JSON中使用的键(主要名称)匹配。 这就是调度程序调用正确的处理程序的方式。 是的,我有些自以为是,但是仍然有用且可自定义。

{
    "help": {
        "alias": [ "halp" ],
        "endpoint": "#",
        "help": "help [command](optional)",
        "description": "To get help on all supported commands, or a specified command"
    },

    "gem": {
        "alias": [],
        "endpoint": "https://rubygems.org/api/v1/gems/{gem}.json",
        "help": "gem [gem-name]",
        "description": "Fetches details of the specified Ruby gem"
    },

    "error": {
        "exclude": true
    }
}

再次注意,该文件中的键名与commands/目录中的文件名相同。

代码演练

用您的漫游器替换index.js中 SLACK_TOKEN的值。 CONFIG_DIRCOMMAND_DIR分别告诉slack-terminalize在哪里寻找配置和命令实现。

var slackTerminal = require('slack-terminalize');

slackTerminal.init('xoxb-your-token-here', {
    // slack client options here
    }, {
    CONFIG_DIR: __dirname + '/config',
    COMMAND_DIR: __dirname + '/commands'
});

接下来,使用以下命令启动应用程序:

node .

在Web或应用程序上登录到您的Slack团队。 该漫游器默认情况下被添加到#general频道,但是您可以使用Slash命令: /invite @<your-bot-name>邀请该漫游器进入任何频道,甚至是私有频道。 键入/invite @ ,Slack应该会自动建议您使用用户名。 如果没有在此处列出您的机器人,请返回并检查是否已正确集成了该机器人。

Invite Bot

在频道中输入helphalp (别名,还记得吗?),然后输入“ voila!”,机器人应响应您的请求。 继续并使用commands/help.js来更改您在响应中看到的内容。 从实现中可以看到,该命令只是从config/commands.json文件中加载命令详细信息以进行响应,因此它是同步的。 有时,您可能需要执行异步任务,例如查询数据库或调用REST端点,以获取响应。 让我们看看如何解决。

如前所述,我使用request模块进行REST调用,以下代码段(gem命令)搜索用户在Slack中键入的gem名称。 看看commands/gem.js ,您会发现它记住了消息发布的渠道(使用闭包 ),并将响应发布回了同一渠道!

var request = require('request'),
    util    = require('../util');

module.exports = function (param) {
    var channel  = param.channel,
        endpoint = param.commandConfig.endpoint.replace('{gem}', param.args[0]);

    request(endpoint, function (err, response, body) {
        var info = [];

        if (!err && response.statusCode === 200) {
            body = JSON.parse(body);

            info.push('Gem: ' + body.name + ' - ' + body.info);
            info.push('Authors: ' + body.authors);
            info.push('Project URI: ' + body.project_uri);
        }
        else {
            info = ['No such gem found!'];
        }

        util.postMessage(channel, info.join('\n\n'));
    });

};

尝试在您的Slack频道中输入gem ab ,您应该看到类似以下内容:

Gem Response

再次尝试在commands/gem.js尝试处理响应的格式,以解决问题。 现在,我们有了一个机器人,可以监听邀请频道并响应我们的请求。 让我们看看如何添加自定义命令。

添加自定义命令实现

config/commands.json添加新config/commands.json 。 如前所述,键将是主要命令名称。 该命令的别名作为alias中的值数组进入,如下所示。

{
    "your-new-command": {
        "alias": [ "command-alias", "another-alias", "yet-another-alias" ],
        "help": "A short help message for the awesome new command",
        "description": "Brief description of what the command does"
    }
}

当前, 支持带有空格的命令名称。 在commands/目录中创建一个与上面命令的主要名称相同的文件(在本例中为your-command-name.js )。 将module.exports分配给命令实现功能,如下所示。

var util = require('../util');

module.exports = function (param) {
    // param object contains the following keys:
    // 1. command - the primary command name
    // 2. args - an array of strings, which is user's message posted in the channel, separated by space
    // 3. user - Slack client user id
    // 4. channel - Slack client channel id
    // 5. commandConfig - the json object for this command from config/commands.json

    // implement your logic here.. 
    // .. 

    // send back the response
    // more on this method here: https://api.slack.com/methods/chat.postMessage
    util.postMessage(param.channel, '<your-message-to-be-posted-back-in-the-channel>');
};

有关UserChannel对象的更多信息,请参考node-slack-client的文档

编写新命令,重新启动应用程序即可! 您应该使新命令起作用。 输入命令,看看是否能得到预期的响应。

使用配置自定义行为

slack-terminalize模块采用两个参数,一个选项对象和一个配置对象。

var slackTerminal = require('slack-terminalize');

slackTerminal.init({
    autoReconnect: true // or false, indicates if it should re-connect after error response from Slack
    // other supported options can be seen here: https://github.com/slackhq/node-slack-client/blob/master/lib/clients/rtm/client.js
}, {
    CONFIG_DIR: __dirname + '/config',
    COMMAND_DIR: __dirname + '/commands',
    ERROR_COMMAND: "error" // The filename it looks for in COMMAND_DIR, in case the user entered command is invalid
})

有关参数的更多信息,可以在此处查看文档。

接下来是什么?

  • 去为您的团队定义一些很酷的命令:玩得开心,提高生产力。
  • 分叉项目slack-terminalize及其示例应用程序 。 游玩,贡献并帮助改善它。 如果发现任何错误,请在存储库上创建一个问题!
  • 下面评论您如何使用Slack来提高生产力,或者对如何改进它有任何建议。 我很想学习Slack API赋予开发人员力量的创造性应用程序

链接与资源

From: https://www.sitepoint.com/custom-slackbot-with-node/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值