来自 Slack 的按钮交互的 POST 有空的正文

ele*_*eep 4 node.js slack-api

我正在使用 node.js 设置一个 Slack 机器人。事件系统运行良好,并为我提供了来自 Slack 的带有有效正文的 POST,并且我能够成功地向 Slack 发送消息(包括交互式消息和非交互式消息)。

但是,Slack 为响应与交互式消息上的按钮交互而发送给我的 POST 具有空正文。有趣的是,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));
});
Run Code Online (Sandbox Code Playgroud)

小智 11

Slack 文档似乎没有提到这一点,但从经验来看,应用程序的 webhook 调用的内容类型似乎使用Content-Type: application/x-www-form-urlencoded. 您需要添加:

app.use(bodyParser.urlencoded({ extended: true }));
Run Code Online (Sandbox Code Playgroud)

此外,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
        }
Run Code Online (Sandbox Code Playgroud)