Edited at

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

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

https://api.slack.com/events-api#subscriptions

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

https://api.slack.com/docs/message-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 だが、非推奨らしい。事情は特に知らないが、気持ちは分からなくもない

https://api.slack.com/custom-integrations/outgoing-webhooks

function doPost(e) {

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

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