LINE BOT API Trialで自作のchatbotを動かす

LINE BOT API Trialで自作のchatbotを動かす

author potpro(ぼとぷろ)
2016/05/04

LINE BOT API Trialで自作のchatbotを動かす

4月ごろから、LINE BOT API Trial版が一般向けに公開されました。

元々先着1万名だったのですがそれは撤廃されて、GWが始まったくらいに再開され誰でも使えるように。

友達50人に制限されていますが、お試し版ということで普段使っているLINEでbotを作れるのは面白いということで注目度は高いですね。

「LINE BOT API Trial Account」の募集再開--ID検索にも対応 http://japan.cnet.com/news/service/35081826/

ここで、思い出してみますと、 某所で作ったchatterbot「ゆうき」ちゃんを流用することで、LINEのりんねみたいにLINEで話せるじゃあないですか。

GWだけどぼっちでやることなかったので、ちょうどいいです。

これで何時間でも飽きるまでLINEできます!やったリア充だ!

まずはアカウント取得。当然ながらLINEのアカウントが必要です。 (どうでもいいけど、LINEとNaverのアカウントって別なんだよね ここまではすんなり行けると思います。誰でも。

後は、botアカウントを作って、QRコードから友達になれるかまず確認。 これで数少ないLINEの友達が増えました。しかし、当然ながらこのままだと話しても何も返ってこないただのカカシ状態。 yuki

ここで、LINE BOT APIの構造をかなり簡単に説明。

BOTに話しかけると、BOT管理者が設定したcallback URLに話しかけた情報がPOSTされます。 その情報をもとに、自分のサーバで処理を行い、LINEのAPIサーバにPOSTを送ることで、BOTが返答します。

こんな感じ、簡素ですが、その分かなり簡単です。 なお、署名キーも送られてくるため検証も可能です。

問題点として、httpsオンリーという制約がちょっとだけ重たいですが、let's encryptやStart SSLも正式に対応したのでお金もかからず簡単に作れると思います。

いつものように、処理サーバはnode.js(javascript)で作ってます。ざっと見た感じ、node.jsで動かしてる記事は無かったのでちょうどいいですね。 node.js(Expressフレームワーク)環境です。

chatbotのソースは省きます。検証も省いてます。 外部モジュールとしてfetch APIのようなものであるsuperagent使ってます。

var request = require('superagent');
var express = require('express');
var app = express();
//expressの設定等は省きます このままだと多分動きません
app.post('/line/callback', function (req, res) {
    if (req != undefined && req.body != undefined) {
        var linecontent = req.body.result\[0\].content;
        if (linecontent) {
            //テキストメッセージのみ対応してます
            if (linecontent.contentType == 1) {
                var linetext = linecontent.text; //テキストデータ
                var linefrom = linecontent.from; // 送信ユーザのMID
                var token = "token";
                //chatbotの処理
                api.gettext(linetext, token, function (restext) {
                    //callbackのrestextがchatbotの返答
                    //LINE BOT APIサーバにPOST
                    var sendmessage = {};
                    sendmessage\["to"\] = \[linefrom\];
                    sendmessage\["toChannel"\] = 1383378250; //固定値
                    sendmessage\["eventType"\] = "138311608800106203"; //固定値
                    sendmessage\["content"\] = {};
                    sendmessage\["content"\]\["contentType"\] = 1;
                    sendmessage\["content"\]\["toType"\] = 1;
                    sendmessage\["content"\]\["text"\] = restext;
                    //console.dir(sendmessage);
                    request.post("https://trialbot-api.line.me/v1/events")
                        .set('Content-Type', 'application/json; charset=UTF-8')
                        .set('X-Line-ChannelID', \[APIChannelID\])
                        .set('X-Line-ChannelSecret', \[APIChannel Secret\])
                        .set('X-Line-Trusted-User-With-ACL', \[APIMID\])
                        .send(sendmessage)
                        .end(function (res) {
                        });
                });
            } else {
                //非対応!
            }
        }
    }
    res.send("res");

});

動かしてみるとこんな感じ。いやーやっぱりこういうのはなんか作ってると愛着湧いてきますね。

yukiline

chatbotに関して、自作と書いてますが、別に全部作ったものではなく、

歴史あるchatterbotであるreudy1.9©Gimite,Glass_sagaを改変したものとなってます。

まだ機械学習という言葉無い時代のものですが、よくできてると思います。

その他ハマった点

多分レアケースなはまり方。 というかプロキシ立ち上げてる人くらいしか躓かないと思うが、自分の環境でのミス。

header

headerはHOST:https://domain.com:443/callback といった形になります。 自分はheaderをHOST:https://domain.com/callback に振り分けていたため、動作せず数分悩みました。

headerで振り分けなんかをしている人は要注意です。

Let's encryptを使う場合、中間CA証明書が必要

CA Listに記載されているルートCA証明書を含んだ公開鍵証明書が使えるため、Let's encryptの中間CA証明書が必要になります。 なのでプロキシ環境では公開鍵としてfullchain.pemを使う必要があります。 Let's encryptじゃなくても中間CA証明書が無いと多分動作しません。

アクセスログにも表示されないので注意。

元々Let's encryptは使えなかったようですが、今回は更新したてのほやほやでしたが使えました(ハマった点を除いて)。Let's encrypt Autority X3なら問題ないかと。