BFFのカスタマイズ(2)
WebAPI「POST /webhook」のカスタマイズ
作成した「POST /webhook」に、LINEからの受信内容に応じて行う処理を実装します。
①「LINE Messaging API Receive Message」APIロジックの追加
最初に、「LINE Messaging API Receive Message」を追加します。このAPIロジックは、LINEから送られた通知であることを検証する処理です。
左メニューの「Contents」で「Added WebAPIs」の「POST /webhook」をクリックします。右メニューの「APIロジック」から「Messaging」-「LINE Messaging API Receive Message」を、「Start」と「End」の間にドラッグ&ドロップします。
②1つ目の「MongoDB Save Document」APIロジックの追加
続いて、「MongoDB Save Document」を追加します。デフォルトでは、このAPIロジックは、MongoDBに保存する処理が記述されています。
ここでは、LINEからフォロー通知を受け取った際に、フォローしたユーザー情報をMongoDBに保存する処理を実装します。
「Database」-「MongoDB Save Document」を、「LINE Messaging API Receive Message」と「End」の間にドラッグ&ドロップして追加します。
右上の「EDIT」をクリックし、コードを次のように修正してください。
このコードは、LINEからフォロー通知を受け取った際に、フォローを行ったユーザーの情報を取得し、そのユーザー情報をMongoDBのsample_streamに保存する処理です。ここでは、MongoDBの接続環境、およびコレクション(sample_stream)の作成は、既に用意されているものとします。
function getProfile(userId) {
var accessToken = config.line.accessToken;
var options = {
url: 'https://api.line.me/v2/bot/profile/' + userId,
json: true,
method: 'get',
headers: {
'Authorization': 'Bearer ' + accessToken,
},
};
return new Promise(function(resolve, reject) {
Request(options, function(error, response, body) {
if (!error && response.statusCode == 200) {
resolve(body);
}
});
});
}
function addStream(event, profile) {
var collectionName = 'sample_stream';
var document = {
_id: event.source.userId,
name: profile.displayName,
};
var url = 'mongodb://' + config.datasource.user + ':' + config.datasource.password + '@' + config.datasource.host + ':' + config.datasource.port + '/' + config.datasource.database;
MongoClient.connect(url, function(err, db) {
if (err) {
// @todo handle error
throw err;
}
db.collection(collectionName).save(document, function(err, result) {
db.close();
if (err) {
// @todo handle error
throw err;
}
return;
});
});
}
var lineEvents = JSON.parse(req.body);
lineEvents.events.forEach(function(event) {
if(event.type === 'follow') {
getProfile(event.source.userId).then(function(profile) {
addStream(event, profile);
});
}
});
next({});
「OK」をクリックして修正を確定します。
③2つ目の「MongoDB Save Document」APIロジックの追加
ここでは、LINEからメッセージ通知を受け取った際に、受け取ったメッセージをMongoDBに保存する処理を実装します。
2つ目の「MongoDB Save Document」を、1つ目の「MongoDB Save Document」と「End」の間にドラッグ&ドロップして追加します。
右上の「EDIT」をクリックし、コードを次のように修正してください。
このコードは、LINEからメッセージ通知を受け取った際に、受け取ったメッセージをMongoDBのsample_messageに保存する処理です。ここでも、MongoDBの接続環境、およびコレクション(sample_message)の作成は、既に用意されているものとします。
function getProfile(userId) {
var accessToken = config.line.accessToken;
var options = {
url: 'https://api.line.me/v2/bot/profile/' + userId,
json: true,
method: 'get',
headers: {
'Authorization': 'Bearer ' + accessToken,
},
};
return new Promise(function(resolve, reject) {
Request(options, function(error, response, body) {
if (!error && response.statusCode == 200) {
resolve(body);
}
});
});
}
function saveMessage(event, profile) {
// @see http://mongodb.github.io/node-mongodb-native/2.1/tutorials/crud/
var collectionName = 'sample_message'; // @todo set collection name
var document = {
stream_id: event.source.userId,
user_id: profile.displayName,
message: event.message.text,
replyMessage_id: '',
}; // @todo set document data for insert
var url = 'mongodb://' + config.datasource.user + ':' + config.datasource.password + '@' + config.datasource.host + ':' + config.datasource.port + '/' + config.datasource.database;
return new Promise(function(resolve, reject) {
MongoClient.connect(url, function(err, db) {
if (err) {
// @todo handle error
reject(err);
}
db.collection(collectionName).save(document, function(err, result) {
db.close();
if (err) {
// @todo handle error
reject(err);
}
resolve(result);
});
});
});
}
var lineEvents = JSON.parse(req.body);
var promises = [];
lineEvents.events.forEach(function(event) {
if(event.type === 'message' && event.message.type === 'text') {
promises.push(getProfile(event.source.userId).then(function(profile) {
return saveMessage(event, profile);
}));
}
});
Promise.all(promises).then(function() {
next({});
});
「OK」をクリックして修正を確定します。
④「LINE Messaging API Send Message」APIロジックの追加
「LINE Messaging API Send Message」を追加します。このAPIロジックは、LINEにメッセージを送信するAPIロジックです。
ここでは、「LINE Messaging API Send Message」APIロジックを修正し、ボット機能を実装します。
「Messaging」-「LINE Messaging API Send Message」を、2つ目の「MongoDB Save Document」と「End」の間にドラッグ&ドロップします。
右上の「EDIT」をクリックし、コードを次のように修正してください。
このコードは、LINEから特定の質問を受け取ったとき、あらかじめ用意した答えを返すという単純なボット処理です。
ここでは、「こんにちは」「寝るよ」のメッセージを受け取った際に、あらかじめ用意した答えを返す処理になっています。「question:」や「answer:」の内容を変えてみたり、他のQAを追加したりすることで、返答が変わります。自由に変更してみてください。
var accessToken = config.line.accessToken;
var faqs = [
{
question: 'こんにちは',
answer: 'こんにちは。今日はいい天気ですね。',
},{
question: '寝るよ',
answer: 'おやすみなさい!',
}
];
function sendMessage(userId, text) {
// @todo Send message object
var message = [
{
"type": "text",
"text": text,
},
];
var options = {
url: 'https://api.line.me/v2/bot/message/push',
method: 'post',
headers: {
'Authorization': 'Bearer ' + accessToken,
},
json: {
"to": userId,
"messages": message,
}
};
return new Promise(function(resolve, reject) {
Request(options, function(error, response, body) {
if (!error && response.statusCode == 200) {
resolve(body);
} else {
res.end(JSON.stringify(error));
reject(error);
}
});
});
}
var lineEvents = JSON.parse(req.body);
var answers = [];
var promises = [];
lineEvents.events.forEach(function(event) {
if(event.type === 'message' && event.message.type === 'text') {
faqs.forEach(function(faq) {
if(event.message.text.includes(faq.question)) {
promises.push(sendMessage(event.source.userId, faq.answer));
answers.push({
stream_id: event.source.userId,
user_id: 'bot',
message: faq.answer,
replyMessage_id: '',
});
}
});
}
});
Promise.all(promises).then(function() {
next(answers);
});
⑤3つ目の「MongoDB Save Document」APIロジックの追加
さらに「MongoDB Save Document」を追加します。 ここでは、ボット機能で返答したメッセージをMongoDBに保存する処理を実装します。 「Database」-「MongoDB Save Document」を、「LINE Messaging API Send Message」と「End」の間にドラッグ&ドロップして追加します。
右上の「EDIT」をクリックし、コードを次のように修正してください。 このコードは、ボット機能で返答したメッセージをMongoDBのsample_messageに保存する処理です。 MongoDBの接続環境、およびコレクション(sample_message)の作成は、既に用意されているものとします。
if (!results.length) {
next({});
return;
}
// @see http://mongodb.github.io/node-mongodb-native/2.1/tutorials/crud/
var collectionName = 'sample_message'; // @todo set collection name
var document = results; // @todo set document data for insert
var url = 'mongodb://' + config.datasource.user + ':' + config.datasource.password + '@' + config.datasource.host + ':' + config.datasource.port + '/' + config.datasource.database;
MongoClient.connect(url, function(err, db) {
if (err) {
// @todo handle error
throw err;
}
db.collection(collectionName).insertMany(document, function(err, result) {
db.close();
if (err) {
// @todo handle error
throw err;
}
next({});
});
});
「OK」をクリックして修正を確定します。
WebAPI「POST /sample_messages」のカスタマイズ
POST /sample_messagesは、デフォルトでは、Chatテンプレートで用意されている操作画面から送信したメッセージをMongoDBに保存する処理のみ実装されています。
ここでは、APIロジックを追加し、操作画面から送信したメッセージが、LINEへ送信される処理を追加実装しましょう。
①「LINE Messaging API Send Message」APIロジックの追加
「LINE Messaging API Send Message」を追加します。
ここでは、操作画面から送信されたメッセージがLINEへ送信されるように実装します。
「Messaging」-「LINE Messaging API Send Message」を、「MongoDB - Stream Channel」と「End」の間にドラッグ&ドロップします。
「LINE Messaging API Send Message」には、LINE操作画面に入力されたメッセージをLINEに送信する処理を記述します。右上の「EDIT」をクリックしてください。次のコードを以下に示すように修正します。
(省略)
var accessToken = config.line.accessToken;
var messageReceiverId = '';
// @todo Send message object
var message = [
{
"type":"text",
"text":"hello world"
},
];
(省略)
↓
(省略) var accessToken = config.line.accessToken; var messageReceiverId = req.body.stream_id; // @todo Send message object var message = [ { "type":"text", "text": req.body.message }, ]; (省略)
「OK」をクリックして修正を確定します。これでBFFのカスタマイズは完了です。

