今年作ったビジネス向けのbotたち

こんにちは、trebyです。

この記事は[ChatOps Advent Calendar 2015](http://qiita.com/advent-calendar/2015/chatops)の5日目です。昨日は[nekobato](http://qiita.com/nekobato)さんによる[自分だけのためのSlack Team](http://qiita.com/nekobato/items/f9cec477269f0a5d7bde)でした。Slackやhubot、良いですよね。私も活用しています。

個人的には昨年後半あたりからbot作りの面白さに目覚めまして、仕事プライベート問わず何か時間を見つけては作ってきました。__botもChatOpsに含まれるはず！__というわけで今日は、うだうだと自分の今年のbot活動、特に今回はビジネス向けのものを振り返ってみようと思います。

なお、ここでの主なチャットツールはSlackを想定していますが、hubotを使って実装しているものであれば、[adapter](https://github.com/github/hubot/blob/master/docs/adapters.md)を変更すれば応用がきくのではないでしょうか。

# 主にビジネス向けに作ったbot達
## KPI bot
[こちらの記事](http://konifar.hatenablog.com/entry/2015/05/05/011529)を拝見した時に「これは良い！」と取り入れたものです。

使われている方はご存知の通り、Slackでは発言を一方的に流すだけであれば、[Incoming Webhook](https://api.slack.com/incoming-webhooks)の仕組みを使ってサクッと実現できます。

その実、指定されたエンドポイントにJSONをPOSTするだけでいけるので、共通部分を書いておいて（[RailsのActiveJob](http://railsguides.jp/active_job_basics.html)を例として挙げます）

```rb
class NotifySlackJob < ActiveJob::Base
  queue_as :slack_notification

  def perform(text, data: {}, webhook_url: nil)
    webhook_url ||= SLACK_WEBHOOK_URL # webhook_urlを入れる
    return if webhook_url.nil?

    payload = { text: text }.merge(data)

    res = Net::HTTP.post_form(URI.parse(webhook_url), {'payload' => payload.to_json})
    
    # - response codeを見て'200'以外だった場合の処理を書く -
  end
end
```

集計のバッチ処理を走らせる時に以下のコードを差し込んでおけば簡単にできちゃいます。

```rb
text = '流したい発言' # ヒアドキュメントなどを使っていい感じに作る
NotifySlackJob.perform_later(text)
```

<img width="610" alt="Slack 3.png" src="https://qiita-image-store.s3.amazonaws.com/0/35353/3df7e198-c799-e648-4e42-ed145b4d9aae.png">

コードを差し込めばKPIに限らず何でも流せるので、私のチームでは特定の情報がサービスに入ってきた時にもSlackに流すようにしています。

## お掃除当番管理bot
小さいチームあるあるかもしれませんが、私のチームには掃除当番なる概念が存在しています。会社はいわゆるSOHOなので、オフィスのことは基本的に自分たちでやっています。

オフィスの掃除、主にはゴミ捨てもその内の一つでもともとはアナログで運用(「掃除当番札」というものがありました(！))していたのですが、全社全職種横断で当番を回しているのもあってか、当番が有耶無耶になることが少なくありませんでした。

そこで登場したのがこのbotです。今まで人で管理していた掃除当番をbotが管理してくれます。具体的には指定した日時にリマインドを行ってくれる他、週末には自動で掃除当番をローテーションしてくれます。

<img width="514" alt="スクリーンショット 2015-12-05 14.05.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/35353/4d4206bc-38e5-af53-58a9-85310c5f2ae4.png">

また、人が増えることも考慮して掃除当番対象のメンバーをSlack上で追加できるようにしています。

<img width="512" alt="スクリーンショット 2015-12-05 14.04.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/35353/c23845ad-0ee0-8a3c-9dc7-d48c81daffa1.png">

実装はhubotを使っています。Gistにはなりますが、コードは次の通りです。開発過程で、`<@user_id>`のようにしないとSlack側でメンションを飛ばせないことを知りました(`@ninomiya`とするだけじゃただのテキストになっちゃうのです)

- [共通部分](https://gist.github.com/treby/f4dfa50e39c3725b6f13)
- [コマンドを受け付ける部分](https://gist.github.com/treby/b4daceacd6a385d2395c)
- [定期的な処理](https://gist.github.com/treby/826f09c054a71fa94bd1)

掃除当番を管理するのにどれくらい需要があるのかはわかりませんが、例えばレビュー当番とかに応用がききそうですね。

あ、ちなみに隠し機能として会社の住所とか必要になった時に聞くと教えてくれますw
<img width="446" alt="Slack.png" src="https://qiita-image-store.s3.amazonaws.com/0/35353/f12c4ec5-9f8d-72a8-10c3-c871fde7508d.png">

## Twitter watch bot
hubotを使ってソーシャルメディアの情報を拾いたいよね、というところで[昨日も紹介されていたもの](http://qiita.com/nekobato/items/f9cec477269f0a5d7bde#slack%E3%81%AB%E5%AE%9A%E5%9E%8B%E5%8C%96%E3%81%97%E3%81%9F%E8%AA%BF%E6%9F%BB%E3%81%AE%E3%83%95%E3%83%AD%E3%83%BC%E6%83%85%E5%A0%B1%E3%82%92%E9%9B%86%E3%82%81%E3%82%8B)をまさに[そのまま使っています](https://github.com/spacemarket/twitter-watch-hubot)。

まあ、これはbotを作らずとも[Notify](https://notify.ly/)のようなサービスを使っても良いのかもしれませんね。あと割と定型なので先ほどのリポジトリ、[slackin](https://github.com/rauchg/slackin)みたいにHeroku buttonつけたいですね。

# まとめ
以上、今年主にビジネス向けに作ってみたbotを紹介しました。実際稼働させてみて思うのは、KPIにしろソーシャル情報にしろ、ある情報から話が広がっていくこともあるなということです。botが発言するルームがそのままコミュニケーションの場になるのが良いな、と感じています。

皆さんのオフィスではどんなbotが稼働していますでしょうか？[是非教えてください！](http://qiita.com/advent-calendar/2015/chatops)
# そして明日は……
[ara_ta3](http://qiita.com/ara_ta3)さんです。よろしくお願いします！