Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9144

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

$
0
0
長崎県民に、ディズニーのお勧めアトラクションを伝えたい!! 私は、長崎県出身で、東京に上京してきて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 マスクチェッカ―!連携させるのが難しい!汗何とかできたが、まだまだ、、(;^ω^)#protoout #Java #nodered #lINEBot pic.twitter.com/CTLz8P2BJF— YE0905 (@EgashiraYosuke) August 9, 2021 ■LINE Botへ配信 LINE Botと連携#protoout pic.twitter.com/h2hDdoTrjp— YE0905 (@EgashiraYosuke) August 9, 2021 ■ドメイン検索LINEBot 動画 #protoout 中々苦戦してますが、日々成長出来て嬉しい!今週も頑張るぞ! pic.twitter.com/qJ6RF5mrA5— YE0905 (@EgashiraYosuke) August 2, 2021

Viewing all articles
Browse latest Browse all 9144

Trending Articles