Messaging APIを使ってLINEBotを作る

Botti Advent Calendarの13日分です。
今回もタイトル通り、Messaging APIを使ってLINEBotを作ります。
では!早速作りましょう!

Messaging APIとは

Messaging API
このサイトを見ていただいた方がいいのですが、要約すると。。。
「LINEを個人にもっと自由に使ってもらえるように解放するよ」というAPIです。

これを使うことによって、自分のサーバプログラムの入出力をLINEというツールで仲介することができます。

つくりかた

0.アカウントを作る
1.サーバ側プログラムをNode.jsで作る。
2.Herokuへデプロイ。
3.LINE側の設定をする。
4.作ったアカウントにメッセージを送る。
5.レスポンスが返ってくる(はず)。

で。今回は「LINEで文字を送信すると、文字数を返すBot」を作ります。

0.アカウントを作る

まずは、LINE BUSINESS CENTERよりMessaging API用のアカウントを作成します。

詳しくは公式サイトを見てください。
LINE BUSINESS CENTER

1.サーバ側プログラムをNode.jsで作る

このサイトに書いてある方のプログラムを参考にさせていただきました。
LINE Messaging API を使用して、会話の「くっころ」…

このプログラム中にある、Channel Access TokenとCHANNELL_SECRETは、新しく作ったアカウントのLINE Developersに飛ぶと書いてあります。

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var crypto = require("crypto");
var request = require('request');
var async = require('async');

app.set('port', (process.env.PORT || 8000));
// JSONの送信を許可
app.use(bodyParser.urlencoded({
    extended: true
}));
// JSONのパースを楽に(受信時)
app.use(bodyParser.json());

app.post('/', function(req, res) {
    async.waterfall([
            function(callback) {
                // リクエストがLINE Platformから送られてきたか確認する
                if (!validate_signature(req.headers['x-line-signature'], req.body)) {
                    return;
                }
                // テキストが送られてきた場合のみ返事をする
                if ((req.body['events'][0]['type'] != 'message') || (req.body['events'][0]['message']['type'] != 'text')) {
                    return;
                }

                if (req.body['events'][0]['source']['type'] == 'user') {
                    // ユーザIDでLINEのプロファイルを検索して、ユーザ名を取得する
                    var user_id = req.body['events'][0]['source']['userId'];
                    var get_profile_options = {
                        url: 'https://api.line.me/v2/bot/profile/' + user_id,
                        json: true,
                        headers: {
                            'Authorization': 'Bearer {Channel Access Token}'
                        }
                    };
                    request.get(get_profile_options, function(error, response, body) {
                        if (!error && response.statusCode == 200) {
                            callback(body['displayName'] + 'さんから送られた文章の\n');
//1対1の対応
                        }
                    });
                } else if ('room' == req.body['events'][0]['source']['type']) {
                    callback('みなさまから送られた文章の\n');
//グループ対1の対応
                }
            },
        ],
        function(displayName) {
            //ヘッダーを定義
            var headers = {
                'Content-Type': 'application/json',
                'Authorization': 'Bearer {Channel Access Token}',
            };

            // 送信データ作成
            var data = {
                'replyToken': req.body['events'][0]['replyToken'],
                "messages": [{
                    "type": "text",
                    "text": displayName + '文字数は ' + textcount(req.body['events'][0]['message']['text']) + '文字です。'
                }]
            };

            //オプションを定義
            var options = {
                url: 'https://api.line.me/v2/bot/message/reply',
                headers: headers,
                json: true,
                body: data
            };

            request.post(options, function(error, response, body) {
                if (!error && response.statusCode == 200) {
                    console.log(body);
                } else {
                    console.log('error: ' + JSON.stringify(response));
                }
            });
        }
    );
});

app.listen(app.get('port'), function() {
    console.log('Node app is running');
});

function textcount(body) {
    return body.length;
}

// 署名検証
function validate_signature(signature, body) {
    return signature == crypto.createHmac('sha256', 'CHANNELL_SECRET').update(new Buffer(JSON.stringify(body), 'utf8')).digest('base64');
}

といった感じにソースコードをザッと書きます。

詳しい使い方はリファレンスを見てください。
LINE API Reference

2.Herokuへデプロイ

詳しく書かれている方がいらっしゃるのでこちらのサイトを参考にしてください。
Node.jsアプリをHerokuへデプロイ

3.LINE側の設定をする

先ほどと同様で、新しく作ったアカウントのLINE Developersに飛ぶとWebhook URLという欄がありそこにHerokuの自分のプログラムのURLを記載します。
おそらく、「https://Herokuのアプリ名.herokuapp.com/」になると思います。

4,5.作ったアカウントにメッセージを送る


この「かぞえます。」はこのサーバ側のプログラムを少し改良したもので、原稿用紙に書いた際に何枚何行になるかまで計算して出力してくれるようになっています。

まとめ

このAPIを使えば、LINEを通して使用したいプログラムを作り使うことができます。
今回は、カウントしてくれるものでしたが、アカウントごとにメールアドレスを設定してメールをLINEに自動転送してくれるようなものまで作ることができます。
(IFTTTを使えばそんなようなものを簡単に作ることもできます)
皆さんもいろいろなものを作ってみてください!

以上、Messaging APIを使ってLINEBotを作るでした!

Botti Advent Calendarの一覧はこちら!
スケジュールやこの企画の目的などはこちら!

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください