はじめに
プログラミングを勉強し始めてから2か月経過しました。
休み休みなのでちょっとずつの進歩ですが、
自分の成長のために新たなLINE BOTにトライしてみたくなりました。
季節の変わりめ、いつも困るのが子供の服装です。
子供は大人より体温が高いらしく、同じ感覚で服を用意すると
すぐ「あつ~い」と脱がれてしまいます・・・。
挙句の果てに上着を忘れたり、やたら荷物が増えたり。
ということで気温から服装の目安を教えてくれるLine Botを作ってみました。
作った目的
前回までのLine Botは基本的にオウム返しのみの設定でした。
今回は少しステップアップするためWEBのAPIにつなげることに
挑戦してみました。
仕様
1⃣明日の気温を教えてくれる
2⃣気温を入れると、子供の服の目安を教えてくれる。
環境
基本的には「LINE BOT作ってNowで動かした時のメモ」を参考にさせていただきました。
・Node.js v10.16.3
・Windows 10 pro
・Visual Studio Code v1.39.1
服装の基準は下記を参照しています。
・https://woman.excite.co.jp/article/child/rid_ItMama_37721/
コード
'use strict';
const express = require('express');
const line = require('@line/bot-sdk');
const axios = require('axios');
const PORT = process.env.PORT || 3000;
const config = {
channelAccessToken: 'LINEのアクセストークン',
channelSecret: 'LINEのシークレットトークン'
};
const app = express();
app.get('/', (req, res) => res.send('Hello LINE BOT!'));
app.post('/webhook', line.middleware(config), (req, res) => {
console.log(req.body.events);
Promise
.all(req.body.events.map(handleEvent))
.then((result) => res.json(result));
});
const client = new line.Client(config);
function handleEvent(event) {
const message = event.message.text;
let replyMessage = event.message.text;
//event、message以外はnull(空)で返す
if (event.type !== 'message' || event.message.type !== 'text') {
return Promise.resolve(null);
}
if( message.indexOf('子供の服') > -1 ){
replyMessage = '明日の気温入れて';
}
if(message.indexOf('10') > -1){
replyMessage = '本格的冬服';
}
if(message.indexOf('11') > -1){
replyMessage = '薄手の冬服 長袖下着+ロンTシャツ+セーター';
}
if(message.indexOf('12') > -1){
replyMessage = '薄手の冬服 長袖下着+ロンTシャツ+セーター';
}
if(message.indexOf('13') > -1){
replyMessage = '本格的秋服 半袖下着+ロンTシャツ+トレーナー';
}
if(message.indexOf('14') > -1){
replyMessage = '本格的秋服 半袖下着+ロンTシャツ+トレーナー';
}
if(message.indexOf('15') > -1){
replyMessages = '薄手の秋服 半袖下着+ロンTシャツ+カーディガン';
}
if(message.indexOf('16') > -1){
replyMessage = '薄手の秋服 半袖下着+ロンTシャツ+カーディガン';
}
if(message.indexOf('17') > -1){
replyMessage = '薄手の秋服 半袖下着+ロンTシャツ+カーディガン';
}
if(message.indexOf('18') > -1){
replyMessage= '薄手の秋服 半袖下着+ロンTシャツ+カーディガン';
}
if(message.indexOf('19') > -1){
replyMessage = '薄手の秋服 半袖下着+ロンTシャツ+カーディガン';
}
if(message.indexOf('20') > -1){
replyMessage = '夏秋服 下着タンクトップ+ロンTシャツ';
}
if(message.indexOf('21') > -1){
replyMessage = '夏秋服 下着タンクトップ+ロンTシャツ';
}
if(message.indexOf('22') > -1){
replyMessage = '夏秋服 下着タンクトップ+ロンTシャツ';
}
if(message.indexOf('23') > -1){
replyMessage = '夏秋服 下着タンクトップ+ロンTシャツ';
}
if(message.indexOf('明日の気温') > -1 ){
getTommorowTemperature(event.source.userId); //スクレイピング処理が終わったらプッシュメッセージ
}
return client.replyMessage(event.replyToken, {
type: 'text',
text: replyMessage
});
}
const getTommorowTemperature = async (userId) => {
const res = await axios.get('http://weather.livedoor.com/forecast/webservice/json/v1?city=130010');
const item = res.data;
if(item.forecasts[1].temperature.max == null){
client.pushMessage(userId, {
type: 'text',
text: "最高気温のデータが無いみたいです",
});
} else {
client.pushMessage(userId, {
type: 'text',
text: "最高" + item.forecasts[1].temperature.max.celsius + "度",
});
}
//データが取れなかった時の返答
if(item.forecasts[1].temperature.min == null){
client.pushMessage(userId, {
type: 'text',
text: "最低気温のデータが無いみたいです",
});
} else {
client.pushMessage(userId, {
type: 'text',
text: "最低" + item.forecasts[1].temperature.min.celsius + "度",
});
}
}
}
//一番上段のexpressのコードとのセット。ポートとつなぎます。
app.listen(PORT);
//つながれたらTerminalに記載します。
console.log(`Server running at ${PORT}`);
動作確認
課題
正直言うと、本当は2段階ではなく1段階で明日の子供の服についてコメントしてくれるボットが良かったのです。しかし、APIから取ってきた値でLINE BOTが応答できるような複雑でかっこいいコードをまだまだ書けません。
またAPIbankなるものがあり、素敵なAPIが多く掲載されていましたが、パラメーターの設定をどうするかというのが難題で、さっぱりどうして良いか迷子でした。先にQiitaに記事を掲載されていた方にめちゃ感謝。
今後、この課題をクリアしたいと痛感しました。
感想
1、2日使ったみた感想はそこそこ当たっているかなという感じです。
寒い日には私から言うよりもLINE BOTからサジェストされた方が子供も素直に聞きそうでした。
UX的にはまだまだなので、あきらめずに改良していきたいと思います。