Slack API chat.update возвращает ошибку not_authed

У меня есть скрипт Google, работающий как webapp для обработки серверной части Slack-приложения.

Приложение было аутентифицировано, и у меня есть токен OAUTH.

В настоящее время я могу публиковать сообщения на канале с помощью кнопок, используя chat.postMessage, используя вышеупомянутый токен.

URL-адрес действий указывает на мое веб-приложение и подключается через 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"}

Я не могу найти никакой документации об этой ошибке, кроме следующей

Отправка JSON в Slack в запросе HTTP POST

Однако это относится к запросу chat.postMessage, который в моей реализации работает правильно.


person Jamie    schedule 06.12.2016    source источник
comment
Не могли бы вы предоставить свой исходный HTML-код?   -  person Apoorv Kansal    schedule 06.12.2016
comment
это все делается в гугл скрипте (javaScript) там нет html ..   -  person Jamie    schedule 06.12.2016
comment
Является ли этот проект веб-перехватчиком для чего-то вроде команды косой черты? Есть несколько проблем с этим кодом, например, вы используете POST вместо GET. Параметры отправляются в URL-адресе, а не в теле сообщения. НО, если это веб-перехватчик, вызываемый из doGet, вы собираетесь проверить токен запросов веб-перехватчика, а затем в ответ ответите с помощью службы содержимого VIA объекта json. У меня есть пример, если это то, что вы пытаетесь сделать.   -  person Spencer Easton    schedule 06.12.2016
comment
Нет, у меня есть интеграция приложений с chat:write:bot областью действия, и хотя она имеет крючком я не пользуюсь, а вместо этого направляю ваши chat.postMessage и chat.update. Как ни странно, сейчас все вроде работает .. Я собираюсь опубликовать обновление об этом ..   -  person Jamie    schedule 08.12.2016
comment
В настоящее время с любым типом токена нормально работает только application/x-www-form-urlencoded.   -  person Ivan Didur    schedule 30.06.2018


Ответы (3)


Вам нужно поместить токен в заголовок вместо полезной нагрузки json, если вы используете application/json. Вот документ для этого.

Итак, ваш запрос должен выглядеть так:

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"
}

Примечание: в полезной нагрузке нет поля token.

person Walery Strauch    schedule 26.10.2018
comment
Это помогло, в итоге я нашел этот api.slack.com/web#slack-web -api__basics__post-body для дальнейшей проверки. - person Leo Fisher; 11.02.2021

Согласно предоставленной вами ссылке, Slack не принимает данные JSON (странно).

Кроме того, поигравшись со своим тестером, Slack, похоже, выполняет GET запрос на https://slack.com/api/chat.update с параметрами запроса, прикрепленными следующим образом:

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);
person Apoorv Kansal    schedule 06.12.2016
comment
Спасибо за это ... Я попробовал это и его модификации, но не получил ни чего ... таинственным образом после того, как написал в Slack об этом в Твиттере ... мой оригинальный скрипт начал работать .. - person Jamie; 08.12.2016
comment
Ах да, очень-очень странно. Я считаю, что команда Slack занимается поддержкой данных json и, вероятно, вас слышала! - person Apoorv Kansal; 08.12.2016
comment
Да, братан ... я не знаю ... они сказали, что нет ... но внезапно это вроде работает ... Я не считаю их документацию по API очень хорошей - person Jamie; 08.12.2016

Ok! спасибо всем за ваш вклад .. конечно, я узнал немного больше. После твита на 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);

}
person Jamie    schedule 07.12.2016