見出し画像

Slack Event SubscriptionsでGAS実行


Introduce: 非奨励になったOutgoing Webhook機能

元々Slackには特定のキーワードが含まれるメッセージ送信をトリガーにして、自作のプログラムを動かすための機能として、Outgoing Whebookとい機能があったのだが、この機能は現在では非奨励の方法となっており、いつ消えてもおかしくない機能になってしまっている。

では、現在はどうやってSlack側で発火されたイベント(特定のチャンネルにメッセージが送信されたなど)をトリガーにして、Google Apps Scriptや自作のアプリケーションを起動するか?ということになってくる。

それがEvent Subscriptionsで、この機能はOutgoing Webhookの代替として存在している機能。チャンネルへの投稿だけでなく投稿の編集や削除、スレッドの開始などもあらかた拾ってくる機能になっていて、「とりあえず発生したイベントは全部送るからアプリ側で自由にコントロールしてね」的な汎用性がある。

Step 1: Google Apps Scriptで事前準備

通常のSlack APIを使うときと同様、Event SubscriptionsもSlack Appの方に設定を行なっていくのだけれども、その前にプログラムを構築するGoogle Apps Scriptファイル(または自作プログラム)の方で事前に準備をしておく必要がある。

Event Subscription認証へのレスポンスコード設定

とりあえず以下のコードをコピペで利用すれば一旦OK。

/**
 * Slackからのリクエストを受け取る
 */
function doPost(e) {
  const postData = JSON.parse(e.postData.contents);
  const response = {'challenge' : postData.challenge}; //Slack App認証用レスポンス
  return ContentService
        .createTextOutput(JSON.stringify(response))
        .setMimeType(ContentService.MimeType.JSON);
}

Google Apps Scriptをウェブアプリとしてデプロイ

  • Google Apps Scriptのコードエディタ右上のほうにある「デプロイ」のボタンを押して、「新しいデプロイ」を押す。

  • 初めてデプロイを行う場合は「デプロイメントの作成」を押して作成開始

GASファイル内で初めてのデプロイのときだけ出てくる
  • 「ウェブアプリ」を選択
    ポップアップ左上の方にある歯車マークを押すと、なんかいろいろ知らない単語が出てくるんだけれど、余計なことは考えないで「ウェブアプリ」押す。

  • ウェブアプリの設定を行う
    とにかく必須なのは、アクセスできるユーザーの項目で「全員」を選択すること。「全員」意外だとアクセス先からのアクセス認証が求められてしまうため、だいぶめんどくさい。

  • 最後に「デプロイ」のボタンを押して完了

入力例。必要なら「説明」の項目にもなんか入れて良いかも。
  • 発行されたURLをコピーしておく。
    Slack Appに「どこにイベント発生のリクエストを送るか?」を設定する際に利用するので、コピーしてどっかに保管しておく。(後から参照もできる)

Step2: Slack Appの設定

Slackからリクエストを受け取るGoogle Apps Scriptファイル側での設定が完了したら、次にSlack Appの方の設定。

Slack Appの新規作成(新規じゃなくてもいい)

  • Slack App作成ページに移動

  • アプリを設定するSlackにログインすると、API Appを作成できるようになるので、「Create New App」から作成開始。

「Create New App」のボタンはここ
  • アプリの名前(なんでもいい)とか入力して、「Create App」

Event SubscriptionsのRequest URL設定

Slack Appを作成したら、Slack App設定画面内の左側にある「Event Subscriptions」のページを開き、「Enable Events」の設定をONに切り替え。

赤枠のボタンを押すとEvent Subscriptionsが有効になる

Event Subscriptionsを有効にすると、「Request URLを入力しろ」的な項目が出てくるので、先ほどGoogle Apps Scriptをデプロイした時にコピーしたURLをここに貼り付ける。

設定先のアプリケーションから正常にレスポンスが返ってくるかの確認をしている

"Verified"って表示されたら設定OK。
何回やっても"Verified"にならないならGASの方のコードがミスってないか?とか、ウェブアプリ以外でデプロイをしちゃってないか?とか、公開範囲が自分のみになっていないか?などなど確認してみましょう。

Event Subscriptionsのスコープ設定

ページ下の方にスクロールするとSubscribe to Eventの項目があるので、それぞれに必要なスコープを設定しましょう。(例の場合は投稿されたメッセージを拾いたいので、message.channelsを設定。)

ちなみに、Subscribe to bot eventsはBotからのイベントを拾い、Subscribe to events on behalf of usersはユーザー(人)からのイベントを拾うという些細な違いがあるんだけど、どっちも設定しておけばとりあえず間違いはない。

大体のケースはmessage.channelsなのではないかと、、、

OAuth & Permissionsの設定

最後にSlack App設定画面内の左側にある「OAuth & Permissions」を開き、Slackのワークスペースにアプリをインストールして完了。

Step3: リクエストを受け取るコード作成

doPost内に処理を記載

Slack App側の設定が完了したら次はGASコードを書いていく。
一番最初に設定したfunction doPost(e) {…} の中に本来のやりたい処理を追記してきましょう。一例として下記のコードのような感じ。

function doPost(e) {
  //受け取る値
  const postData = JSON.parse(e.postData.contents);
  
  //認証処理であればここで処理終了
  if(postData.type === 'url_verification') {
    const response = {'challenge' : postData.challenge}; //Slack App認証用レスポンス
    return ContentService
        .createTextOutput(JSON.stringify(response))
        .setMimeType(ContentService.MimeType.JSON);
  }

  /* ここから下が実装本体 */
  .
  .
  .
  .
  .
  return ContentService
        .createTextOutput(JSON.stringify(response))
        .setMimeType(ContentService.MimeType.JSON);
}

doPost内に処理を書いていくと可読性悪いコードになりがちだよね

Webhook系のプログラムを作るとき、もう少し見やすく・読みやすくコードを書けないものかと考えた結果、Slackからのリクエストを処理する部分だけ次のように分離させることにした。

クラスにしておくとだいぶコードが見やすくなる。

実際に業務で使ってるコード

※コード全文だけ有料にしとく(あんまり参考にならないかもだけど、ご支援程度に投げ銭してくれたら嬉しいなぁー☺️)

ここから先は

3,338字

¥ 500

この記事が気に入ったらサポートをしてみませんか?