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 入力されたテキスト
// など
}
}