長崎県民に、ディズニーのお勧めアトラクションを伝えたい!!
私は、長崎県出身で、東京に上京してきて13年目。
東京にきて、ビックリした事の一つに、東京都民は、ディズニーランド、ディズニーシーのアトラクション事に妙に詳しいこと。
平然と、ビックサンダーマウンテン、センターオブジアース、スプラッシュマウンテン、タワーオブテラーなど言われるが、田舎者の私には、全然分からなかった事を今でも覚えております。
旅行できた地元の友達達からもよくディズニーのお勧めの場所やアトラクション、宿泊先など、よく聞かれます。そんな友達達の為に、今回ディズニーリゾートのお勧めのアトラクションを教えてくれるLINEBotを作ってみました!
作成した仕組み
ディズニーリゾートのお勧めアトラクションを教えてくれるLINEBot
開発環境
・LINE公式アカウント開設
・LINE Developersアカウント登録
・Visual Studio Code
・ngrok
・LINE Bot
共通テンプレート
テンプレートをもとに作成しました!
サンプルコード **(クリックで表示)**
'use strict';
// ########################################
// 初期設定など
// ########################################
// パッケージを使用します
const express = require('express');
const line = require('@line/bot-sdk');
const axios = require('axios');
// ローカル(自分のPC)でサーバーを公開するときのポート番号です
const PORT = process.env.PORT || 3000;
// Messaging APIで利用するクレデンシャル(秘匿情報)です。
const config = {
channelSecret: '作成したBotのチャネルシークレット',
channelAccessToken: '作成したBotのチャネルアクセストークン'
};
// ########## ▼▼▼ サンプル関数 ▼▼▼ ##########
(この行をサンプル関数丸ごと全部と置き換えてね)
// ########## ▲▲▲ サンプル関数 ▲▲▲ ##########
// ########################################
// LINEサーバーからのWebhookデータを処理する部分
// ########################################
// LINE SDKを初期化します
const client = new line.Client(config);
// LINEサーバーからWebhookがあると「サーバー部分」から以下の "handleEvent" という関数が呼び出されます
async function handleEvent(event) {
// 受信したWebhookが「テキストメッセージ以外」であればnullを返すことで無視します
if (event.type !== 'message' || event.message.type !== 'text') {
return Promise.resolve(null);
}
// サンプル関数を実行します
return sampleFunction(event);
}
// ########################################
// Expressによるサーバー部分
// ########################################
// expressを初期化します
const app = express();
// HTTP POSTによって '/webhook' のパスにアクセスがあったら、POSTされた内容に応じて様々な処理をします
app.post('/webhook', line.middleware(config), (req, res) => {
// 検証ボタンをクリックしたときに飛んできたWebhookを受信したときのみ以下のif文内を実行
if (req.body.events.length === 0) {
res.send('Hello LINE BOT! (HTTP POST)'); // LINEサーバーに返答します(なくてもよい)
console.log('検証イベントを受信しました!'); // ターミナルに表示します
return; // これより下は実行されません
} else {
// 通常のメッセージなど … Webhookの中身を確認用にターミナルに表示します
console.log('受信しました:', req.body.events);
}
// あらかじめ宣言しておいた "handleEvent" 関数にWebhookの中身を渡して処理してもらい、
// 関数から戻ってきたデータをそのままLINEサーバーに「レスポンス」として返します
Promise.all(req.body.events.map(handleEvent)).then((result) => res.json(result));
});
// 最初に決めたポート番号でサーバーをPC内だけに公開します
// (環境によってはローカルネットワーク内にも公開されます)
app.listen(PORT);
console.log(`ポート${PORT}番でExpressサーバーを実行中です…`);
サンプルコード **(クリックで表示)**
const sampleFunction = async (event) => {
const userText = event.message.text;
let replyText = '';
// 部分一致1(「遊」という文字が1ヶ所でも含まれていたら反応)
if (userText.indexOf('遊') > -1) {
replyText = 'ディズニーリゾートへ行きましょう!';
}
// 部分一致2(「アトラクション」という単語が1ヶ所でも含まれていたら反応)
if (userText.indexOf('アトラクション') > -1) {
replyText = 'アトラクションのことでしたら、ぜひ「おすすめは?」と聞いてみてください!';
}
// 完全一致したらランダムに返信
if (userText === 'おすすめは?') {
// アイスの配列
const attractions = ['ビッグサンダー・マウンテン', 'センター・オブ・ジ・アース', 'スペース・マウンテン', 'エレクトリック・レールウェイ', 'スプラッシュマウンテン', 'インディ・ジョーンズ・アドベンチャー', 'カリブの海賊', 'スポンサーラウンジ'];
// アイスの種類数
const att_count = attractions.length;
// 乱数(0以上1未満の小数)* 種類数 をして小数以下切り捨て
const index = Math.floor(Math.random() * att_count);
// インデックスを指定して特定のアイスを示す文字列を取り出す
replyText = '「' + attractions[index] + '」がおすすめです🎢';
}
// この時点でどの条件にも引っかかってない(replyTextが空文字列のまま)なら相槌をうっておく
if (replyText === '') {
replyText = 'そうですね〜';
}
return client.replyMessage(event.replyToken, {
type: 'text',
text: replyText
});
};
今回出来なかったこと
企画案までは、出来たのですが、実機で試すまでが出来ませんでした。
また、お勧めのアトラクションまでしか制作する事が出来ませんでした。
次回は、宿泊施設やお勧めの場所も教えてくれるLINEBotを制作したいと考えております。
これまでの成果物
■CodePen
マスクチェッカ―!
— YE0905 (@EgashiraYosuke) August 9, 2021
連携させるのが難しい!汗
何とかできたが、まだまだ、、(;^ω^)#protoout #Java #nodered #lINEBot pic.twitter.com/CTLz8P2BJF
■LINE Botへ配信
LINE Botと連携#protoout pic.twitter.com/h2hDdoTrjp
— YE0905 (@EgashiraYosuke) August 9, 2021
動画
#protoout
— YE0905 (@EgashiraYosuke) August 2, 2021
中々苦戦してますが、日々成長出来て嬉しい!
今週も頑張るぞ! pic.twitter.com/qJ6RF5mrA5