slackチャットボットをGASで作る
概要
slackでメンションをつけたやり取りをボットと交わすことを目標にする。
やることは大きく二つで、slackのAppを作る、GASでWebアプリを作って公開。
処理の流れとしては、Appがチャンネルを監視してメンションがあればGASを呼び出す。GASには返信内容を作成してslackに送信するスクリプトを記述する。
完成図はこんな感じ
Slack Appを作成
Create New App
ここでAppを作成して管理する
「Create New App」から任意のApp名とボットを使用するslackチャンネルを選択するとAppが作成される。
ここではslack_botという名前で作成した。
App Home
まずは、slackチャンネル内でのbotの名前(Display Name, Default Name)を設定する。
Oauth & Permissions
次に、Appの権限のスコープを設定する。
今回はメンションを使用したやり取りなので、「app_mentions:read」「chat:write.customize」「chat:write」を選択。
これにより、@slack_botとメンションがついたメッセージの取得とメッセージ送信の権限がAppに与えられる。
そして、左ナビゲーションのInstall Appから作成したAppを自身のslackのワークスペースにインストールする。この時にBot User OAuth Tokenが得られる。
GASを作成
GoogleDriveからGoogleAppsScript(GAS)を作成する。
GASにSlack Appを追加
まず、GASにslackのライブラリを追加する。
「リソース」-> 「ライブラリ」で表示されたダイアログのAdd Libraryに「M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO」「1on93YOYfSmV92R5q59NpKmsyWIQD8qnoLYk-gkQBI92C58SPyA2x1-bq」(2022/02/25 現在)を入力し、SlackAppを追加。
GASを作成
/* /* * slackToken: VarificationToken * slackBotToken: BotUserOathAccessToken */ var slackToken = '****'; var slackBotToken = '****'; var botUserName = 'bot'; var botUserIcon = ':slack:'; function doPost(e) { var req = JSON.parse(e.postData.getDataAsString()); if (req.token !== slackToken) return null; /* * slackから認証のためにchallengeというパラメータが送られてくるので、 * そのパラメータをそのまま返却することで認証が行われる。 */ if (req.type === "url_verification") { var payload = { challenge: req.challenge }; // challengeを返す var res = ContentService.createTextOutput(); res.setMimeType(ContentService.MimeType.JSON); res.setContent(JSON.stringify(payload)); return res; } var text = 'Hello' var options = { method: 'POST', payload: { token: slackBotToken, username: botUserName, icon_emoji: botUserIcon, channel: req.event.channel, text: text } }; UrlFetchApp.fetch("https://slack.com/api/chat.postMessage", options); }
AppからはdoPostが呼び出され、引数のeにはメッセージの内容などが送られます。
認証はAppから送られてくるchallengeというパラメータをそのまま返却することで行われる。
VerificationTokenはサイドバーのBasicInformationに書かれています。
BotUserOathAccessTokenについては後述。
GASを公開
AppがGASを呼び出せるようにWebアプリとして公開する。
「公開」->「Webアプリケーションとして導入」
Project version: new
Execute the app as: 自身のgmail
Who has access to the app: Anyone even anonymous
設定するとURLが表示されるのでメモしておく。(Appから呼び出すのに必要)
AppとGASを連携
slackのチャンネルを監視し、メンションがあった時にGASを呼び出すように結びつける。
Slack AppのEvent Subscriptionsを設定
slackチャンネルを監視するためのSubscriptを設定する。
ここで、チャンネル内でメンションがあった時にGASを呼び出すという設定を行う。
Enable Events: ON
Request URL: 先程メモしておいたGASのURL
Request URLを入力すると認証が開始され、challengeが正しく返っているとVerifiedと表示される。
※ 上手くいかない場合は、GASを修正して再度公開を行い、retryを押す。
Subscribe to bot events でapp_mentionを選択。
これで、メンション時にGASへメッセージ内容をPOSTするという結びつけが完了。
slackのチャンネルにAppを追加
サイドバーの「Install App」よりslackにインストールする。
この時表示されるTokenがBotUserOathAccessTokenに使う。
すると、アプリのslackを開くとチャンネルに作成したslack_botをアプリとして追加できるようになっている。
アプリを追加したら完成。
まとめ
思ったよりも簡単というか、やってることが面白そうな割に調べたり学んだりすることが少なかったのが驚きだった。
あとは、GASのメッセージを作成する部分を肉付けしていけばいろんな用途のbotが作成できる。