LINE BOT APIで会社のマスコットキャラに命を吹き込む


LINEの「BOT API Trial Account」が先着1万名限定で自由に開発できるということなので、ドコモの雑談対話APIと組み合わせて、
弊社[School With](https://schoolwith.me)のマスコットキャラクター「[うぃず吉](https://twitter.com/schoolwith)」に命を吹き込みたいと思います。  
![うぃず吉](https://qiita-image-store.s3.amazonaws.com/0/3962/7055956b-9d71-b490-a792-1286595944a4.jpeg)


## 用意するもの
- [LINE BOT API Trial Account](https://business.line.me/services/products/4/introduction)
- [ドコモ雑談対話API用アクセスキー](https://dev.smt.docomo.ne.jp/)
- SSL証明書が設置されたWebサーバ

#### LINE BOT APIアカウントを取得
取得したら下記をメモっておきましょう

- CHANNEL ID
- CHANNEL SECRET
- MID

![スクリーンショット_2016-04-14_21_36_20.png](https://qiita-image-store.s3.amazonaws.com/0/3962/b66b4fbc-9aee-ca90-f0cd-20bd8e57775e.png)

CallBack URLはこんな感じでポート番号まで指定してください。
https://example.com:443/callback

またServer IP Whitelistには用意したWebサーバのIPを入力してください。

#### ドコモ雑談対話API用アカウントを取得
取得したら下記をメモっておきましょう

- API Key

![スクリーンショット_2016-04-14_21_43_49.png](https://qiita-image-store.s3.amazonaws.com/0/3962/514bd32d-6e3c-a82a-855a-b9d35b3c00fb.png)

#### SSL証明書が設置されたサーバを用意
無料の証明書Let's Encryptは使えませんでした。
HerokuにFixieというアドオンを導入すれば無料で使えるようです。
↓

http://qiita.com/yuya_takeyama/items/0660a59d13e2cd0b2516

### アプリケーションコード

- Silex(PHP)
- Redis

RedisにコンテキストIDを保存するようにします。
ドコモ雑談対話APIにはPHP用のライブラリがあったのでそちらを使います。

```index.php
<?php
// 設定
define('DOCOMO_API_KEY', '');
define('DOCOMO_MODE', 'dialog');
define('LINE_CHANNEL_ID', '');
define('LINE_CHANNEL_SECRET', '');
define('LINE_MID', '');

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

$app = new Silex\Application();
$app->post('/callback', function (Request $request) use ($app) {
    // リクエスト取得
    $request = file_get_contents("php://input");
    $json = json_decode($request);
    $content = $json->result[0]->content;
    $message = $content->text;
    // コンテキストIDを取得
    $from = $content->from;
    $redis = new Redis();
    $redis->connect("127.0.0.1",6379);
    $context = $redis->get($from);
    // 送信パラメータの準備
    $dialog = new Dialogue(DOCOMO_API_KEY);
    $dialog->parameter->reset();
    $dialog->parameter->utt = $message;
    $dialog->parameter->context = $context;
    $dialog->parameter->mode = DOCOMO_MODE;
    // 対話
    $ret = $dialog->request();
    // コンテキストIDを保存
    $redis->set($from, $ret->context);
    $response_format_text = [
        'contentType' => 1,
        "toType" => 1,
        "text" => "$ret->utt"
    ];
    $post_data = [
        "to" => [
            $from
        ],
        "toChannel" => "1383378250", // 固定値
        "eventType" => "138311608800106203", // 固定値
        "content" => $response_format_text
    ];
    // LINEに送信
    $ch = curl_init("https://trialbot-api.line.me/v1/events");
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data));
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/json; charser=UTF-8',
        "X-Line-ChannelID: " . LINE_CHANNEL_ID,
        "X-Line-ChannelSecret: " . LINE_CHANNEL_SECRET,
        "X-Line-Trusted-User-With-ACL: " . LINE_MID,
    ]);
    curl_exec($ch);
    curl_close($ch);
    
    return 'OK';
});
$app->run();
```

ソースコードはこちら
https://github.com/YuzuruS/line

### 結果

![aIMG_3645.jpg](https://qiita-image-store.s3.amazonaws.com/0/3962/e97de315-4b12-8ec4-e8d0-38dbdc53bc7e.jpeg)

なんとか会話になってますねｗ