我正在使用node.js设置一个Slack机器人。事件系统运行良好,并为我提供了来自Slack的具有有效正文的POST,并且我能够成功地向Slack发送消息(包括交互性消息和非交互性消息)。
但是,响应与交互式消息上的按钮的交互,POST Slack发送给我的消息为空。有趣的是,Slack标头仍然格式正确,尽管它未能通过签名秘密测试(我知道我已经正确实现了,因为来自Slack的事件POST通过了它)。
我已经根据Slack自己的文档https://api.slack.com/messaging/interactivity/enabling在交互中设置了所有内容。我正在使用express,request和XMLHttpRequest来接收和发送HTTP方法。如果有人遇到此问题或有任何见解,那将是很好的。谢谢!
这是我的函数从交互中接收POST的代码段:
var express = require('express');
var request = require('request');
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.json());
app.post('/interaction', (req, res) => {
res.sendStatus(200);
var payload = {
"channel": req.body.payload.channel, // Breaks here since req.body is empty
"text": "Selected choice " + req.body.payload.actions.text.text
}
var r = new XMLHttpRequest();
r.onload = () => { var status = request.status; var data = request.responseText; }
r.open("POST", request_url, true);
r.setRequestHeader("Content-Type", "application/json");
r.setRequestHeader("Authorization", "Bearer " + botToken);
r.send(JSON.stringify(payload));
});
答案 0 :(得分:1)
Slack文档似乎没有提到这一点,但从经验上看,似乎对应用程序进行Webhook调用的内容类型使用Content-Type: application/x-www-form-urlencoded
。您将要添加:
app.use(bodyParser.urlencoded({ extended: true }));
此外,在执行操作时无法访问payload
参数:它实际上是序列化为字符串的JSON对象。在此处记录:https://api.slack.com/messaging/interactivity/enabling#understanding_payloads
该请求将通过HTTP POST发送到您指定的请求URL。该请求的主体将包含有效负载参数。您的应用程序应将此有效负载参数解析为JSON。
所以您的代码将要执行以下操作:
var slack_payload = JSON.parse(req.body.payload);
var payload = {
"channel": slack_payload.channel,
"text": "Selected choice " + slack_payload.actions.text.text
}