【问题标题】:Slack API call to postMessage not working对 postMessage 的 Slack API 调用不起作用
【发布时间】:2019-07-14 14:09:15
【问题描述】:

我只是想从一个附有图片的谷歌应用程序脚本中进行一个简单的 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】:

    问题

    您正在发送一个JSON 对象作为您的POST 请求的有效负载,而fetch() 方法的contentType 参数默认为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 (Slack API);

    【讨论】:

    • 解决方案 1 不起作用,但解决方案 2 成功了!谢谢。
    • 嗨,@Slims!很高兴它起作用了(事实上,Slack 甚至建议您始终使用 application/json)。至于 URL 编码,似乎它应该可以工作,我会检查有什么问题,如果我发现任何东西会更新答案
    • @Slims,我的错,我忘记了 fetch() 方法不需要对作为有效负载传递的对象进行额外修改(我想它自己执行) - 只需按原样传递有效的 JSON,你应该没问题(尽管application/json 内容类型仍然更可取)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 2018-04-16
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    相关资源
    最近更新 更多