Slack API 对 postMessage 的调用不起作用

Slack API call to postMessage not working

我只是想从带有附加图像的 google 应用程序脚本进行简单的 postMessage 调用,但我得到以下响应:

"{"ok":false,"error":"invalid_arg_name"}"

这是创建有效负载的函数:

function getPostMessagePayload(fileUrl) {
  var content = {
    "channel":"#data-vis",
    "token": ACCESS_TOKEN,
    "text":"Chart update:",
    "attachments": [
      {
        "title": "Chart",
        "fallback": "Fallback",
        "text": "Testing chart",
        "image_url": fileUrl
      }
    ]
  };
  return content;
}

这里是我提出请求的地方:

var POST_MESSAGE_ENDPOINT = 'https://slack.com/api/chat.postMessage';

function performPostMessage(payload) {
  var res = UrlFetchApp.fetch(
    POST_MESSAGE_ENDPOINT,
    {
      method: "post",
      payload: JSON.stringify(payload),
      muteHttpExceptions: true,
    }).getContentText();
  return res;
}

无法判断实际问题是什么。我试过让我的令牌明显不正确,URL 显然不正确,并且 deleting/adding 随机参数每次都给出相同的响应。

当我使用 webhook 而不是 API 执行此操作时,它工作正常。

我的应用程序在 Slack 中具有以下权限:

chat:write:bot

incoming-webhook

问题

您在 POST 请求中发送一个 JSON 对象作为负载,而 fetch() 方法的 contentType 参数默认为 application/x-www-form-urlencoded .

解决方案 1

除了 JSON.stringify() 之外,为确保正确发送有效负载,将其包装在 encodeURIComponent() built-in 函数中。如果问题仍然存在,请继续执行解决方案 2。

更新解决方案 1

差点忘记 fetch() 方法如何处理传递给具有默认 x-www-form-urlencoded 内容类型的负载的对象。 完全删除 JSON.stringify()(并在需要时添加 encodeURI() / encodeURIComponent())。

解决方案 2

Slack API 支持 application/json 内容类型的 POST 请求。在您的情况下,将 contentType 参数设置为 application.json 发送请求可能更容易(请注意,您必须将授权从有效负载移至 headers):

//fetch part;
var res = UrlFetchApp.fetch(
POST_MESSAGE_ENDPOINT,
{
  method             : 'post',
  contentType        : 'application/json',
  headers            : {
    Authorization : 'Bearer ' + ACCESS_TOKEN
  },
  payload            : JSON.stringify(payload),
  muteHttpExceptions : true,
})

//payload part;
var payload = {
  "channel"     : "#data-vis",
  "text"        : "Chart update:",
  "attachments" : [
    {
      "title"     : "Chart",
      "fallback"  : "Fallback",
      "text"      : "Testing chart",
      "image_url" : fileUrl
    }
  ]      
};

有用链接

  1. fetch()方法reference;
  2. postMessage 方法 reference (Slack API);