Slack Bots入门

Slack是一种鼓励团队成员之间更好地沟通的流行工具。 它带有许多有用的功能和服务,包括第三方集成和webhook支持。 轻松的Webhook既有趣又有用,而且易于设置。 在本教程中,我们将使用Node.jsHeroku设置一个简单的服务器,该服务器将作为“机器人”响应来自Slack的团队消息。 熟悉JavaScript和Git会有所帮助。 如果您以前从未使用过Git,请参阅Git入门指南 。 还假定可以访问Slack帐户,但是不用担心-它们是免费的!

创建一个新的Slack集成

在Slack网络界面中,打开团队名称旁边左上角的菜单,然后选择配置集成 。 在这里,您可以看到包含所有可用集成的仪表板。 滚动到“ DIY集成和自定义”下的最底端,然后添加“ 传出WebHook” 。 阅读简短说明,然后单击“ 添加传出WebHooks集成”

DIY集成和自定义

您将看到Outgoing WebHook配置以及请求和响应有效负载应为什么样的示例。 我们的第一个漫游器在被调用时只会向用户打招呼。 为此,我们将允许挂钩在任何通道上侦听触发词“ hello”。 我们尚不知道它将发布到的URL,因此稍后我们将返回此页面。

创建一个Web服务器

我们将在Node.js上使用Express 4来构建简单的Web服务器。

为您的应用程序创建一个新目录,然后运行npm init生成package.json文件。 在package.json依赖项中,包括"express": "^4.xx""body-parser": "^1.xx"body-parser包将用于解析从Slack发送的有效负载。 创建名为app.js的服务器文件。 在这里,我们将require必要的模块,添加主体解析器中间件,错误处理程序和测试路径。 然后,我们告诉服务器开始监听。

var express = require('express');
var bodyParser = require('body-parser');

var app = express();
var port = process.env.PORT || 3000;

// body parser middleware
app.use(bodyParser.urlencoded({ extended: true }));

// test route
app.get('/', function (req, res) { res.status(200).send('Hello world!') });

// error handler
app.use(function (err, req, res, next) {
  console.error(err.stack);
  res.status(400).send(err.message);
});

app.listen(port, function () {
  console.log('Slack bot listening on port ' + port);
});

使用node app运行服务器,并验证访问的http://localhost:3000是否响应“ Hello world!”。

编写机器人逻辑

创建一个名为hellobot.js的文件

该模块将是我们的机器人逻辑所在的地方。 它将包括一个导出的函数,该函数会将状态代码200返回到Slack消息。 我们将从解析Slack发送到我们的服务器的数据开始,然后我们将使用自己正确格式化的有效负载进行响应。 为此,让我们重新访问“已配置的集成”下的“传出WebHook”。 传出数据示例向我们展示了触发传出WebHook时Slack发送的所有信息。

传出WebHook数据示例

您会看到其中一些数据对于身份验证或路由很有用,但现在我们仅关注user_name属性。 使用此值,我们可以向用户发送个性化的问候。

module.exports = function (req, res, next) {
  var userName = req.body.user_name;
  var botPayload = {
    text : 'Hello, ' + userName + '!'
  };

  // avoid infinite loop
  if (userName !== 'slackbot') {
    return res.status(200).json(botPayload);
  } else {
    return res.status(200).end();
  }
}

在这里,我们创建botPayload对象。 唯一必要的属性是botPayload.text ,它定义了我们的机器人在响应时将显示的内容。 向用户添加带有问候语的text属性,并使用JSON和状态码200响应。 请注意,我们的漫游器的响应是“传出WebHook”的触发词! 为了避免无限循环,我们可以检查主体的user_name 。 即使该名称在聊天中的显示方式有所不同,所有钩子都将发布为“ slackbot”。 我们可以利用这一事实来防止我们对自身做出回应。

返回app.js ,在顶部需要bot模块。

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

然后,将一个侦听POST的路由添加到/hello

app.post('/hello', hellobot);

让我们做一个快速测试。 使用node app app再次运行该应用node app ,并在另一个终端窗口中使用curl确保应用程序响应我们期望的响应。 (注意:由于我们的机器人仅在此处寻找一个值,因此无需在测试中包含整个Slack有效负载)。

curl -X POST --data "user_name=foobar" http://localhost:3000/hello

如果我们的应用正常运行,我们应该看到如下所示的响应:

{"text":"Hello, foobar!"}

现在,是时候让我们的机器人在线了。

在Heroku上部署应用程序

Heroku是一项便捷的服务,可帮助您在极短的时间内免费使Web服务器联机。 部署是通过将代码推送到其git服务器进行自动部署和运行的。 在Heroku上创建一个帐户,或者如果已经有一个帐户,则登录。

登录后,您将看到Heroku仪表板。 点击右上角的+ ,以创建一个新应用。 按照提供的说明在计算机上登录Heroku。 部署很容易,但是第一次部署应用程序时要了解很多。 在设置应用程序时,请确保遵循本指南 。 我们将在此过程中进行一些双重检查,但是其中有很多很好的信息,这不在本文的讨论范围之内。

在部署我们的机器人之前,我们需要告诉Heroku如何运行该应用程序。 这是通过创建Procfile完成的。 您的Procfile只需要一行:

web: node app

完成此操作后,您可以提交更改并推送到heroku 。 Heroku自动安装节点模块,您将看到部署结果。 如果一切顺利,您将在底部看到一个指向您应用程序的链接。 复制该URL,然后再次访问“外发WebHook”的配置页面。 将您复制的URL添加到附加了/hello路由的URL输入字段中,并根据需要修改该钩子的名称和图标。

传出的WebHook URL

使该僵尸程序在线还有另外一步:我们需要给它一个Dyno 。 在终端中,输入:

heroku ps:scale web=1

这告诉Heroku为您的应用提供一名网络工作者。 小心; 您的应用每月只能获得一次免费的测功机!

您的机器人现在应该在线,因此请回到Slack并对其进行测试!

Hellobot回应

如果未收到响应,请返回并检查您的代码。 您可以使用终端命令heroku logs查看有关请求的详细信息以及已添加的任何console.log()语句。

不太困难,不是吗? 我们在Slack上成功建立了一个Webhook,将我们的应用程序部署到了Heroku,并使两者相互交流! 比简单的“ hello world”程序要多做一些工作,但会带来更多收益。 现在我们已经运行了服务器,我们可以轻松添加更多的挂钩和响应。 Hellobot非常友好,但是它没什么用。 在下一节中,我们将使用Slack的其他webhook类型创建骰子聊天命令。

DiceBot –使用Slack命令和传入的WebHooks

在上一部分中,我们使用了传出WebHook,该WebHook侦听聊天以获取触发词,将消息发送到我们的服务器,并显示响应。 在本节中,我们将使用其他两个工具来创建自定义集成: Slash CommandsIncoming WebHooks 。 访问“ 配置集成”页面,并查看“ DIY集成和自定义”下的其他选项。 让我们从添加Slash Commands集成开始。 阅读简短描述,将命令设置为“ / roll”,然后添加集成。 下一页显示配置。 您可以看到“传出数据”看起来与我们之前配置的“传出WebHook”相似。 我们将使用在本节最后一节中创建的应用程序,所以我们可以使用相同的URL,但这次我们将POST到路由/roll

请注意,Slash Command集成可以响应用户,但只能私下响应。 如果您只能看到骰子,骰子掷骰子有什么用? Slack建议将“传入的WebHook”与Slash Commands一起使用以发送消息进行聊天。 返回“ 配置集成”页面并添加一个传入WebHook 。 阅读说明,选择一个频道,然后添加挂钩。 不用担心您选择了哪个频道; 我们可以在漫游器的响应中指定渠道。 因为我们可以在应用程序中选择渠道,所以这意味着我们也可以将此集成用于我们创建的任何其他机器人。 传入的WebHook的配置方式不多,但确实有许多重要信息可用于构造我们的机器人的响应负载。 最重要的部分是Webhook URL 。 我们将POST荷兰国际集团这个从我们的应用程序,以便将消息发送到懈怠。

响应来自服务器的斜杠命令

由于我们已经将Slash命令指向了/roll路由,因此可以将该路由添加到hellobot旁边的服务器中。 我们将对传入的钩子使用秘密URL,因此,最好在公开代码时将其隐藏起来。 一个很好的方法是使用Heroku的config vars

让我们还将request添加到包中以与传入的钩子一起使用:

npm install --save request

现在,我们将添加dicebot.js 。 Dicebot将导出一个功能,但是我们将需要两个附加功能:一个功能用于POST到传入的WebHook,另一个功能用于掷骰子。

var request = require('request');

module.exports = function (req, res, next) {
};

function roll () {
}

function send () {
}

正如许多桌面游戏玩家所知,骰子的类型不仅限于六面骰子。 其他骰子有四个边,八个边,十个边,二十个边等等! 滚动这些骰子时使用一种特殊的符号: <number of dice>d<sides of dice> 。 因此,将两个六个六边形骰子滚动表示为“ 2d6”。 我们可以使用这种表示法让用户掷出多个骰子,但是我们必须检查用户输入是否正确。

让我们从初始化一些变量并解析输入开始。 如果用户希望省略输入,我们将设置一些默认值。

module.exports = function (req, res, next) {
  // default roll is 2d6
  var matches;
  var times = 2;
  var die = 6;
  var rolls = [];
  var total = 0;
  var botPayload = {};
  
  if (req.body.text) {
    // parse roll type if specified
    matches = req.body.text.match(/^(\d{1,2})d(\d{1,2})$/);

    if (matches && matches[1] && matches[2]) {
      times = matches[1];
      die = matches[2];
    } else {
      // send error message back to user if input is bad
      return res.status(200).send('<number>d<sides>');
    }
  } 
}

上面的正则表达式对于骰子掷骰非常可靠,并将值限制为两位数,这样用户就不会发疯。 如果用户搞砸了他们的语法,我们将向您发送提示。

用用户输入来掷骰子很容易。 有关随机滚动如何工作的说明,请参见此线程 。 对于真正的随机滚动,您可以联系random.org API 。 让我们编写roll函数。

function roll (min, max) {
  return Math.floor(Math.random() * (max - min + 1) + min);
}

然后,在我们的主要功能中,我们将进行一些滚动并构建一条消息进行响应。 让我们包括压路机的名称,以便其他用户可以看到谁使用了/roll命令。

// roll dice and sum
for (var i = 0; i < times; i++) {
  var currentRoll = roll(1, die);
  rolls.push(currentRoll);
  total += currentRoll;
}

// write response message and add to payload
botPayload.text = req.body.user_name + ' rolled ' + times + 'd' + die + ':\n' +
                          rolls.join(' + ') + ' = *' + total + '*';

我们将消息添加到botPayload.text属性中,并在total周围添加了一些Slack格式以使其变为粗体。 我们还可以使用响应有效负载配置名称,图标和通道。 我们将根据用户发出roll命令的渠道来设置渠道。 Slack建议在有效负载中使用通道的名称,但这意味着我们必须在其前面加上“#”。 相反,我们可以使用频道ID,这将使我们能够在公共频道和私人论坛中发布。 对于图标,可以使用方便的模具表情符号,尽管您可以使用icon_url提供更好的图像。

botPayload.username = 'dicebot';
botPayload.channel = req.body.channel_id;
botPayload.icon_emoji = ':game_die:';

有效负载看起来不错。 让我们编写send函数。 我选择仅将路径令牌存储在Heroku的配置变量中。 确保将正文作为JSON字符串发送。

function send (payload, callback) {
  var path = process.env.INCOMING_WEBHOOK_PATH;
  var uri = 'https://hooks.slack.com/services' + path;

  request({
    uri: uri,
    method: 'POST',
    body: JSON.stringify(payload)
  }, function (error, response, body) {
    if (error) {
      return callback(error);
    }

    callback(null, response.statusCode, body);
  });
}

在我们的主要功能中,我们将启动发送请求。 如果可行,我们可以用200来响应Slash命令。 如果没有,我们可以使用send()回调中的值生成错误。 这将触发app.js的错误处理程序并发送回400 ,这将通知用户错误。

// send dice roll
send(botPayload, function (error, status, body) {
  if (error) {
    return next(error);
  } else if (status !== 200) {
    // inform user that our Incoming WebHook failed
    return next(new Error('Incoming WebHook: ' + status + ' ' + body));
  } else {
    return res.status(200).end();
  }
});

让我们运行服务器并再次curl它。 这次,我们需要包含channel_id 。 您可以使用Slack API测试器找到正确的channel_id 。 由于已经设置了传入WebHook,它应该听到我们的服务器调用它。 由于该应用程序尚未在Heroku上,因此我们还需要在我们的环境中包括“传入WebHook”路径。

INCOMING_WEBHOOK_PATH=/your/path/tokens node app
curl -X POST --data "user_name=foobar&channel_id=C0123ABCD&text=4d6" http://localhost:3000/roll`

Dicebot回应

看起来不错! 让我们部署它。

重新部署到Heroku

由于我们使用了Heroku的配置变量来存储我们的Webhook令牌,因此请不要忘记在应用程序的“设置”菜单中进行设置

Heroku配置变量

然后使用git添加新文件,提交更改,然后推送到heroku遥控器。 Heroku将安装节点模块并启动服务器。 在测试之前,让我们开始实时查看日志:
heroku logs -t

设置好所有钩子之后,应该准备好执行roll命令。 尝试几卷! 如果某些操作不起作用,则可以使用Heroku日志进行调试。 要完整查看完整的应用程序,请查看此GitHub repo

持续发展

这两个机器人演示了开始编写自己的聊天机器人和集成所需的所有工具。 您可以将许多服务集成到bot中,也可以尝试成为令人信服的对话伙伴。 存在API和节点模块供您实现这两个目标。

机器人的其他一些想法:

  • 一个使用GitHub API向您显示打开请求请求的机器人
  • 使用Yelp API帮助您的团队决定午餐的机器人
  • Google搜索您的机器人
  • 只用流行语和专业术语与您对话的机器人

如果您提出了好主意,请共享您的代码! 机器人很有趣,而且创建起来从未如此简单。

From: https://www.sitepoint.com/getting-started-slack-bots/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值