#ことの起こり
弊社では入社1年目の社員には新人業務ということで、「電話応対」と「昼休みの消灯・点灯」の仕事があります。
電話応対は読んで字のごとく、外線からのコールに応えるものです。
昼休みの消灯・点灯について、弊社では昼休みである12:00から13:00の間、照明を落とす決まりがあり、そのスイッチャーを入社1年目の社員が担っています。(以下、消灯係)
電話応対は全員で早い者勝ちです。分担などは特にしていません。(離席で取れなかった場合などがあるため)
さて消灯係の分担ですが、独自のルールを採用しています。
それは、「各週で電話応対の回数が最も少なかった2人に任命する」というルールです。詳細は以下。
- 毎週金曜日の正午に、電話応対の回数の集計を締め切り、選出を行う。
- 電話応対の回数が少なかった人から順に任命。
- 同率で人数が溢れた場合は抽選。
- 全員の回数の合計が、1年目社員の総合人数を下回った場合は、電話応対の回数に関わらず全員で抽選。
- 任命が終了したら集計をリセット。再び翌週の金曜日の正午まで集計を行う。
電話の回数の集計方法ですが、新人のみのSlackに電話を取ったとき用のスタンプがあるので、それで報告します。
このスタンプの数を集計するようにしていました。
以前は、特定の1人に集計を任せていました。しかし、そうすると必然的にヒューマンエラーが発生し、集計ミスなどが起こります。
ここで、「SlackBotで自動化できないか」という案が浮かび、今回のSlackBotを作成する運びとなりました。
今回は、SlackBotの作り方を初学者向けにまとめながら、消灯当番用SlackBotの顛末を書き綴りたいと思います。
#SlackBotの作り方
Botの作り方は複数あります。Bot Users、Slash Command、Unfurling links・・・など。
いろいろ調べた結果、今回はWebhookを使用することにしました。
理由は・・・なんとなく使いやすそうだったから・・・です・・・。
とりあえず何でもいいので、とにかく作ります!
##Webhookを設定
###Webhookって何ですか?
「設定したURLにPOSTリクエストを送るもの」らしいです。
私も詳しいことはわかりません・・・。
Webhookとは?
https://qiita.com/soarflat/items/ed970f6dc59b2ab76169
こちらの記事に詳しい説明が載っていますので、ご参考にどうぞ。(他力本願)
さて、今回Slackで設定するWebhookは2種類あります。
Outgoing Webhook と Incoming Webhookです。
###Outgoing Webhooks
こちらは簡単に言うと、Slackで特定のキーワードが投稿されると反応するAppです。
百聞は一見に如かず、さっそく設定してみましょう。
Slackのチャンネルの「会話の設定」から「アプリを追加する」を選び、Outgoing Webhookを検索します。
ヒットしたものをクリックすると、このような画面に遷移されます。
「Slackに追加」→「Outgoing Webhook インテグレーションの追加」とクリックすると、新しいWebhookのアカウントのようなものが作られます。
ページの下の方に行くと、「インテグレーションの設定」という項目があるので、こちらで設定をしていきます。
(「Outgoingペイロードとレスポンス」は今は無視!)
####チャンネル
発言を拾うチャンネルを設定します。
ここで新しくチャンネルを設定することもできます。
どうやら、既存のプライベートチャンネルは設定できないみたいですね・・・。
####引き金となる言葉
全部の発言を拾われると困るので、キーワード(トリガー)を設定します。
ここで設定した言葉で始まる行があった場合のみ、Webhookに拾われます。
また、コンマで区切ることで複数のキーワードも設定できるし、:スタンプ名:
という風にすればスタンプも登録できます。ダブルクォーテーション(")も必要ありません。ありがたいですね~。
####URL
POSTリクエストを投げる先のURLを設定します。
今は一旦置いておきます。
####トークン
これはユーザーが設定するのではなく、Outgoing Webhookが自動で生成したものをユーザーが使うことになります。
トークンとは、「これ本当にあのWebhookが投げたの?」ということを確かめるためのパスワードのようなものです。
####その他
それより下の名前やアイコンなどは、お好みで設定しましょう。
設定が終了したら、最下部の「設定を保存する」をクリックします。
設定したチャンネルに以下のようなメッセージが出たら完了です。
消灯当番を決めてくれる、名付けて消灯くんです。
###Incoming Webhook
続いてIncoming Webhookです。
こちらは、リクエストが投げられ時に、自動でSlackに投稿するAppです。Outgoingの逆、とも言えるものでしょうか。
こちらもさっそく設定していきます。
Outgoingの設定画面に上に検索窓があるので、そちらでIncoming Webhookを検索しましょう。設定画面までの遷移方法はOutgoingと同様ですが、先にチャンネルを設定しないとインテグレーションの設定ができないので注意しましょう。チャンネル設定が完了すると、以下のような投稿がされています。
Incoming Webhookの方は、実はこれ以上の設定をしなくても動きます。
あとはお好みで名前などを変えるくらいです。
しかし、SlackBot自体は動きません。
Outgoingがキーワードを拾っても、リクエストを投げる先がありませんし、Incomingも、リクエストが来なければ投稿できません。
「じゃあOutgoingのURL設定に、IncomingのWebhook URLを貼ればいいのでは?」と思った方は、鋭いです!できません。
あまり詳しい理由は言いませんが・・・Incomingの設定画面の「セットアップの手順」にも書いてある通り、「どういう内容の投稿するか」というプロパティがないと投稿できません。そしてOutgoingではその設定がありません・・・残念ながら・・・。
ではどうするのかというと、Outgoingからのリクエストを受け取り、Incomingにテキストを指定したリクエストを送るもの・・・つまり中継地点のようなものが必要になります。
ここで今回用意したのは、Google Apps Script、通称GASです。
##GASとは?
GASではプログラムのソースコードを作って、Googleのマイドライブに置いておくことができますし、実際に動かすこともできます。
本来ならサーバーを構築して統合開発環境をインストールして・・・というようなことをしなければいけないところを、Google先生によれば**インターネット上でやらせてくれます。**あ、ありがてぇ・・・っ!
さらに、Google Spread Sheetと連携をすれば、データを保存しておくこともできます。便利~↑
さっそく作っていきましょう。
####ドライブの新規作成
- Googleにログインした状態で、「Googleアプリ」の「ドライブ」を開きます。
- 左上の「新規」ボタンをクリック
- 「Google スプレッドシート」→「空白のスプレッドシート」をクリック
![1-9.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F431212%2Fb7157e66-9b93-15b3-3bcb-73205b74652b.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=f85874f657da931871b66eaa8072fd8c)
![1-10.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F431212%2F29dd4967-50e9-0e68-0474-a8b582a835ea.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=480fe4f5fa86c65b1190e87d6b4b01d0)
![1-11.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F431212%2Fcfb455ee-ace7-9427-a549-7725885785d2.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=50d0adc66e513b4a5bab9ecb8d8ae215)
function doPost(e)
// 何かしらの処理
}
引数の「e」は、POSTリクエストで渡されるパラメータがたくさん入っています。
SlackのOutgoing Webhookの場合は、投稿されたチャンネル名、投稿者名、投稿内容、反応したキーワード、投稿時刻・・・などなど。しかし、今回の記事では使わないので置いておきます。
さて、これでは何もしてくれないので、Slackに投稿する処理・・・正確には「Incoming Webhookにリクエストを送る処理」書きましょう。
ちょっと複雑だし自分もよくわかっていないので、コピペしてもいいです。(私もコピペしました)
// リクエストを受け取るメソッド
// 最初に発動する
function doPost(e){
// 今回はSlackメソッドを呼び出して終わり
slack();
}
// Slackに投稿するためのメソッド
function slack(){
// 投稿内容
var text = "投稿テストです。";
// Incoming Webhookが動くために必要な設定
var options =
{
"method" : "post",
"contentType" : "application/json",
"payload" : JSON.stringify(
{
// 投稿内容 変数を指定
"text" : text,
}
)
};
// Incoming Webhook のURL ・・・(1)
var url = "https://hooks.slack.com/services/TKJG8LZTN/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX";
// 指定したURLにリクエストするものらしい
UrlFetchApp.fetch(url,options);
}
(1)のIncoming WebhookのURLは、Incomingのインテグレーションの設定画面にあるものをコピーして貼り付けます。
これでOK!保存したら、ソースコードにはもう触りません。
####アプリケーションの公開
ソースコードを保存しただけでは、SlackBotはまだ動きません。公開をする必要があります。
「公開」→「ウェブ アプリケーションとして導入」をクリックします。
以下のような表示が出るので、
- プロジェクトバージョン→「New」
- 次のユーザーとしてアプリケーションを実行→「自分」
- アプリケーションにアクセスできるユーザー→「全員(匿名ユーザーを含む)」(Anyone, even anonymous)
を選択して、公開します。
![1-14.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F431212%2F90976f22-3daa-3a19-4e6e-8d13e08f5760.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=33bae4590a88c2d051ffd3640341494b)
![1-15.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F431212%2F3ca067a0-fc97-32e1-55a8-c12ce52cdd9d.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=b067ea0884f0b6e6cc2f0e5dc515b820)
![1-16.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F431212%2Fd305bc4c-b76d-624e-2f78-ca4575e521bf.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=83509c50d601832fe6ff2a4ff71e52b4)
![1-17.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F431212%2Fa0955397-594e-6512-1b9e-89e13a3afce2.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=3dbcf0867231f72f871164e6e1fa3dd8)
![1-18.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F431212%2F8b1433be-6e4c-cb0c-72eb-d49ae84a5287.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=525164ae853d45ee550ad07b10b52899)
**まだ終わりではありません!**今度はOutgoing Webhookに、このURLを教えなければいけません。
表示されたURLをコピーし、Outgoing Webhookの設定画面に戻りましょう。
URLの欄にペーストして、設定を保存しましょう。
これで完了です!
さっそく試してみましょう。チャンネルをお間違えなく・・・。
やりました・・・。
#まとめ
今回作成したSlackBotの仕組みを簡単におさらいします。
こんな感じです。大体合ってると思います・・・。
今回はスプレッドシートは使いませんでしたが、次回の記事で大いに活躍することでしょう。
次回はGASで消灯くんの核となる機能の実装をします。