web-dev-qa-db-ja.com

Slack APIchat.updateが「not_authed」エラーを返す

google script webapp として実行して、 slack app のバックエンドを処理しています。 。

アプリは Authenticated であり、これからOAUTH tokenです。

現在、chat.postMessage前述のtoken .を使用して、ボタンアクションでチャンネルに投稿できます。

アクション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"}

以下以外に、このエラーに関するドキュメントが見つかりません

HTTPでSlackにJSONを送信POSTリクエスト

ただし、これは、私の実装で正しく機能しているchat.postMessageリクエストに関するものです。

8
Jamie

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);

}
0
Jamie

提供されたリンクによると、SlackはJSONデータを受け入れません(奇妙な)。

また、テスターで遊んだ後、Slackは次のようにクエリパラメーターを添付してhttps://slack.com/api/chat.updateGETリクエストを実行しているようです。

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);
1
Apoorv Kansal

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

注:ペイロードにはtokenフィールドはありません。

0
Walery Strauch