UserLocalの自動会話APIでslack Bot

## はじめに
弊ラボではslack的なチャットアプリとして[Mattermost](http://www.mattermost.org/)を運用していて、そこにHubotで作ったbotを住まわせて何かを喋らせたりしていたのですが、ひょんなことから雑談機能を追加してしまったのです。  
以前置いていたのは、[こちらの記事](https://pasero.net/~mako/blog/s/685)などを参考に少し改変したものだったのですが、利用していた[Docomoの雑談対話API](https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=dialogue&p_name=api_usage_scenario)がちょっとあまりいいとは言えない感じの受け答えしかできていなかったので、『人工無能を自前で実装しやがれ』とか利用者の怖い人に脅されたりしてました。  
実際、そちらのAPIは、レスポンスに含まれる`context`を送り返すことでいい感じに会話できるみたいな感じなのですが、この機能を利用すると、会話の中でのキーワード的なのをいつまでも覚えてしまって、まともに対話できなくなってしまいます。`context`自体はリクエストには任意なので、毎回破棄してもいいのですが、そうなると今度は一回きりの応答が返ってくるだけになってしまい、会話になりません。  
自分で会話機能をすべて実装してしまえば困ることもないのですが、そちらは本職ではないので適当なAPIを探していたところ、User Localさんから[人工知能ボットAPI](http://ai.userlocal.jp/)というのが公開されると聞いて、速攻で募集に応募していました。
今回は、6月15日にそのAPIキーが配布されたので、こいつをHubotに組み込んでみた的な話です。
興味のある方は、リンク先で第2期募集の申込受付をしているみたいなので、申し込んでみるといいかと思います。
slackはもちろんLINEやTwitterとも連携できるみたいなので、何か楽しいことをして記事を書いたらいいと思います。LINE botなどは結構流行りそうな感じしてるので、連携させたら面白いかもですね。

今回は以前に置いてあったスクリプトをちょちょいと書き換えたので、その報告です。

## UserLocal 人工知能ボットAPI
普通に会話ができる機能だけが目当てで応募してみたのですが、中には他の機能も少し入ってるみたいなので紹介してみます。
keyが配布される前でも、一時間に10回までなら`key=sample`で叩けるみたいなので、『申し込むか迷ってる』みたいな人は試してみるといいと思います。
#### 自動会話API
いわゆる人工知能的な何かと会話的な何かができるっぽい機能。今回の目的。
エンドポイントは、https://chatbot-api.userlocal.jp/api/chat でパラメータに`key`と`message`を入れると返してくれる。
#### キャラクター会話変換API
"cat", "dog", "roujin"という3つのキャラクターになりきれるという機能。
会話APIのレスポンスをこちらに流してからslack等に流すことで、自動会話と連携できるかなと思う。
個人的には、自動会話に組み込んで欲しかった。
エンドポイントは、https://chatbot-api.userlocal.jp/api/character で`key`と`message`と`character_type`をパラメータとして渡す。
#### 氏名自動識別API
名前を渡すと、姓名に分割して、男女を識別(信頼度を5段階評価)、さらにはニックネームをたくさん返してくれるらしいAPI。楽しいことはできそうだけどよくわからないので、今回は使用していない。
ちょっとだけ試してみたら、僕の名前は信頼度5で男性だった。読みも合ってた。
エンドポイントは、https://chatbot-api.userlocal.jp/api/name でパラメータとして`key`と`name`を渡す。
#### 形態素解析API
クエリの日本語を、形態素に分けて品詞などを教えてくれる。いわゆる形態素解析をしてくれている。手軽に日本語を解釈するbotを作るとかなるとき、形態素解析だけこっちに投げれる的なそういうやつかな？と思っている。
エンドポイントは、https://chatbot-api.userlocal.jp/api/decompose で、`key`と`message`の他に、詳細を表示するかの`detail`と、最後の単語を無視する`cut_last_word`という二つのパラメータにtrueかfalseを入れて渡す。デフォルトはどちらもfalse。
### その他
今後はまだ増えたりするみたい。ちなみにAPIの制限は`500回/1時間`らしい。いまのところ使うのは会話の機能だけなので、そのくらいあればまぁ十分と思う。

## やってみた
実際にやってみたことはほとんどなくて、[最初の方に紹介した記事](https://pasero.net/~mako/blog/s/685)のendpointとかその辺を少し書き換えていらないところを削ったくらい。
ソースコードはこんな感じ。適当な名前でhubotの`scripts`ディレクトリに入れれば使える。
環境変数として、`HUBOT_UL_API_KEY`に受け取ったAPI keyを入れておく。

```UL-dialogue.coffee
# Description
#   A Hubot script to call User Local dialogue API
#
# Configuration:
#   HUBOT_UL_API_KEY
#
# Commands:
#   hubot 雑談 <message> - 雑談(UserLocal API)
#
# Author:
#   かばやき <@kbyk_01>
#

module.exports = (robot) ->
  status  = {}

  robot.respond /(?:雑談\s+|(?:(?:(様|さま|サマ|殿|どの|さん|サン|はん|どん|やん|ちゃん|チャン|氏|君|くん|クン|たん|タン|先生|せんせ(?:い|ー))(?:、|。|!|！)?))|(?:(?:、|。|!|！)\s*))(.*)/, (res) ->
    message = res.match[2]
    return if message is ''

    res
      .http('https://chatbot-api.userlocal.jp/api/chat')
      .headers('Content-Type': 'application/json')
      .post(JSON.stringify({ message: message, key: process.env.HUBOT_UL_API_KEY})) (err, response, body) ->
        if err?
          console.log "Encountered an error #{err}"
        else
          res.send JSON.parse(body).result
```

使い方としては、例えばslack上で`[bot_name]さん、[message]`とか投げると、`message`がAPIに投げられて、レスポンスがslackに投げられるといった感じ。
hubotは`-l`というオプションで、名前を追加できるので、呼びやすい名前をつけておくと話しかけやすいです。

## 感想
まだ使い始めてそんなに経っていないので、APIがどんな風な返事を返してくるのかは多くわかっていません。ちょっと話しかけた感じでは、比較的短い文で返してくる感じがします。なんかどことなく[りんな](http://rinna.jp/rinna/)っぽい感じです。また、API keyをもとにこちらを識別して、以前の会話の内容を少しは覚えているような感じがしています。  
説明によると、まだまだ発展途上なようなので、今後の展開に期待したいところです。
![スクリーンショット 2016-06-16 1.55.24.png](https://qiita-image-store.s3.amazonaws.com/0/77097/b3953d3f-3af1-b1d9-3fed-58d47e84620b.png)