LINE Bot で Docomo雑談APIとトークする

#はじめに
LINE BOT APIが公開されましたね。 

雑談BOTをいまさら作ります。
なんでこんなに遅くなったかというと、LINEからのPOSTがなく、一週間近く経ったからです。
~~やる気が無くなり、Qiitaで記事を書くのをストップしてました。~~
すぐ設定が反映される人とそうでない人がいるようです。

だいぶ時間が経過しましたが、ずらずらと概要を書いていきます。

##必要なもの
**・BOT API Trial Account**
**・Docomo雑談対話API**
**・Heroku**
**・Heroku Redis**

#BOT API Trial Account取得
![スクリーンショット 2016-04-17 14.57.09.png](https://qiita-image-store.s3.amazonaws.com/0/50208/0d234588-40c9-0038-56b9-60be59f0374d.png)

LINE Bot APIを使うには[BOT API Trial Account](https://business.line.me/services/products/4/introduction)への登録が必要です。
必要な項目を入力して登録すると、LINE Bot APIを使うときに必要なものが取得できます。

**・Channel ID**
**・Channel Secret**
**・MID**

#Docomo 雑談対話API
BOT API Trial Accountが手に入ったので、雑談してくれるAPIを探します。
今は色々なものがAPIとして公開されてますからね。
先人たちの知恵を借りて賢く生きましょう。

Google先生に聞くと【Docomo 雑談対話API】という、いい感じのものが出てきました。
ありがとう。Docomoさん。

##docomo Developer support への登録

[Docomo雑談対話API](https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=dialogue&p_name=api_reference)を使うためには、[docomo Developer support](https://dev.smt.docomo.ne.jp/?p=login)への登録が必要になります。
法人情報の入力を勧められますが、無視して問題ないです。

![スクリーンショット 2016-04-16 23.26.23.png](https://qiita-image-store.s3.amazonaws.com/0/50208/2c259a6a-7900-16a1-9b70-8897d3d665ce.png)


##アプリケーション登録
【雑談対話API】を使うために、アプリケーションの登録をします。
ログインした状態で[新規API利用申請へ](https://dev.smt.docomo.ne.jp/?p=mypage.api.new.input)をクリックしてアプリケーション登録しましょう。

![スクリーンショット 2016-04-16 23.33.37.png](https://qiita-image-store.s3.amazonaws.com/0/50208/bfab0e48-f29b-8734-abf6-5e1940a14027.png)


そして、次の画面で【雑談対話API】を選択して、利用申請をすればOKです。

![スクリーンショット 2016-04-17 15.10.21.png](https://qiita-image-store.s3.amazonaws.com/0/50208/6751b6ba-62ed-629f-01f9-f71820e566cc.png)

[アプリケーション情報](https://dev.smt.docomo.ne.jp/?p=mypage.api.index)を確認すると、下記情報が取得出来ているかと思います。

**・client id**
**・client secret**
**・API key**

何をリクエストできてレスポンスが何かは[こちら](https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=dialogue&p_name=api_1#tag01)をご覧ください。

#Heroku で環境構築
それでは、実際に動作する環境を作っていきましょう。
[Herokuの簡単な使い方](http://qiita.com/Arashi/items/b2f2e01259238235e187)はこちら。

HerokuにFixieというアドオンを導入すれば上手い具合に動くということですので、それでいきます。
ただし、クレジットカード情報を入力しなければ使用できないみたいなので、そちらの入力もしておきましょう。

今回はPHPで書いていきますので、下記手順で環境を整えていきます。

**Getting Started on Heroku with PHP**
[・Introduction](https://devcenter.heroku.com/articles/getting-started-with-php#introduction)
[・set-up](https://devcenter.heroku.com/articles/getting-started-with-php#set-up)
[・prepare-the-app](https://devcenter.heroku.com/articles/getting-started-with-php#prepare-the-app)
[・deploy-the-app](https://devcenter.heroku.com/articles/getting-started-with-php#deploy-the-app)

設定した環境で、下記コマンドをうちこみ **Fixie** の設定をしていきます。

```sh:
$ heroku addons:create fixie:tricycle
```

これを実行すると 
**・Proxy URL**
**・Outbound IP**
が出力されます。

[ダッシュボード](https://dashboard.usefixie.com/#/account)からも値を確認することができます。

#Heroku Redis設定
DoCoMo雑談APIをいい感じに動かすには、**context**と呼ばれるものをどっかに保存する必要があるようです。
今回はRedisに保存するため、HerokuにRedisを入れていきます。
といっても、難しくないので下記URLを参考に導入してください。
[Heroku Redis導入方法](https://devcenter.heroku.com/articles/heroku-redis#installing-the-cli-plugin)

![スクリーンショット 2016-04-30 8.27.45.png](https://qiita-image-store.s3.amazonaws.com/0/50208/97afcb54-0aea-fe21-d2bb-3abaa556442c.png)


#Server IP WhitelistへのIP設定

[ダッシュボード](https://dashboard.usefixie.com/#/account)で確認したOutbound IP値を２つをLINE Developers の **Server IP Whitelist** に登録します。
![スクリーンショット 2016-04-23 22.49.29.png](https://qiita-image-store.s3.amazonaws.com/0/50208/b07a2641-4b83-af31-e697-64c4f57e23d0.png)

#Callback URL を設定
Callback URL を設定します。
先ほど作成したHerokuアプリのURLを入れましょう。
そのとき、ポート番号を **443**に設定しておいてください。

![スクリーンショット 2016-04-23 23.04.16.png](https://qiita-image-store.s3.amazonaws.com/0/50208/f643f925-f210-291e-3b4c-d8ca6c48d7da.png)

#config設定
Herokuの設定画面で各値を設定していきます。
**・DOCOMO_API_KEY**
**・FIXIE_URL**
**・LINE_CHANNEL_ID**
**・LINE_CHANNEL_SECRET**
**・LINE_CHANNEL_MID**
**・REDIS_URL**

![スクリーンショット 2016-05-06 17.57.36.png](https://qiita-image-store.s3.amazonaws.com/0/50208/14ff00a0-a94e-8bdc-74c7-dd7d7faca659.png)

#実装
実装していきます。
便利なものが用意されていたのでそちらを使わせていただきます。

```php:index.php
<?php

require_once('/app/vendor/autoload.php');
use jp3cki\docomoDialogue\Dialogue;

// アカウント情報設定
$channelId     = getenv('LINE_CHANNEL_ID');
$channelSecret = getenv('LINE_CHANNEL_SECRET');
$mid           = getenv('LINE_CHANNEL_MID');
$proxy         = getenv('FIXIE_URL');
$docomoApiKey  = getenv('DOCOMO_API_KEY');
$redisUrl      = getenv('REDIS_URL');

// メッセージ受信
$json_string  = file_get_contents('php://input');
$json_object  = json_decode($json_string);
$content      = $json_object->result{0}->content;
$text         = $content->text;
$from         = $content->from;
$message_id   = $content->id;
$content_type = $content->contentType;

// $contextの設定
$redis   = new Predis\Client($redisUrl);
$context = $redis->get($from);

$dialog = new Dialogue($docomoApiKey);

//Docomo  送信パラメータの準備
$dialog->parameter->reset();
$dialog->parameter->utt = $text;
$dialog->parameter->t = 20;
$dialog->parameter->context = $context;
$dialog->parameter->mode = $mode;

$ret = $dialog->request();

if ($ret === false) {
    $text = "通信に失敗しました";
}

$text = $ret->utt;
$redis->set($from, $ret->context);

$post = <<< EOM
{
    "to":["{$from}"],
    "toChannel":1383378250,
    "eventType":"138311608800106203",
    "content":{
        "toType":1,
        "contentType":1,
        "text": "{$text}"
    }
}
EOM;

$headers = array(
    "Content-Type: application/json",
    "X-Line-ChannelID: {$channelId}",
    "X-Line-ChannelSecret: {$channelSecret}",
    "X-Line-Trusted-User-With-ACL: {$mid}"
);

$url = "https://trialbot-api.line.me/v1/events";

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
//プロキシ経由フラグ
curl_setopt($curl, CURLOPT_HTTPPROXYTUNNEL, 1);
//プロキシ設定
curl_setopt($curl, CURLOPT_PROXY, $proxy);
$output = curl_exec($curl);
```

ベタ書きですね。はい。
これはひどい。

トーク結果はこんな感じです。

![スクリーンショット 2016-05-07 1.28.22.png](https://qiita-image-store.s3.amazonaws.com/0/50208/53d3be8f-d516-1e2c-a8cf-57df9af32e3f.png)

みつをです。


#終わりに
ほんと、大変でした。
冒頭でも書きましたが、POSTされない事件によって疲れてました。

ちょうどFacebookAPIでも同じようなことが出来そうだったのでそちらに行こうかと思った瞬間POSTされました。
LINEのツンデレ具合に振り回されるメンズです。

ともあれ、便利なものがあるもんですね。