来自Slack的POST(用于按钮交互)的正文为空

时间:2019-06-13 14:56:42

标签: node.js slack-api

我正在使用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));
});

1 个答案:

答案 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
        }