Slack bot - 防止机器人回复每个传入的webhook

时间:2016-04-17 19:31:40

标签: node.js amazon-web-services lambda slack

我制作了一个Slack命令,允许用户代表其他人发帖...只是为了好玩。它是位于AWS Lambda中的节点功能。

输入/mybot danturcotte^ hello我进入Slack:

enter image description here

令人烦恼的是每次发帖,我的Slackbot," Dante",回复。

当我postToSlack时,我尝试了这两个选项,以确保我的机器人无法跟进松散的帖子:

1) context.succeed();

2) callback(error, null);

两种方式仍然让Dante回复null。我怎样才能简单地发布传入的webhook而不是其他任何东西(又名danturcotte说你好)?

AWS Lambda NodeJS代码段:

var AWS = require('aws-sdk');
var qs = require('querystring');
var request = require('request');

exports.handler = function (event, context, callback) {

    var params = qs.parse(event.postBody);

    var botPayload = {};
    botPayload.channel = params.channel_name;

    if (typeof params.text !== 'undefined') {

        botPayload.userToGet = params.text.split('^')[0];

        getUserData(botPayload, function (error, status, body) {

            var userDataArray = JSON.parse(body),
                profileFound = false;

            for (var i = 0; i < userDataArray.members.length; i++) {
                if (!profileFound) {
                    if (userDataArray.members[i].name === botPayload.userToGet) {
                        //set bot to user
                    }
                }
            }

            postToSlack(botPayload, function (error, status, body) {
                //context.succeed();
                callback(error, null);
            });
        });
    }
};


function getUserData (payload, callback) {
    request({
        uri: 'https://slack.com/api/users.list?token=mytoken',
        method: 'GET'
    }, function (error, response, body) {
        callback(error, response.statusCode, body);
    });
};

function postToSlack (payload, callback) {

    var incoming_webhook = 'https://hooks.slack.com/services/T02LHM7GA/B11BS608F';

    request({
        headers: {
            'content-type': 'application/json'
        },
        uri: incoming_webhook,
        body: JSON.stringify(payload),
        method: 'POST'
    }, function (error, response, body) {
        if (error) {
            return callback(error);
        }
        callback(null, response.statusCode, body);
    });
};

1 个答案:

答案 0 :(得分:4)

我认为只有Lambda和Slack这是可能的。 Slack slash command documentation说:

  

如果你的命令不需要发回任何东西(私下里)   或公开),回复一个空的HTTP 200响应。

因此,您的目标是让您的Lambda函数产生没有正文的HTTP响应。不幸的是,根据the AWS Lambda documentation for Node.js,所有HTTP响应看起来都是JSON:

  

提供的结果必须与JSON.stringify兼容。如果提供了错误,则忽略此参数。

     

如果您未在代码中使用回调,AWS Lambda将隐式调用它,返回值为null。

所以无论你做什么,你的函数都会用某种JSON响应,并且没有JSON你可以发送回Slack,这将导致没有显示消息。 (null将显示null,空字符串将返回""{"text": ""}会导致no_text错误。)

我相信您需要在AWS Lambda前面放置一些层,导致返回一个空体。听起来AWS API Gateway可能是这一层(见mapping templates),但我没有任何第一手经验。

<强>更新

看起来确实可以通过AWS API Gateway完成。我通过创建一个&#34; Body Mapping Template&#34;对于映射到application/json的{​​{1}}。这意味着您可以将空字符串($input.path('$'))传递给"",从而根本不会产生响应主体。 (如果想以某种方式回复,请确保返回一个字符串。)