POST от Slack для взаимодействия кнопок имеет пустое тело - PullRequest
1 голос
/ 13 июня 2019

Я устанавливаю бот Slack, используя node.js. Система событий работает отлично и дает мне POST с действительными телами из Slack, и я могу успешно отправлять сообщения (как интерактивные, так и нет) в Slack.

Однако, POSTs Slack отправляет мне в ответ на взаимодействие с кнопками на интерактивных сообщениях пустое тело. Интересно, что заголовки Slack все еще хорошо сформированы, хотя он не проходит секретный тест подписи (который, как я знаю, я реализовал правильно, так как события POST из Slack проходят его).

Я настроил все для взаимодействий в соответствии с собственной документацией Слэка: https://api.slack.com/messaging/interactivity/enabling. Я использую экспресс, запрос и 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 Ответ

1 голос
/ 15 июня 2019

Документация 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

Запрос будет отправлен по указанному вами URL-адресу запроса HTTP POST. Тело этого запроса будет содержать параметр полезной нагрузки. Ваше приложение должно проанализировать этот параметр полезной нагрузки как JSON.

Итак, ваш код захочет сделать что-то вроде этого:

var slack_payload = JSON.parse(req.body.payload);
var payload = {
            "channel": slack_payload.channel,
            "text": "Selected choice " + slack_payload.actions.text.text
        }
...