SlackのEventAPIとGASを利用して、特定のチャンネルにjoinするとwelcomeメッセージを表示するBotを作ってみた

SlackのEventAPIを使ったBotを作ってみたくなったのでお試しで作ってみた。特定のチャンネルにjoinすると「○○へようこそ」と表示する仕様のものを作っていきます。

大まかな構成としては、Slackのinviteイベントをトリガー→GASで作成したスクリプトにpost→GASがSlackに返却→SlackBotがようこそメッセージ表示、の流れです。

まずはSlack API画面へ。

Slack Appを新規で作ります。名前は何でも良いです。Slackのworkspaceも好きなものを指定しましょう。

Bot Userを追加します。名前は何でも良いです。Bot Userがいないと「○○へようこそ」と喋ってくれないので重要です。

ここからはGoogle Spread SheetとSlack APIを行き来します。


スプレッドシートを新規で作成します。

カウントアップ用にcounterというシートも用意しておいてください。A1セルに初期値1を入力しておきます。

次に、ツール→スクリプトエディタよりGASエディタを開きます。

GASのプロジェクト名も好きな名前で保存します。

ソースの詳細は後ほど。まずは設定周りから。

リソース→ライブラリからSlackAPIにアクセスするライブラリを指定します。

ライブラリはこちらのブログのものを利用させてもらいました。

ブログ内のLibrary Keyを「ライブラリを追加」から追加します。バージョンは最新バージョンで(現時点で22)で問題ないと思います。

下準備はできたのですが、Slack Event APIを利用するために認証をする必要があります。まずその認証を通るようにしてみます。下記をスクリプトエディタにコピペしてください。

function doPost(e){
  //バリデーション用
  var params = JSON.parse(e.postData.getDataAsString());
  return ContentService.createTextOutput(params.challenge);
}

function doGet(e){
  doPost(e);
}

スクリプトエディタの公開→ウェブアプリケーションとして導入を開きます。

プロジェクトのバージョン:常に新規作成を選択。なにかソースに修正が発生した場合も新規にしないと動作しませんので注意

次のユーザとしてアプリケーションを実行:自分のアドレス以外で試していないのですが、自分、でいいと思います。

アプリケーションにアクセスできるユーザー:全員(匿名ユーザーを含む)、を選択してください。匿名ユーザを含む、を選択しないとSlack側からアクセスできません。

ここまで終わったらSlackAPIの画面に戻ります。

Event Subscriptions→Enable EventsをONにします。Request URLにはGASの「現在のウェブアプリケーションのURL」をコピーして貼り付けます。

もし下記のような画面になったら、何かしらのエラーなので解決する必要があります。GASの公開時の設定を特に注意してください。

無事に完成すると下記の画面になります。下の方にある「Add Bot User Event」ボタンを押してトリガーとなるイベントを選択します。今回は「メンバーがチャンネルに参加した時」というトリガーなので「member_joined_channel」を指定します。

アプリのインストールを忘れていました。Install Appからアプリのインストールを行います。後ほどBot User OAuth Access Tokenを利用するのでコピーしておいてください。

Reinstall Appボタンがあるのですが、基本的にこちらは押さない方が良いです。BotUserの再設定やトークンの再設定が必要になるためです。

Slack APIの設定はこれで完了です。GASの画面に戻ります。

GASのファイル→プロジェクトのプロパティ→スクリプトのプロパティにSLACK_ACCESS_TOKENを設定します。これはプロジェクトで利用する定数です。先程コピーしたBot User OAuth Access Tokenを設定します。

下記がコードの全容です。メッセージだけだと少しつまらないので、「counter」シートのA1セルの値を実行毎に1ずつ増やして「あなたは○番目のお客様です」という表示ができるようにしてあります。counterシートは予め作成しておいてください。真ん中のoptionsに該当するSlackチャンネル、Bot User、メッセージ内容を適宜更新してみてください。

function doPost(e){
  var token = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN');  
  var slackApp = SlackApp.create(token); //SlackApp インスタンスの取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('counter');
  
  //シートから人数取得
  var counter = sheet.getRange(1, 1).getValue();
  
  var options = {
    channelId: "#test", //チャンネル名
    userName: "ytest", //投稿するbotの名前
    message: "testのお部屋にようこそ。あなたは" + counter + "番目のお客様です。", //投稿するメッセージ
  };
  
  //カウントアップしてシートに設定
  counter++;
  sheet.getRange(1, 1).setValue(counter);
 
  
  
  
  slackApp.postMessage(options.channelId, options.message, {username: options.userName});
  
  //バリデーション用
  var params = JSON.parse(e.postData.getDataAsString());
  return ContentService.createTextOutput(params.challenge);
}

function doGet(e){
  doPost(e);
}

プロジェクトを公開します。「新規作成」で公開することをお忘れなく。

あともう少しで完成です。対象のSlackチャンネル上でBotUser(例だと@ytest)をinviteしてください。対象チャンネルにBotUserが参加していないとこのBotが発動しません。

うまくいくとこのように表示されます。今回は一方的にメッセージを表示するだけですが、joinした人の情報なども取得することが可能だと思うので、双方向なBotも作ることができそうですね。


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