LoginSignup
22
25

More than 5 years have passed since last update.

Google Apps Script で Slack からの投稿などを受け取る

Last updated at Posted at 2018-11-26

Slack の API ドキュメントはリクエストの情報は充実しているのだが、 Google Apps Script で受けてみようとするとなんか POST パラメータの受け取り型がよく分からず苦戦したので、まとめてみた

Slack 側の設定はもうやり方が思い出せないので特に書かない。Google Apps Script で POST リクエストを受け取る方法は、

この辺りを参考にしていただければと思います。

なお、例の中に出てくる TOKEN という変数は Slack 側で設定して取得したものを代入しておくこと(プロジェクトのプロパティに設定して取り出すなど)を想定してます。

Event API

Event API は、まず最初に、登録されたエンドポイントがきちんと動くよう実装されていることを確認するために verification が必要となる。

少し余談になるが、 permission の scope を変えた場合は Installed App Settings から Reinstall App をしないと反映されない。

verification

verification では、 challenge に入っている文字列をそのまま Output してあげればよい。

function doPost(e) {
  try {
    var json = JSON.parse(e.postData.getDataAsString());
    if (json.type == "url_verification" && json.token == TOKEN) {
      return ContentService.createTextOutput(json.challenge);
    }
  } catch (ex) {
  }
}

subscribe posted messages

https://api.slack.com/events/message.channels
https://api.slack.com/events/message.groups
https://api.slack.com/events/message.mpim
https://api.slack.com/events/message.im

発言を受け取るのは4つの event typeあるが、受け取るパラメータはほとんど同じ

function doPost(e) {
  try {
    var json = JSON.parse(e.postData.getDataAsString());

    if (json.type == "event_callback" && json.token == TOKEN && json.event.type == "message") {
      // 何かを実装する

      // channel, user は ID しかない
      // json.event.channel
      // json.event.user
      // json.event.text
    }
  } catch (ex) {
  }
}

Interactive messages

いくつかタイプあるけど、とりあえず menus についてだけ書く

menus

意外にもこれは e.postData ではない。

function doPost(e) {
  if (e.parameter.payload) {
    try {
      var json = JSON.parse(e.parameter.payload)
      if (TOKEN == json && json.type == "interactive_message") {
        var return_text = "";
        // 何かを実装する
        // 
        // json.channel.name チャンネル名
        // json.user.name ユーザー名
        // json.actions[0].selected_options[0].value 選択された値

        // 何かを返さないと、タイムアウトのエラーが出てしまう
        return ContentService.createTextOutput(return_text);
      }
    } catch (ex) {
    }
  }
}

Outgoing Webhook

何かと便利な Outgoing Webhook だが、非推奨らしい。事情は特に知らないが、気持ちは分からなくもない

function doPost(e) {
  if (TOKEN == e.parameter.token) {
    // 何かを実装する

    // e.parameter.channel_name チャンネル名
    // e.parameter.user_name ユーザー名
    // e.parameter.text 入力されたテキスト
    // など
  }
}
22
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
25