SSTエンジニアブログ

SSTのエンジニアによるWebセキュリティの技術を中心としたエンジニアブログです。

【Slack】自作執事botの紹介

どうも!社会人2年目になったばかりの西尾です!
SSTに入社して早くも1年が経ちましたが、初体験ばかりでとても濃い1年だった気がします。
そしてもう自分が先輩になるとは早すぎる…。笑

さて、今回は新入社員研修の一環として開発した Slackの執事bot について紹介していきます。
元々は天気情報だけをお知らせするbotでしたが、研修後も少しずつアップデートを重ねていき、気づけば多機能な執事botになっちゃいました。ということで、今回はその機能の 一部だけ をご紹介いたします!

(※細かい実装方法などは書いていないのでご了承ください。APIをこういう風に活用してるよー!という紹介になります。)

自作執事botの概要

名前は ジャーヴィス といいます!(某アメコミ映画の万能AIをイメージ)
ジャー スと呼ぶと怒られるのでご注意ください。

f:id:swime:20190412112834p:plain
執事botのジャーヴィスです!

さて、このジャーヴィスですが、元々はPHP研修で開発したものなので、使用言語はPHPになります。本当はPythonで作りたかった。。
PHPでSlack botを開発する場合、 PHP Slack Bot というライブラリを使えば簡単に作れるのですが、ちょっと自由度が低い…。ということで、Webソケット部分だけは以下のライブラリを使って、botの基本的な部分は自分でコードを書いていきました。

  • Ratchet - PHP用のWebソケット
    socketo.me

  • textalk/websocket - Ratchetのクライアント部分を補完してくれる
    github.com


Slackとの通信はWebソケットベースの Real Time Messaging(RTM)API を使用しています。

通知機能

まずは特定のタイミングやイベントを検出した際に通知してくれる機能を紹介していきます!

天気予報

月曜~金曜の朝10:00(始業時間)に今日の天気を教えてくれます。

f:id:swime:20190412113121p:plain
天気予報

天気情報はライブドアの Weather Hacksから取得しています。
最初の絵文字は天気によって変わるようになっており(11種類あり)、末尾の文章は曜日によって変わります。

降雨通知

これから雨が降りそうなときや降雨強度が変わりそうなとき、1時間に1回降水予測を教えてくれます。ランチで外に出るか考えるときに役立ちます!

f:id:swime:20190412113209p:plain
降雨通知機能

こちらはYahoo!の気象情報APIを使用しており、現在時刻から1時間後までの予想降水量を10分単位で取得し、その最大値を元に降雨強度を教えてくれます。
ちなみに、降水レベルは気象庁を参考に7段階で設定し、レベル毎に通知メッセージが変わるようになっています。
レベルMAXの通知は台風が来たときくらいでしたね…笑

予定通知

これは執事っぽい機能で、Googleカレンダーに登録している予定の5分前になると教えてくれます。おかげでミーティングに遅れる心配は無いですね!

f:id:swime:20190412113257p:plain
予定通知機能

予定は Google Calendar API を使用して取得しています。また、GoogleのAPIを使用するために、 Google Client Library も使用しています。

メール受信通知

これも執事っぽい機能で、Gmailで特定のタグ付けがされているメールが届いた場合、受信から1分以内に教えてくれます。おかげで重要なメールを即確認でき、見逃す可能性も低いですね!

f:id:swime:20190412114001p:plain
メール通知機能

使用しているのはGmail APIになります。

新規チャンネル

残り2つの機能はSlackのイベント通知を利用していて、1つ目は新しいパブリックチャンネルが作成された際の通知機能です。雑談チャンネルが新しく作られた際にすぐ気づけますね!

f:id:swime:20190412114140p:plain
新規チャンネル通知機能

これはchannel_createdイベントを利用しています。

新規絵文字

2つ目は新しいカスタム絵文字が登録された際の通知機能です。面白い絵文字は積極的に使っていきたい…!

f:id:swime:20190412114233p:plain
新元号発表から2分後に登録された『令和』

これはemoji_changedイベントを利用しています。注意点として、既存の絵文字にエイリアスが追加された場合も、新規絵文字が追加されたときと同じ通知が届きます。
このAPIで絵文字の作成者まで分かれば嬉しいのになぁ…

コマンド機能

次はSlack上でジャーヴィスを操作する機能になります。実際はたくさんのコマンドを作っているのですが、今回は執事っぽい機能だけご紹介します!

メール送信

出社時間の連絡メールを送信してくれます。弊社はフレックスタイム制を導入しており、定時(10時)より遅く出社する場合はメールで知らせる必要があります。ただ、毎回メールを作成するのは面倒くさい…ってことでジャーヴィスに任せちゃいました!

f:id:swime:20190412114317p:plain
メール送信コマンド

f:id:swime:20190412114343p:plain
実際に送信されたメール

メール送信に関しては、Gmail APIを利用しています。
これで安心してすぐに二度寝できますね( ˘ω˘)スヤァ…

今日の予定&ニュース

「おはよう」と挨拶すると、今日の予定と最新ニュースを教えてくれます。執事(秘書)っぽい…!

f:id:swime:20190412114424p:plain
今日の予定と最新ニュースをお知らせ

Google Calendar APIを利用し、自分のカレンダーに登録されている今日の予定を取得します。
ニュースはITmedia NEWSのRSSフィード(セキュリティ)から取得しています。

コミュニケーション機能

最後はジャーヴィスとコミュニケーションをとる機能になります。ただ、今はまだ単純な応答しかできないので、いつか人工知能などを搭載したい。。

たまに話しかけてくる

ジャーヴィスが参加しているチャンネル内で、誰かがメッセージを入力していると、稀にジャーヴィスから話しかけてきます。

f:id:swime:20190412114523p:plain:w400
たまにはかまってあげて…!

これはuser_typingイベントを利用しています。
ただ、かまってちゃんになると鬱陶しく感じてしまうので、色々と工夫しています。(誰かがタイピングを始めた際に約3%の確率で話しかけるなど)

簡単な会話

メンション or 文頭 or 文末に「ジャーヴィス」を付けた場合、ランダムな返答をしてくれます。
良い感じの返事をしてくれるように改良したい…

f:id:swime:20190412114622p:plain
会話機能

特定のワードがあったりすると、会話っぽい返事をしてくれることもあります。

f:id:swime:20190412114700p:plain
それっぽい返事をしてくれる

また、21時以降に何かしらのコマンドを実行すると、1日1回だけ気の利いたメッセージを添えてくれます。

f:id:swime:20190412114816p:plain:w400
早く帰ろうね…!

そんな従順なジャーヴィスですが、たまには反抗したくなるときもあるみたいです。

f:id:swime:20190412114925p:plain:w400
たまに無視される…

という風に、少しでも人間味が出るように工夫してみました!

おわりに

他にも様々な機能や隠しコマンドがあるのですが、今回は執事っぽい機能だけご紹介しました!
ボット開発は初めてだったのですが、夢があって面白いですね。SlackのAPIは豊富ですし、他サービスのAPIを利用することでさらにボットの可能性が広がって楽しい…!

ということで、皆さんもSlack botを自作して遊んでみてはいかがでしょうか?
ジャーヴィスもまだまだ進化していく!…かも。