【问题标题】:Slack API chat.update returns 'not_authed' errorSlack API chat.update 返回“not_authed”错误
【发布时间】:2016-12-06 02:26:32
【问题描述】:

我有一个 google 脚本 作为 webapp 运行来处理 slack 应用程序 的后端。

该应用程序已验证,我有来自此的 OAUTH 令牌

我目前可以使用上述 token 使用 chat.postMessage 通过按钮操作向频道发帖。

Actions url 指向我的 webapp 并通过 doGet 连接,从这个响应中我构造了一个 JSON 对象。

var response_payload = {
    "token" : access_token,
    "ts" : message_ts,
    "channel" : channel_id,
    "text" : "Approved! you are a winner!"
  })

response_url = "https://slack.com/api/chat.update";

sendToSlack_(response_url, response_payload)

通过以下功能发布:

function sendToSlack_(url,payload) {
   var options =  {
    "method" : "post",
    "contentType" : "application/json;charset=iso-8859-1",
    "payload" : JSON.stringify(payload)
  };
  return UrlFetchApp.fetch(url, options)
}

然而返回的是以下内容:

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

除了以下内容之外,我找不到任何关于此错误的文档

Sending JSON to Slack in a HTTP POST request

但是,这是关于我的实现中正常工作的 chat.postMessage 请求。

【问题讨论】:

  • 能否提供您的html源代码?
  • 这都是在谷歌脚本(javaScript)中完成的,没有html..
  • 这个项目是一个类似斜杠命令的 webhook 吗?此代码存在一些问题,例如您使用的是 POST 而不是 GET。参数在 url 中发送,而不是在帖子正文中。但是,如果这是从 doGet 调用的 webhook,您将验证 webhook 请求令牌,然后使用 json 对象通过内容服务响应响应。如果这就是你想要做的,我有一个例子。
  • 不,我有一个具有 chat:write:bot scope 的应用程序集成,虽然它确实有一个钩子,但我没有使用它,而是指导您的 chat.postMessagechat.update。有趣的是,整个事情现在似乎正在工作..我即将发布关于此的更新..
  • 对于任何类型的令牌,目前只有application/x-www-form-urlencoded 可以正常工作。

标签: json google-apps-script slack-api


【解决方案1】:

如果使用application/json,则需要将令牌放入标头而不是 json 有效负载。这是doc

所以你的请求应该是这样的:

POST /api/chat.update HTTP/1.1
Authorization: Bearer xoxp-xxx-xxx-xxx-xxx
Content-Type: application/json;charset=UTF-8

{
    "channel": "xxx",
    "text": "Hello ~World~ Welt",
    "ts": "xxx"
}

注意:payload 中没有token 字段。

【讨论】:

【解决方案2】:

根据您提供的链接,Slack 不接受 JSON 数据(奇怪)。

此外,在与他们的测试人员玩耍之后,Slack 似乎正在对https://slack.com/api/chat.update 执行GET 请求,并附有如下查询参数:

https://slack.com/api/chat.update?token=YOUR_TOKEN&ts=YOUR_TIME&channel=YOUR_CHANNEL&text=YOUR_TEXT_URL_ENCODED&pretty=1

所以使用这个代码:

var response_payload = {
    "token" : access_token,
    "ts" : message_ts,
    "channel" : channel_id,
    "text" : "Approved! you are a winner!"
  }


function httpGet(theUrl)
{
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open( "GET", theUrl, false ); // false for synchronous request
    xmlHttp.send( null );
    return xmlHttp.responseText;
}

response_url = encodeURI("https://slack.com/api/chat.update?token=" + response_payload['token'] + 
"&ts=" + response_payload['ts'] + "&channel=" + response_payload['channel'] + "&text=" + response_payload['text'] +"&pretty=1");

httpGet(response_url);

【讨论】:

  • 谢谢你..我尝试了这个并对其进行了修改,但没有得到任何地方..在发布关于它的 slack 之后神秘地..我的原始脚本开始工作..
  • 啊,非常非常奇怪。我相信 Slack 团队正在支持 json 数据,可能听到了!
  • 是的兄弟..我不知道..他们说他们不知道..但突然之间它有点工作..我觉得他们的 API 文档不是很好完全
【解决方案3】:

好的!谢谢大家的意见。当然我学到了更多。在 slack_api 发布推文后,我的原始代码或多或少按原样工作。我必须 JSON.parse(payload); 有效负载才能访问其中的对象参数。完整示例如下。

function post_update(url, payload) {
  var options =
  {
    'method': 'post',
    "payload" : payload,
  };

  var result = UrlFetchApp.fetch(url, options);
  return result.getContentText();
}

function doPost(e) {
  var payload = e.parameter.payload;
  var json = JSON.parse(payload);

  response_url = "https://slack.com/api/chat.update";

  // get object elements
  var action = json.actions[0].value;
  var user = json["user"].name;
  var message_ts = json["message_ts"];
  var channel_id = json["channel"].id;

  if (action == 'approved') // payload if action is 'approved'
  {
    var response_payload = {
      "token" : access_token,
      "ts" : message_ts,
      "channel" : channel_id,
      "text" : "Approved! *" + invitation_name + "* has been sent an invite!",
      "attachments" : JSON.stringify([{
          "text": ":white_check_mark: Approved by @" + user,
           }])
      }
  }

  if (action == 'denied') // payload if action is 'denied'
  {
    var response_payload = {
      "token" : access_token,
      "ts" : message_ts,
      "channel" : channel_id,
      "text" : "Denied. *" + invitation_name + "* has been declined an invite",
      "attachments" :JSON.stringify([{
          "text": ":exclamation: Declined by @" + user,
          }])
    }
  }

  post_update(response_url, response_payload);
  return ContentService.createTextOutput().setMimeType(ContentService.MimeType.JSON);

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 2020-08-15
    • 2019-01-04
    相关资源
    最近更新 更多