我制作了一个Slack命令,允许用户代表其他人发帖...只是为了好玩。它是位于AWS Lambda中的节点功能。
输入/mybot danturcotte^ hello
我进入Slack:
令人烦恼的是每次发帖,我的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);
});
};
答案 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('$')
)传递给""
,从而根本不会产生响应主体。 (如果做想以某种方式回复,请确保返回一个字符串。)