reply.js 7.02 KB
var express = require('express');
const request = require('request');
const TARGET_URL = 'https://api.line.me/v2/bot/message/reply'
const TOKEN = ''
const fs = require('fs');
const path = require('path');
const HTTPS = require('https');
const domain = "2019102226.osschatbot2022.ml"
const sslport = 23023;
const bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.json());
app.post('/hook', function (req, res) {
    var eventObj = req.body.events[0];
    var message = eventObj.message;

    // request log
    console.log('======================', new Date(), '======================');
    // mwsql
    var mysql = require('mysql');
    var db = mysql.createConnection({
        host: 'chatbot.c7fzgftc3yrm.us-east-1.rds.amazonaws.com',
        user: 'chatbot',
        password: '',
        database: 'chatbot',
        port: '3306'
    });
    db.connect();
    var max = 0;
    var arr2;
    db.query('SELECT * FROM recipe', function (error, results, fields) {
        if (error) {
            console.log(error);
        }
        var arr1 = new Array();
        var input_ingredients_list = message.text.split(" ");
        console.log(input_ingredients_list);
        for (var i = 0; i < results.length; i++) {
            var ingredients_list = results[i].ingrediant.split(",");
            var count = ingredients_list.filter(x => input_ingredients_list.includes(x)).length;
            if (count > max) {
                max = count;
                arr2 = new Array();
            }
            if (count === input_ingredients_list.length) {
                arr1.push(i);
            }
            else if (arr1.length === 0 && count != 0 && count === max) {
                arr2.push(i);
            }
        }

        if (arr1.length != 0) {

            for (var k = 0; k < arr1.length; k++) {
                var issamevalue = false;
                var ingredients_list = results[arr1[k]].ingrediant.split(",");
                for (var i = 0; i < ingredients_list.length; i++) {
                    const currelm = ingredients_list[i];

                    for (var j = i + 1; j < ingredients_list.length; j++) {
                        if (currelm === ingredients_list[j]) {
                            issamevalue = true;
                            break;
                        }
                    }
                    if (issamevalue) {
                        arr2.push(arr1[k]);
                        arr1.splice(k, 1);
                        k--;
                        break;
                    }
                }
            }
        }
        if (arr1.length != 0) {
            var num = arr1[Math.floor(Math.random() * arr1.length)];
            request.post(
                {
                    url: TARGET_URL,
                    headers: {
                        'Authorization': `Bearer ${TOKEN}`
                    },
                    json: {
                        "replyToken": eventObj.replyToken,
                        "messages": [
                            {
                                "type": "text",
                                "text": `메뉴는 "${results[[num]].menu}" 입니다.`
                            },
                            {
                                "type": "text",
                                "text": `필요한 재료는\n\n"${results[[num]].ingrediant}"\n\n입니다.`
                            },
                            {
                                "type": "text",
                                "text": `레시피\n\n${results[[num]].recipe}`
                            }
                        ]
                    }
                }, (error, response, body) => {
                    console.log(body)
                });
        }
        else if (arr2 != undefined) {
            var num = arr2[Math.floor(Math.random() * arr2.length)];
            request.post(
                {
                    url: TARGET_URL,
                    headers: {
                        'Authorization': `Bearer ${TOKEN}`
                    },
                    json: {
                        "replyToken": eventObj.replyToken,
                        "messages": [
                            {
                                "type": "text",
                                "text": `입력하신 재료를 모두 포함하는 레시피를 찾지 못하였습니다.\n\n입력하신 재료를 최대한 많이 포함하는 레시피를 보여드리겠습니다.`
                            },
                            {
                                "type": "text",
                                "text": `메뉴는 "${results[[num]].menu}" 입니다.`
                            },
                            {
                                "type": "text",
                                "text": `필요한 재료는\n\n"${results[[num]].ingrediant}"\n\n입니다.`
                            },
                            {
                                "type": "text",
                                "text": `레시피\n\n${results[[num]].recipe}`
                            }
                        ]
                    }
                }, (error, response, body) => {
                    console.log(body)
                });
        }
        else {
            request.post(
                {
                    url: TARGET_URL,
                    headers: {
                        'Authorization': `Bearer ${TOKEN}`
                    },
                    json: {
                        "replyToken": eventObj.replyToken,
                        "messages": [
                            {
                                "type": "text",
                                "text": `재료를 다시 입력해주세요.`
                            },
                            {
                                "type": "text",
                                "text": `여러 재료를 입력시\n띄어쓰기로만 구분을 해주세요.`
                            }
                            ,
                            {
                                "type": "text",
                                "text": `예시) 감자 양파 대파  (o)\n\n         감자, 양파,대파 (x)`
                            }
                        ]
                    }
                }, (error, response, body) => {
                    console.log(body)
                });
        }
    });
    db.end();
    res.sendStatus(200);
});
try {
    const option = {
        ca: fs.readFileSync('/etc/letsencrypt/live/' + domain + '/fullchain.pem'),
        key: fs.readFileSync(path.resolve(process.cwd(), '/etc/letsencrypt/live/' + domain + '/privkey.pem'), 'utf8').toString(),
        cert: fs.readFileSync(path.resolve(process.cwd(), '/etc/letsencrypt/live/' + domain + '/cert.pem'), 'utf8').toString(),
    };
    HTTPS.createServer(option, app).listen(sslport, () => {
        console.log(`[HTTPS] Server is started on port ${sslport}`);
    });
} catch (error) {
    console.log('[HTTPS] HTTPS 오류가 발생하였습니다. HTTPS 서버는 실행되지 않습니다.');
    console.log(error);
}