LINE Bot에게 양을 세면 깨어났다.

소개



최근 자는 시간이 불규칙하고, 빨리 자지 않는 것이 많기 때문에, 처음 작성하는 LINEBot에, 양을 세어 받는 것으로 가능한 한 빨리 잠들고 싶다고 생각했습니다. 덧붙여 정말로 졸려지는 LINEBot로 하기 위해서, 양의 화상을 랜덤으로 돌려주는 구조도 생각했지만, 간단하고, 지루하고, 졸음을 초대하는 것을 굳이 목표로 했습니다.

LINE Bot에 대해 자세히 알아보기



LINEmessagingAPI의 CountAPI(단순한 수치 카운터를 작성할 수 있는 API ※참고: htps : // 이런 피. xy · )를 이용해, 양의 수를 카운트해, 「잠들 수 없다」라고 중얼거리면, 양을 세어 준다.

코드



server2.js
'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 기사: htps : // 코 m / 우노 군코 m / ms / 559 )

마지막으로



최근 일찍 잠들었을 때 하고 있는 것은, 결국 아래의 3점이다.
1. 따뜻한 목욕에 20분 이상 걸린다
2. 적당한 음주
3. 오르골 메들리 듣기
비선형 접근법으로 LINEBot과의 조합에서 아이디어를 생각해 보면,
・자는 시간을 중얼거리면 목욕에 들어가야 할 최고의 타이밍을 가르쳐 주는 Bot
・마시는 동료가 되어주고, 마지막에 슬슬 자면? 라고 말해주는 Bot
・추천의 오르골 메들리를 검색해 주는 Bot
등이 떠올랐다. 시간이 있으면 도전해보고 싶다.

좋은 웹페이지 즐겨찾기