はじめに
最近寝る時間が不規則で、すぐに寝つけないことが多いため、初めて作成するLINEBotに、羊を数えてもらうことで可能な限り早く眠りにつきたいと思いました。なお、本当に眠くなるLINEBotにするため、羊の画像をランダムで返す仕組みも考えたが、単純で、退屈で、眠気を誘うようなものをあえて目指しました。
LINE Botの詳細
LINEmessagingAPIのCountAPI(単純な数値カウンターを作成できるAPI ※参考:https://countapi.xyz/)を利用して、羊の数をカウントし、「眠れない」とつぶやくと、羊を数えてくれる。
コード
'use strict';//おまじない//########################################//初期設定など//########################################//パッケージを使用しますconstexpress=require('express');constline=require('@line/bot-sdk');constaxios=require('axios');//ローカル(自分のPC)でサーバーを公開するときのポート番号ですconstPORT=process.env.PORT||3000;//MessagingAPIで利用するクレデンシャル(秘匿情報)です。constconfig={channelSecret: 'aaaaaaaaaaaaaaaaaaaaaa',channelAccessToken: 'aaaaaaaaaaaaaaaaaaaaaa'};constsampleFunction=async(event)=>{//ユーザーメッセージが「眠れない」かどうかif(event.message.text!=='眠れない'){returnclient.replyMessage(event.replyToken,{type: 'text',text: '「眠れない」と話しかけてね'});}else{letpushText='';try{constres=awaitaxios.get('https://api.countapi.xyz/hit/sheep/num');constSheepNum=res.data.value;pushText=`羊が${SheepNum}匹`;}catch(error){pushText='検索中にエラーが発生しました。ごめんね。';//APIからエラーが返ってきたらターミナルに表示するconsole.error(error);}//「プッシュ」で後からユーザーに通知しますreturnclient.pushMessage(event.source.userId,{type: 'text',text: pushText,});}};//########################################//LINEサーバーからのWebhookデータを処理する部分//########################################//LINESDKを初期化しますconstclient=newline.Client(config);//LINEサーバーからWebhookがあると「サーバー部分」から以下の"handleEvent"という関数が呼び出されますasyncfunctionhandleEvent(event){//受信したWebhookが「テキストメッセージ以外」であればnullを返すことで無視しますif(event.type!=='message'||event.message.type!=='text'){returnPromise.resolve(null);}//サンプル関数を実行しますreturnsampleFunction(event);}//########################################//Expressによるサーバー部分//########################################//expressを初期化しますconstapp=express();//HTTPPOSTによって'/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
などが思いついた。時間があれば挑戦してみたい。