对postMessage的Slack API调用不起作用

问题描述 投票:1回答:1

我只是试图从带有图像的google apps脚本中进行一个简单的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明显不正确,并删除/添加随机参数,并且每次给出的响应都相同。

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

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

chat:write:bot

incoming-webhook
google-apps-script slack-api urlfetch
1个回答
3
投票

问题

您正在将JSON对象作为有效载荷与POST请求一起发送,而contentType方法的fetch()参数默认为application/x-www-form-urlencoded

解决方案1

除了JSON.stringify(),要确保有效载荷已正确发送,请将其包装在encodeURIComponent()内置函数中。如果问题仍然存在,请继续解决方案2。

更新为解决方案1

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

解决方案2

Slack API支持POST请求的application/json内容类型。在您的情况下,将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);
© www.soinside.com 2019 - 2024. All rights reserved.