ikeike443のブログ

ソフトウェアビジネスに関心がある系のブログ

ChatOps関連のメモ

最近SlackのCTOが日本で取材を受けたりして下記のようなコメントをして話題になりましたね。 f:id:ikeike443:20171217163031p:plain www.businessinsider.jp

僕もメールはゴキブリみたいなもんだってのには同意なんだけど、それとは全然関係なく、Slackの存在感が増すにつれ最近のChatOps事情が気になったのでちょっと調べてみた。これはその備忘。

ChatOps

ChatOpsってのは多分、一応GitHubが最初にいい出したもののような気がする、わからないけど。ChatOpsの象徴であるHubotは2011年にOSSになってます。

hubot.github.com

チャットボットを使って便利に楽しく仕事しようぜ、っていうコンセプトですね。日本でも世界中でもHubotの上にいろんなアプリが作られたと思う。 でもチャットボットって今やHubotだけじゃなくいろんなやり方で作れるのね。

Slack Bot

Slackそれ自体に、Botフレームワークがあります。Events APIってのをリッスンして、いろいろおもしろいことをやれるようになってる。 例えば、チャンネル上の誰かの発言をひたすらオウム返しするボットなら、Slackの設定画面でリスナーのURLをまず下記ページを見て設定した上で、 https://api.slack.com/events-api#subscriptions

下記のようにEvents APIをリッスンするサーバを書けばいい。(Sinatra使ってます)

post '/listen_to' do
  params = JSON.parse request.body.read
  return params['challenge'] if params.has_key?('challenge') #Botの最初のセットアップ時に必要なレスポンス
  return if params['event'].has_key?('bot_id') #自分自身にオウム返しをしないようにチェックしてる
  return if params['event']['text'].start_with?("/") #スラッシュコマンドを除外

  uri = URI.parse("https://slack.com/api/chat.postMessage")
  request = Net::HTTP::Post.new(uri)
  request.content_type = "application/json"
  request.add_field("Authorization", "Bearer <TOKEN>") 
  request.body = JSON.dump({
    "channel" => params['event']['channel'],
    "text" => params['event']['text']
  })

  req_options = {
    use_ssl: uri.scheme == "https",
  }

  response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
    http.request(request)
  end
end

適当なコードなのは勘弁してほしいけど、EventをリッスンしてPOSTメッセージをSlackから受け取ったら、その内容をそのままSlackのchat.postMessageというAPIを使って返すだけ。かんたん。 今までずっとHubotを通してSlackボットを作ってたので、Slack自体にBotフレームワークがあることに気づいたのは最近です。

ちなみに備忘だけど、Hubotを使ってSlackと連携する際には下記のフレームワークを使うと楽です。

slackapi.github.io

DialogFlow

チャットボットを作ろうと思ったら、やっぱり近頃流行りの人工知能的なアレをやりたいよね。昔懐かしの人工無能でもいいんだけど、ともあれ。 Googleapi.aiを買収して、カンバンのつけかえをしたDialogFlowを使うのがやはりストレートでしょうか。これ系で今Googleに勝てるプラットフォームはないと思う‥ちなみに5月にGoogleI/Oに行ったときにもこれをいじって遊んだ。日本語にも一応対応しているのがポイント高い。

GUIでポチポチ会話のパターンみたいなのを入れておくと、いい感じに喋ってくれます。バックエンドで機械学習してくれるみたいで、だんだん賢くなるのではないかと期待させる。機械学習と言われるとなんでもできるように感じさせるマジック!

dialogflow.com

実はDialogFlowにSlack連携があるの知ってました?

DialogFlow -> Slack

DialogFlowで作ったIntentをSlackに連携するボタンがあって、それを押してSlack側で認証してあげると、Slack内でDialogFlowがボットとして会話の相手をしてくれます。 f:id:ikeike443:20171217165436p:plain

先程のオウム返しSlackボット(Slack API Tester)と同じ部屋で会話してやるとこんな感じになる。 f:id:ikeike443:20171217165811p:plain DialogFlowBotさん、Slackボットのことは無視するのね。

HubotにもDialogFlowとのIntegrationがあるといいね。

DialogFlow -> Google Home

DialogFlowで作ったIntentはGoogle HomeのActionとして使える。さっき見せたDialogFlowのIntegration画面にGoogle Assistantというのがあるから、そのボタンを押して支持に従うと、Google Homeを通してDialogFlowと会話ができる。 Google HomeのテストもWebで簡単にできるように作られてていい感じ。 f:id:ikeike443:20171217170428p:plain

Probot

ところでGitHubは最近、Hubotの延長となるOSSプロジェクトを始めていて、GitHub.comにGitHub Appsとしてインストールして、BotにIssueの掃除をさせたり、何かアラートを出させたり、ってことができるようにしている。 Probotっていうんだけど、意外と日本では知られてないので、一応ここで言及しておきます。

probot.github.io

GitHub Enterpriseでもいずれ使えるようにするんじゃないかなーと思う。 ProbotもDialogFlowやGoogleHomeと連携できると楽しいよね。

結論

は特にないんだけど、ただのメモだから。 まあ思ったのは、HubotやProbotとDialogFlowのインテグレーションをイケてる感じに作れると、Google Homeを通してデプロイを指示したり、GitHubにたまってるIssueを整理したり、今週のTODOを確認したり、できそう。Pull Request上でProbotに何か指摘されて、そのコンテキストをSlackに持ち込んでBotと会話して問題解決するとか、その結果をGoogle Homeを通して音声で受け取るとか、色々やれそうだよね。

どのデバイス、プラットフォームから話しかけても、適切なコンテキストを適切に引き回して、仕事をサポートしてくれるといいなあ。Google Homeに話しかけて仕事をスタートして、その同じコンテキストを前提にしてSlackで会話し、GitHub Issue上で会話し、みたいにできると楽だなあ。