タイムカードボットというBOTアプリを作りました

私は、B2B系のシステム開発会社を３社ほど経験していますが、そのいずれも、

* 始業時間、終業時間と作業の内訳を
* 月末にEXCELで

提出する決まりがありました（うち１社は自社システムだったけど）。

基本的にダメ人間で、「毎日仕事終わるときに記入する」ということができないので、時には「Windowsのイベントログのシャットダウン時刻を抽出して」記入したりしていましたが、近年は在宅勤務になったこともあり、PCが起動（スリープ）しっぱなしなことも多く、これも使えなくなってしまいました。

これはもう誰かに「仕事終わった？」って聞いてもらうしかない。
現職では Skype を常駐させている（個人では Slack）ので、Skype の Bot に聞いてもらおう！
ということで作ったのが「タイムカードボット」です。10日くらい自分で使ってて安定してきたので公開しちゃいます。

## 概要

使い方は簡単で、Skype または Slack の Bot にユーザー登録すると、

* 終業時間が過ぎたら
* 30分ごとに

「仕事は終わりましたか？」と聞いてきます。
「はい」と答えると、この時刻を終業時刻として聞いてきます。
これを毎日繰り返して、データを蓄積した後、月末に日毎の終了時刻一覧を取得できる、というものです。
終業時刻や休みの曜日などはユーザーごとに設定できます。

![](http://blog.amay077.net/assets/images/posts/timecardbot_01.png)
![](http://blog.amay077.net/assets/images/posts/timecardbot_02.png)

とりあえずどんな感じかを Web で試すことができます（ユーザー登録も一応できるけど通知は来ません）。

* [TimecardBot- Web](https://webchat.botframework.com/embed/TimecardBot?s=yw-bgVOoJYE.cwA.6xI.HnQHWAV_N4epfRnO2Zi0dNXF8h_eK2myml9EZojmlcU)

ちょっと使ってみたいぞ、という方は、
Skype の人は [TimecardBot- Skype](https://join.skype.com/bot/a70f0d6f-af59-497d-b50d-4abbb2663b6a) を開いて、Skype で TimecardBot を追加してください。

Slack の方は、私まで（ [twitter:@amay077](https://twitter.com/amay077)、この投稿へのコメント、[githubのissues](https://github.com/amay077/TimecardBot/issues) など）なんでもよいのでご連絡ください。Team へ招待します（Slack にお布施してないのでどこまでできるのか判ってません）。

Bot に対して「メニュー」「menu」などとポストするとメニューが表示されるので、「ユーザー登録」をしてもらえると、その日の終業時刻から作動します。

## 仕組み

これは大きく２つのアプリケーションから成っていて、

1. ユーザーと対話する Bot Application
2. 30分ごとにユーザーにメッセージを送信する定期処理

１ は Microsoft の [Bot Framework](https://dev.botframework.com/) と C# で開発した Bot Application です。Azure の App service に配置しています。
2 は同じく Microsoft の Azure Functions の Timer Trigger を使っています。こちらも C# です。

Bot Framework でアプリを作成すると、Bot Connector と呼ばれる仕組みでさまざまなチャットサービスに対応できるので便利です。タイムカードボットでは Skype と Slack でのみ動作させていますが、他にも Facebook Messenger や Microsoft Teams、 SMS や音声通話(Trello使用) などにも対応できます。

データ・ストレージには、やはり Azure の Table Storage を使用しています。
スキーマレスなのは、まあサクッと作るには便利ですね。一方で PartitionKey と RowKey の設計には注意が必要そうです。

C# で Bot App と Functions のロジックを共通化できるのもよいです。
つい先日、Visual Studio 2017 が Azure Functions にも対応したので、ひとつのソリューションで両者を開発、デバッグできます（それまでは VS2017のPreview版を使っていました）。

## これから

ボットとの対話、今は自然言語は使えないので、 Cognitive Services の [LUIS](https://blogs.msdn.microsoft.com/bluesky/2016/09/21/luis-language-understanding-intelligent-service-japanese-available/) を使ってみたいですね。

あとは、タイムカードを EXCEL や CSV でダウンロードできる仕組み。
こちらは、Azure Queue Storage や Functions の Queue トリガーを使うことになりそうです、ファイル置き場は Blob Storage ですかね。

モバイルアプリに対するボットアプリの有用性みたいなことを考え始めているのですが、このような「秘書型」のサービスは、モバイルアプリにする必要はないよなあと考えています。他には例えば「明日は何ゴミを出す日か？」と教えてくれるとかですね。（対話をせず通知だけならチャットサービスをHUBにしてるだけで「BOTアプリ」ではないとも言えるのですが。ゴミの写真をポストしたら何ゴミか教えてくれる、とかはアリそうですね。）

ソースコードは Github で公開していますので、何かの参考になれば幸いです。

* [amay077/TimecardBot: 終業時刻になると「仕事終わった？」と聞いてくる Skype ボットです。](https://github.com/amay077/TimecardBot)

## 謝辞

Bot Framework を使うのが初めてなら、Azure を本格的に使うのも初めてだったので、次のサイトはとても参考になりました、ありがとうございます。

* [Microsoft Bot Framework v3.0 からはじめる BOT 開発 - Qiita](http://qiita.com/annie/items/edc26c0ee9603e84a2e4)
* [BEACHSIDE BLOG - Bot カテゴリーの記事一覧](http://beachside.hatenablog.com/archive/category/Bot)
* [5ステップでズバリ！笑顔判定BOT を作成しよう by Microsoft Bot Framework and Cognitive Services – 青い空の向こうへ](https://blogs.msdn.microsoft.com/bluesky/2016/11/15/5-step-tutorial-smilescorebot-bot-framework-cognitive-services-ja/)