#はじめに
LINE BOT APIが公開されましたね。
雑談BOTをいまさら作ります。
なんでこんなに遅くなったかというと、LINEからのPOSTがなく、一週間近く経ったからです。
やる気が無くなり、Qiitaで記事を書くのをストップしてました。
すぐ設定が反映される人とそうでない人がいるようです。
だいぶ時間が経過しましたが、ずらずらと概要を書いていきます。
##必要なもの
・BOT API Trial Account
・Docomo雑談対話API
・Heroku
・Heroku Redis
LINE Bot APIを使うにはBOT API Trial Accountへの登録が必要です。
必要な項目を入力して登録すると、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を使うためには、docomo Developer supportへの登録が必要になります。
法人情報の入力を勧められますが、無視して問題ないです。
##アプリケーション登録
【雑談対話API】を使うために、アプリケーションの登録をします。
ログインした状態で新規API利用申請へをクリックしてアプリケーション登録しましょう。
そして、次の画面で【雑談対話API】を選択して、利用申請をすればOKです。
アプリケーション情報を確認すると、下記情報が取得出来ているかと思います。
・client id
・client secret
・API key
何をリクエストできてレスポンスが何かはこちらをご覧ください。
#Heroku で環境構築
それでは、実際に動作する環境を作っていきましょう。
Herokuの簡単な使い方はこちら。
HerokuにFixieというアドオンを導入すれば上手い具合に動くということですので、それでいきます。
ただし、クレジットカード情報を入力しなければ使用できないみたいなので、そちらの入力もしておきましょう。
今回はPHPで書いていきますので、下記手順で環境を整えていきます。
Getting Started on Heroku with PHP
・Introduction
・set-up
・prepare-the-app
・deploy-the-app
設定した環境で、下記コマンドをうちこみ Fixie の設定をしていきます。
$ heroku addons:create fixie:tricycle
これを実行すると
・Proxy URL
・Outbound IP
が出力されます。
ダッシュボードからも値を確認することができます。
#Heroku Redis設定
DoCoMo雑談APIをいい感じに動かすには、contextと呼ばれるものをどっかに保存する必要があるようです。
今回はRedisに保存するため、HerokuにRedisを入れていきます。
といっても、難しくないので下記URLを参考に導入してください。
Heroku Redis導入方法
#Server IP WhitelistへのIP設定
ダッシュボードで確認したOutbound IP値を2つをLINE Developers の Server IP Whitelist に登録します。
#Callback URL を設定
Callback URL を設定します。
先ほど作成したHerokuアプリのURLを入れましょう。
そのとき、ポート番号を 443に設定しておいてください。
#config設定
Herokuの設定画面で各値を設定していきます。
・DOCOMO_API_KEY
・FIXIE_URL
・LINE_CHANNEL_ID
・LINE_CHANNEL_SECRET
・LINE_CHANNEL_MID
・REDIS_URL
#実装
実装していきます。
便利なものが用意されていたのでそちらを使わせていただきます。
<?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);
ベタ書きですね。はい。
これはひどい。
トーク結果はこんな感じです。
みつをです。
#終わりに
ほんと、大変でした。
冒頭でも書きましたが、POSTされない事件によって疲れてました。
ちょうどFacebookAPIでも同じようなことが出来そうだったのでそちらに行こうかと思った瞬間POSTされました。
LINEのツンデレ具合に振り回されるメンズです。
ともあれ、便利なものがあるもんですね。