Слабое интерактивное сообщение, возвращающее invalid_payload для response_url, отправленного обратно - PullRequest
0 голосов
/ 28 марта 2020

Я немного поработал с Slack API и с интерактивными сообщениями

. Я отправляю сообщение с вложенным интерактивным сообщением здесь:

export const postMessage = (msg, channel) => {
    request({
      method: 'POST',
      uri: 'https://slack.com/api/chat.postMessage',
      headers: {
        'content-type': 'application/json;charset=UTF-8',
        Authorization: `Bearer ${process.env.SLACKTOKEN}`,
      },
      body: JSON.stringify({
        token: process.env.SLACKTOKEN,
        attachments: [
          {
              "text": "",
              "fallback": "If you could read this message, you'd be choosing something fun to do right now.",
              "color": "#3AA3E3",
              "attachment_type": "default",
              "callback_id": "command_selection",
              "actions": [
                  {
                      "name": "command_list",
                      "text": "Choose a command",
                      "type": "select",
                      "options": [
                          {
                              "text": "Register Team",
                              "value": "registerTeam"
                          },
                          {
                              "text": "Edit Team",
                              "value": "editTeam"
                          },
                          {
                              "text": "Get By Url",
                              "value": "getByUrl"
                          },
                          {
                              "text": "Report Issue",
                              "value": "reportIssue"
                          },
                          {
                              "text": "Find Team",
                              "value": "findTeam"
                          },
                          {
                              "text": "List Teams",
                              "value": "listTeams"
                          }
                      ]
                  }
              ]
          }
      ],
        text: msg,
        channel,
        as_user: true,
      })
    }, (err, res, body) => {
      if (err) {
        console.log('error posting msg: ', err);
      } else {
        console.log('post message to channel: ', body);
      }
    })
  }

Slack затем отправляет запрос POST на этот URL с параметром response_url в их полезной нагрузке. Вот откуда я получаю полезную нагрузку в своем коде:

    api.post('/interactivity', (req, res) => {
        const { body } = req;
        const { payload } = body;
        const parsedPayload = JSON.parse(payload)
        res.send(parsedPayload.response_url)
        var message = {
            "text": payload.user.name+" clicked: "+payload.actions[0].name,
            "replace_original": false,
        }
        util.sendMessageToSlackResponseURL(parsedPayload.response_url, message)
    })
  export const sendMessageToSlackResponseURL = (responseURL, JSONmessage) => {
    var postOptions = {
        uri: responseURL,
        method: 'POST',
        headers: {
            'content-type': 'application/json'
        },
        json: JSONmessage
    }
    request(postOptions, (error, res, body) => {
        if (error){
            console.log(error)
        } else {
          console.log('post message to channel: ', body);
        }
    })
}

По какой-то причине, response_url выдает ошибку invalid_payload, когда я нажимаю на ссылку и не могу понять если это полезная нагрузка, которую я отправляю в исходном сообщении, которое я отправил, или что-то не так с запросом POST, который отправил Slack

1 Ответ

0 голосов
/ 31 марта 2020

Проблема связана со служебным методом в строке json: JSONmessage, который должен быть body: JSONmessage

Обновлен код,

  export const sendMessageToSlackResponseURL = (responseURL, JSONmessage) => {
    var postOptions = {
        uri: responseURL,
        method: 'POST',
        headers: {
            'content-type': 'application/json'
        },
        body: JSONmessage
    }
    request(postOptions, (error, res, body) => {
        if (error){
            console.log(error)
        } else {
          console.log('post message to channel: ', body);
        }
    })
}

Надеюсь, это работает!

...