こちら。
https://github.com/yhay81/GASlacker
ライブラリキー: M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO
経緯
Slackでボットを作ろうと思いドキュメントを読んだらBotkitというのをオススメされていたがややこしいと思った。
サーバー管理不要かつ無料で作りたいと思い Google Apps Script に目をつけた。ちょうどJavaScriptも書きたかった。
ライブラリはたくさんあった。が、Google Apps Script用のものはなかった。
ググった。Qiita記事「Slack BotをGASでいい感じで書くためのライブラリを作った」を見つけた。
CoffeeScriptで書かれたこのライブラリは使う分には問題なさそうだったが、最終更新が3年前で最新のSlack APIに追随できていなかったので、もしかすると需要あるかもと思い、自分なりにライブラリから作ることにした。
ちょうどGASをローカルで開発しやすくする「google/clasp (GitHub)」というものが最近登場していて、それにも興味があった。
さらにQiita記事「Google Apps Script をローカル環境で快適に開発するためのテンプレートを作りました」を見つけて、TypeScriptでかける準備が整っていたので、TypeScirptにで書いた。と言ってもほぼJS。
インターフェースなのだが、slackのAPIはhttps://slack.com/api/chat.postMessage
というようなアクセスポイントにGETやPOSTを投げる。chat.postMessage
の部分がメソッドによって変わる。GAS Pythonインターフェース「os/slacker (GitHub)」はそこでslacker.chat.postMessage(引数)
という書き方を採用していた。いけてると思ったので真似た。
詳しくはこちら。Slack API Document
使い方
https://drive.google.com などから Google Apps Script を新規作成。
Resourcesタブに、Libraries...というのがあるので、それに
M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO
これを書くと、GASlacker
という変数が使えるようになる。
あとは、こんな感じ。
var token = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN');
var slack = GASlacker.methods(token);
function doPost(e){
var event = JSON.parse(e.postData.contents).event;
if(event.text.match(/hello/)){
var text = "Hello," + event.message.username;
slack.chat.postMessage(event.channel, text);
}
}
Slack から取得するトークンはハードコーディングでも良いのだが、GASにはあらかじめプロパティとして保存することで利用できるメソッドがあるのでそれを使った。
SLACK_ACCESS_TOKEN
という名前で登録している。File - Project Propertyというところからできる。
GASlackerは唯一のメソッドMethods
を持っている。これにトークンを渡すと、オブジェクトが作られる。
doPostはGASの特別な関数で、GASにPostが送られてきたときに動作する。GASをWebアプリとして公開して、Slackに権限を適切に設定して登録しておくと送られてくるようになる。
このサンプルはメッセージがSlackで書かれたときに、Postされるようにした場合のもの。eにいろんな情報が入っているので、うまいこと処理して、slack.chat.postMessageに引数として渡すと、自動でメッセージが送信される。
Slack API Document を見るとわかるが、引数には必須のものと、オプションのものがある。
Tokenはほぼ全てに必須だが、これはGASlackerでは書く必要がない。
必須のものは、GASlackerでも必須で、オプションのものは、必須の引数の後にオブジェクトで{hoge:'fuga',foo:'bar'}
みたいに書く。
まとめ
APIの量が多くて全てを実装するのは結構大変だった。
今回のものは、Slack APIをそのまま扱うだけのものだが、もっといい感じにラップして、botを作るためだけのライブラリにもできたらいいなと思った。
また、GASにはコード補完させることもできるので、それも実装できるとより便利になりそうだ。
需要があれば、というところなのでこのライブラリが使えそうだと思った方いれば、スターお願いします。https://github.com/yhay81/GASlacker
補足
このMediumでGASでのSlackBotの作り方を0から説明してみた。
英語だがほぼ画像。非エンジニアにとっては、GASを使うこの方法がもっとも簡単なSlackbotの作り方なのかなと思う。GASlackerも使っておらずできるだけシンプルにした。