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も作ることができそうですね。
この記事が気に入ったらサポートをしてみませんか?