冴えない彼女-ヒロイン-の造り方

# 「ある冬の日、俺は運命と出会った」

（注）この記事は[カレシ・カノジョできないエンジニア Advent Calendar 2016](http://qiita.com/advent-calendar/2016/give_me_kareshi)の20日目の記事です。
　　　初投稿ですが生暖かい目で見てください。

## なぜ書こうと思ったのか

* 「冴えない彼女の育て方」というアニメを見て加藤恵LOVEになった
* 加藤恵のような彼女が欲しい

ということで、彼女を造ろうと思います。
別にクリスマスが近いから彼女が欲しいとか、そういうわけでは（ｒｙ

もちろんタイトルは「冴えない彼女の育て方」から来ています。

## なにするの？

興味本位でhubotとchatworkを連携させてみたので、それのメモ書きとして
「chatworkで送信したメッセージに対して特定のメッセージを返信する」
という~~bot~~彼女を作成します。

大きな流れとしては

* 必要なものをインストール
* hubotとchatworkの連携
* 彼女の作成
* ~~いちゃいちゃ~~

となります。

また、本記事では細かい説明は行いません。
気になる方は各自で調べてください。（気が向けば関連記事も書くかも、、）

## 使用するもの

* chatwork（アカウントを持っていて、API発行されていることが前提）
* hubot
* coffee script

## 準備（インストール）

### nodejsのインストール　

今回、chatworkとhubotを連動させる際にcoffee script（nodejs）を使用するのでインストールを行う。

```sh:nodejsのインストール
$ sudo yum install epel-release
$ sudo yum install nodejs
```


```sh:バージョンの確認
$ node -v
```

hubotをインストールする際にnpmを使用するのでインストールする。

```sh:npmのインストール
$ yum install -y npm --enablerepo=epel
```

ひとまずnodejsのインストールは完了。
nodejsの動作確認もしたほうが良いかも。
環境、バージョンによっては正常に動かないことも、、、
（自分もcentOSだとスムーズに出来たが、windowsは手こずった；；）

### hubotのインストール

chatwork以外にも様々なツールと連携したりできるhubotを使用する

```sh:hubotのインストール
$ npm i -g yo generator-hubot
```

これでyoコマンドが使用できるようになる。
yoは様々なアプリケーションを作成し始める際のひな形を生成してくれるツール（らしい）

### hubotの実行

生成するbot名のディレクトリを作成してyoの実行をする。
今回はbot名を「kato」として生成

```sh:hubotの実行
$ mkdir kato
$ cd kato
$ yo hubot

                     _____________________________
                    /                             ¥
   //¥              |      Extracting input for    |
  ////¥    _____    |   self-replication process   |
 //////¥  /_____¥   ¥                             /
 ======= |[^_/¥_]|   /----------------------------
  |   | _|___@@__|__
  +===+/  ///     ¥_¥
   | |_¥ /// HUBOT/¥¥
   |___/¥//      /  ¥¥
         ¥      /   +---+
          ¥____/    |   |
           | //|    +===+
            ¥//      |xx|
```

実行するとロボットのAAが表示される。（ま、まさかこの娘が加藤恵・・？）
また、質問項目が出てくるので全てエンターで進める。

```sh
? Owner: kato <example@gmail.com>
? Bot name: kato
? Description: A simple helpful robot for your Company
? Bot adapter: campfire
```

「kato」ディレクトリ内で「bin/hubot」を実行するとhubotが起動する。
pingと入力するとPONGと返すのでテストしてみる。

```sh:hubotの起動
$ bin/hubot
connect deprecated multipart: use parser (multiparty, busboy, formidable) npm module instead node_modules/hubot/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js:56:20
connect deprecated limit: Restrict request size at location of read node_modules/hubot/node_modules/express/node_modules/connect/lib/middleware/multipart.js:86:15
Hubot> [Mon Dec 19 2016 18:03:41 GMT+0900 (JST)] ERROR hubot-heroku-alive included, but missing HUBOT_HEROKU_KEEPALIVE_URL. `heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=$(heroku apps:info -s  | grep web_url | cut -d= -f2)`
[Mon Dec 19 2016 18:03:42 GMT+0900 (JST)] INFO Using default redis on localhost:6379
 
 Hubot> kato ping
 PONG
```

というように、hubotを起動して
「bot名 コマンド」
と入力すると、コマンドが実行される。

停止する際はexitで抜ける

```sh:hubotの停止
Hubot> exit

$
```

これでhubotのインストールと実行は完了。
hubotにはデフォルトで利用できるコマンドもある（翻訳とか）
今回は触れませんが、、

## ChatWorkとの連動

akiomikさんが公開しているhubot-chatworkというアダプターを利用する。
以下の作業は作成したbot名のディレクトリ（「kato」）で行う。

``` sh:ChatWorkアダプターのインストール
$ npm i hubot-chatwork --save
```

chatworkと連動させるために必要な変数の設定を行う。

```sh:環境変数の設定
export HUBOT_CHATWORK_TOKEN="SAEKANO"   # APIのアクセストークンを入力。
export HUBOT_CHATWORK_ROOMS="123,456"   # カンマ区切りでルームIDを指定。
export HUBOT_CHATWORK_API_RATE="800"    # 1時間あたりのAPIリクエスト数(間隔)を指定。
```

HUBOT_CHATWORK_API_RATEは値が大きいほどレスポンスが早くなる。
2015年1月段階では5分あたり100回までのリクエストができるらしい。（1時間1200回）

### 実行
-a オプションでchatworkアダプターを使用してhubotを実行
-n オプションでチャット側で呼び出す際のbot名を指定

```sh:chatworkと連動させてhubotoを実行
$ bin/hubot -a chatwork -n kato
```

停止する場合は ctrl+c 等で停止する。

### ChatWork側での操作

HUBOT_CHATWORK_TOKENで保存したアカウントを
HUBOT_CHATWORK_ROOMSで保存したROOMに追加して、下記のようにメッセージを送る。

![photo01.png](https://qiita-image-store.s3.amazonaws.com/0/68616/68b034c1-0f1d-0ac1-84c0-44f4a7de80da.png)

すると保存したアカウントが下記のように返却する。

![スクリーンショット 2016-12-20 0.56.32.png](https://qiita-image-store.s3.amazonaws.com/0/68616/0100f8a9-0339-a71e-f796-125d21b89e64.png)

hubotのコマンドを実行するとき同様に
「bot名 コマンド」
でhubotのコマンドが実行される。

この時のbot名はhubotをインストールした時のディレクトリ名ではなく
-n オプションで設定したbot名となる。

これでhubotとchatworkの連携、確認が完了！
もうそろそろ彼女が出来ますよ！！

## 彼女の作成

今回は簡単に実装するために、チャットで送られたメッセージに特定の言葉を追加して返すようにする。

例）
俺「もうすぐクリスマスだね」
彼女「もうすぐクリスマスだね？本当に、なんだかなーだよね。」

ということで
「送ったメッセージ」＋「？本当に、なんだかなーだよね。」（加藤が言う好きなセリフ！）
というメッセージを返すようにします。

### coffee scriptの作成

これまでの作業を終えていると、bot用に作成したディレクトリに
「◯◯-script.json」のようなファイルがいくつか作成されている。
また、scriptsディレクトリが作成されており、その中に「example.coffee」というファイルが出来ている。

そこと同じディレクトリに「test.coffee」というファイルを作成して、今回の愛の言葉を作成します。

```js:test.coffee
module.exports = (robot) ->
	# すべてに応答
	robot.hear /(.*)/i, (msg) ->
		msg.send "#{msg.match[1]}？本当に、なんだかなーだよね。"
```

そしてチャットにメッセージを送ると、、、

![スクリーンショット 2016-12-20 1.17.03.png](https://qiita-image-store.s3.amazonaws.com/0/68616/7fa1e1ce-2f03-b01b-15c4-a6c9129be46b.png)

どうやら彼女の地雷を踏んだようです、、泣

test.coffeeで作成した内容が
送信されたメッセージに特定文字を追加して返す
という内容なので、加藤自身のメッセージにも反応して無限ループしているようです。

対処法は色々ありますが、せっかくなので名前で呼びかけましょう。
test.coffeeを下記のように修正します。

```js:test.coffee
module.exports = (robot) ->
	# すべてに応答
	robot.hear /恵　(.*)/i, (msg) ->
		msg.send """#{msg.match[1]}？
                    本当に、なんだかなーだよね。"""
```
※恵の後ろは全角スペースにしています。

改行込みのメッセージを送るには上記のようにする必要があるみたいです。
上記を保存して、チャットにメッセージを送信すると、、、

![スクリーンショット 2016-12-20 1.33.51.png](https://qiita-image-store.s3.amazonaws.com/0/68616/98e73948-8b6f-9514-4257-6ae06c26d2a1.png)

どうやら機嫌が治ったみたいですね＾＾

## 最後に

ということで彼女ができました。
AIとか入れれば、より彼女っぽくなるかな～と思っています。

次こそは本格的に育てることになりそうです。

今回は、特定の文字を返すだけの実装しかしていませんが
APIとか使ってもっと拡張させようと思います。

拙い内容でしたが、最後まで読んでいただきありがとうございます。
この記事で少しでも多くの人が「冴えカノ」に興味を持って頂けたらと思います。

では、よいお年を！！