はじめに
最近寝る時間が不規則で、すぐに寝つけないことが多いため、初めて作成するLINEBotに、羊を数えてもらうことで可能な限り早く眠りにつきたいと思いました。なお、本当に眠くなるLINEBotにするため、羊の画像をランダムで返す仕組みも考えたが、単純で、退屈で、眠気を誘うようなものをあえて目指しました。
LINE Botの詳細
LINEmessagingAPIのCountAPI(単純な数値カウンターを作成できるAPI ※参考:https://countapi.xyz/ )を利用して、羊の数をカウントし、「眠れない」とつぶやくと、羊を数えてくれる。
コード
'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: 'aaaaaaaaaaaaaaaaaaaaaa',
channelAccessToken: 'aaaaaaaaaaaaaaaaaaaaaa'
};
const sampleFunction = async (event) => {
// ユーザーメッセージが「眠れない」かどうか
if (event.message.text !== '眠れない') {
return client.replyMessage(event.replyToken, {
type: 'text',
text: '「眠れない」と話しかけてね'
});
} else {
let pushText = '';
try {
const res = await axios.get('https://api.countapi.xyz/hit/sheep/num');
const SheepNum = res.data.value;
pushText = `羊が${SheepNum}匹`;
} catch (error) {
pushText = '検索中にエラーが発生しました。ごめんね。';
// APIからエラーが返ってきたらターミナルに表示する
console.error(error);
}
// 「プッシュ」で後からユーザーに通知します
return client.pushMessage(event.source.userId, {
type: 'text',
text: pushText,
});
}
};
// ########################################
// 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の中身を確認用にターミナルに表示します
console.log(req.body.events);
// 検証ボタンをクリックしたときに飛んできたWebhookを受信したときのみ以下のif文内を実行
if (req.body.events[0].replyToken === '00000000000000000000000000000000' && req.body.events[1].replyToken === 'ffffffffffffffffffffffffffffffff') {
res.send('Hello LINE BOT! (HTTP POST)'); // LINEサーバーに返答します
console.log('検証イベントを受信しました!'); // ターミナルに表示します
return; // これより下は実行されません
}
// あらかじめ宣言しておいた "handleEvent" 関数にWebhookの中身を渡して処理してもらい、
// 関数から戻ってきたデータをそのままLINEサーバーに「レスポンス」として返します
Promise.all(req.body.events.map(handleEvent)).then((result) => res.json(result));
});
// 最初に決めたポート番号でサーバーをPC内だけに公開します
// (環境によってはローカルネットワーク内にも公開されます)
app.listen(PORT);
console.log(`ポート${PORT}番でExpressサーバーを実行中です…`);
実行結果
使ってみた結果
全然眠れなかった。むしろ目が覚めた。
※242匹まで数えた。
※結局ディズニーオルゴールメドレーで寝ることができた。
考察
なぜ羊を数えると眠くなるか、を調べてみたところ、理由は「人間は単調な音を聞き続けると眠たくなるため」であり、「聞く」という行為が、眠りを誘う上で重要であったことに気づいた。(参考:なぜ「羊」かというとsleep(スリープ)とsheep(シープ)が綴りや発音が似ていたため言葉遊びが理由で、寝る時に羊が数えられるようになったそうです。)
つまり、羊の数をテキストデータとして明示するだけでは根本的に眠くならないということがわかった。※むしろ、スマホの画面が明るすぎて逆効果とさえ思う。
改善できるとしたら
上記考察にも記載したように「単調な音を聞き続けられる」ように、眠いとつぶやいたら、羊の数を音声変換して発話してくれるBotの方が効果が高いと考えられる。
(参考となりそうなQiita記事:https://qiita.com/unokuncom/items/ffe95f6f7ffbaedcf562 )
最後に
最近早く寝られたときにしていることは、結局下記の3点である。
1.暖かいお風呂に20分以上つかる
2.適度な飲酒
3.オルゴールメドレーを聴く
非線形的なアプローチでLINEBotとの組み合わせからアイデアを考えてみたら、例えば、
・寝る時間を呟いたらお風呂に入るべきベストなタイミングを教えてくれるBot
・飲み仲間になってくれて、最後にそろそろ寝たら?って言ってくれるBot
・おすすめのオルゴールメドレーを検索してくれるBot
などが思いついた。時間があれば挑戦してみたい。