LoginSignup
8
1

More than 1 year has passed since last update.

長崎県民の為に!ディズニーのお勧めアトラクションを教えてくれるLINEBotを作ってみた!

Last updated at Posted at 2021-10-13

長崎県民に、ディズニーのお勧めアトラクションを伝えたい!!

私は、長崎県出身で、東京に上京してきて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サーバーを実行中です…`);

お勧めのアトラクションを教えてくれるAPI

「おすすめは?」と聞くと、おすすめのアトラクションをランダムに答えてくれます。
「遊びに行きたい」や「アトラクション何がいいかな」など、ある特定の単語を含むメッセージには乗り気ですが、それ以外は適当な相槌を返します。

サンプルコード (クリックで表示)


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

■LINE Botへ配信

■ドメイン検索LINEBot
プロトアウトスタジオ②.png
プロトアウトスタジオ①.png

動画

8
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1