フロントエンドエンジニアの岡田です。 先日作ったLINE botを改良しましたのでご紹介します。 techblog.lclco.com
前回の状態では、botはテキストメッセージを返すだけでした。

これでは開いてみるまでどんなヨガ動画かわかりませんし、候補が1つしかないのもいまいちです。
そこで、Template messageを使って、候補の出し方を変えてみました。 Template messageには3種類あります。
- Buttons
- Confirm
- Carousel
今回はCarouselを使いました。
右にスライドすると、最大5つのヨガ動画が表示されます。

見た目が一気に豪華になりましたね。
今回はURLの他に、動画のタイトルやdescription, thumbnail等も出しています。
ソースコードは以下のとおりです。
// -----------------------------------------------------------------------------
// 定数の設定
const LINE_CHANNEL_ACCESS_TOKEN = 'あなたのChannl Access Token';
const GOOGLE_API_KEY = 'あなたのGOOGLE API KEY';
const DOMAIN = 'あなたのサーバーのドメイン: https://xxxxxxxx.herokuapp.com/';
// -----------------------------------------------------------------------------
// モジュールのインポート
var express = require('express');
var bodyParser = require('body-parser');
var request = require('request');
var app = express();
// -----------------------------------------------------------------------------
// ミドルウェア設定
app.use(bodyParser.json());
// -----------------------------------------------------------------------------
// Webサーバー設定
var port = (process.env.PORT || 3000);
var server = app.listen(port, function() {
console.log('Node is running on port ' + port);
});
// -----------------------------------------------------------------------------
// ルーター設定
app.get('/', function(req, res, next) {
res.send('Node is running on port ' + port);
});
app.post('/webhook', function(req, res, next) {
res.status(200).end();
for (var event of req.body.events) {
if (event.type == 'message') {
var requestHeaders = {
'Content-Type': 'application/json',
'referer': DOMAIN
}
//オプションを定義
var options = {
url: 'https://www.googleapis.com/youtube/v3/search?key=' + GOOGLE_API_KEY + '&part=snippet&channelId=UCd0pUnH7i5CM-Y8xRe7cZVg&q=' + encodeURI(event.message.text),
method: 'GET',
headers: requestHeaders,
json: true
}
//リクエスト送信
request(options, function(error, response, responseBody) {
//コールバックで色々な処理
var columns = [];
for (var item of responseBody.items) {
columns.push({
"thumbnailImageUrl": item.snippet.thumbnails.medium.url,
"title": item.snippet.title,
"text": item.snippet.description ? item.snippet.description.substr(0, 60) : ' ', // title指定時は60文字以内,
"actions": [{
"type": "uri",
"label": "動画を再生",
"uri": 'https://www.youtube.com/watch?v=' + item.id.videoId
}]
});
// carouselは最大5つのため、6つ以上の候補はカット
if (columns.length === 5) {
break;
}
}
var body = {
replyToken: event.replyToken,
messages: [{
"type": "template",
"altText": "this is a carousel template",
"template": {
"type": "carousel",
"columns": columns
}
}]
}
var url = 'https://api.line.me/v2/bot/message/reply';
var headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + LINE_CHANNEL_ACCESS_TOKEN
}
request({
url: url,
method: 'POST',
headers: headers,
body: body,
json: true
});
})
}
}
});
以上です。 更なるパワーアップを目指して、改良していこうと思います。