LoginSignup
20
23

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-05-06

はじめに

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

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への登録が必要になります。
法人情報の入力を勧められますが、無視して問題ないです。

スクリーンショット 2016-04-16 23.26.23.png

アプリケーション登録

【雑談対話API】を使うために、アプリケーションの登録をします。
ログインした状態で新規API利用申請へをクリックしてアプリケーション登録しましょう。

スクリーンショット 2016-04-16 23.33.37.png

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

スクリーンショット 2016-04-17 15.10.21.png

アプリケーション情報を確認すると、下記情報が取得出来ているかと思います。

・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導入方法

スクリーンショット 2016-04-30 8.27.45.png

Server IP WhitelistへのIP設定

ダッシュボードで確認したOutbound IP値を2つをLINE Developers の Server IP Whitelist に登録します。
スクリーンショット 2016-04-23 22.49.29.png

Callback URL を設定

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

スクリーンショット 2016-04-23 23.04.16.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

実装

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

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

みつをです。

終わりに

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

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

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

20
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
23