从Google Apps脚本无法对PostMessage进行松弛API调用

时间:2019-07-14 14:09:15

标签: google-apps-script slack-api

我只是想从带有图像的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

1 个答案:

答案 0 :(得分:3)

问题

您将通过POST请求发送一个JSON对象作为有效负载,而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支持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(松弛API);