곽원석

Update app.js (기능분화)

Showing 1 changed file with 611 additions and 15 deletions
......@@ -4,7 +4,7 @@ var express = require('express');
// 요청 리소스 표현 모듈
var request = require('request');
// api 데이터포맷이 xml이므로 json으로 파싱할 필요가 있음
// api로 받아올 데이터포맷이 xml이므로 json으로 파싱할 필요가 있음
var convert = require('xml-js');
const bodyParser = require('body-parser');
......@@ -15,6 +15,12 @@ const TOKEN = 'OPv3udmn1UGx+xWZFm80KeZbeGJm63nyt+sTpvBr1Mbc1Y0FAeK4MohQLcWq5yytJ
// 공공보건포털_API
const CORONA_URL = 'http://openapi.data.go.kr/openapi/service/rest/Covid19/getCovid19InfStateJson';
const SERVICE_KEY = 'DMUPOq6b%2B%2F1gqfLEXQ6bnhgoTO73BfPprA6HVNcV%2F6vHMGG%2Bgiw%2BPDkPvX1eQ7b9uvl%2B42fxUPkU0W3Si907Lw%3D%3D'
queryParams = '?' + encodeURIComponent('ServiceKey') + '=' + SERVICE_KEY; // Service Key
queryParams += '&' + encodeURIComponent('pageNo') + '=' + encodeURIComponent('1');
queryParams += '&' + encodeURIComponent('numOfRows') + '=' + encodeURIComponent('4');
var date;
var menu = 0;
var start_checker = false;
// express 미들웨어 정의
var app = express();
......@@ -28,8 +34,6 @@ const { measureMemory } = require('vm');
const domain = "www.oss-chatbot-kwak.tk"
const sslport = 23023;
var date;
// 챗봇으로 입력
app.post('/hook', function (req, res) {
......@@ -43,7 +47,7 @@ app.post('/hook', function (req, res) {
console.log('[request source] ', eventObj.source);
console.log('[request message]', eventObj.message);
//
// 챗봇시작
if(message.text == '/코로나' || message.text == '/corona'){
request.post(
{
......@@ -56,6 +60,223 @@ app.post('/hook', function (req, res) {
"messages":[
{
"type":"text",
"text":"명령어 : /코로나 or /corona 로 코로나 19 bot을 시작하셨습니다."
},
{
"type":"text",
"text":"명령어 :\n1. 확진자 수 :\t/확진자\n2. 격리해제 수 :\t/격리해제\n3. 검사진행 수 :\t/검사진행\n4. 사망자 수 :\t/사망자\n5. 치료중 환자 수 :\t/치료중\n6. 결과음성 수 :\t/결과음성\n7. 누적검사 수 :\t/누적검사\n8. 누적 확진률 :\t/누적확진\n"
}
]
}
},(error, response, body) => {
console.log(body)
});
start_checker = true;
return;
}
else if(message.text == '/확진자' && start_checker == true){
menu = 1;
start_checker = false;
request.post(
{
url: TARGET_URL,
headers: {
'Authorization': `Bearer ${TOKEN}`
},
json: {
"replyToken":eventObj.replyToken,
"messages":[
{
"type":"text",
"text":"확인하고 싶으신 일자를 적어주세요."
},
{
"type":"text",
"text":"예시) 20201209"
}
]
}
},(error, response, body) => {
console.log(body)
});
return;
}
else if(message.text == '/격리해제' && start_checker == true){
menu = 2;
start_checker = false;
request.post(
{
url: TARGET_URL,
headers: {
'Authorization': `Bearer ${TOKEN}`
},
json: {
"replyToken":eventObj.replyToken,
"messages":[
{
"type":"text",
"text":"확인하고 싶으신 일자를 적어주세요."
},
{
"type":"text",
"text":"예시) 20201209"
}
]
}
},(error, response, body) => {
console.log(body)
});
return;
}
else if(message.text == '/검사진행' && start_checker == true){
menu = 3;
start_checker = false;
request.post(
{
url: TARGET_URL,
headers: {
'Authorization': `Bearer ${TOKEN}`
},
json: {
"replyToken":eventObj.replyToken,
"messages":[
{
"type":"text",
"text":"확인하고 싶으신 일자를 적어주세요."
},
{
"type":"text",
"text":"예시) 20201209"
}
]
}
},(error, response, body) => {
console.log(body)
});
return;
}
else if(message.text == '/사망자' && start_checker == true){
menu = 4;
start_checker = false;
request.post(
{
url: TARGET_URL,
headers: {
'Authorization': `Bearer ${TOKEN}`
},
json: {
"replyToken":eventObj.replyToken,
"messages":[
{
"type":"text",
"text":"확인하고 싶으신 일자를 적어주세요."
},
{
"type":"text",
"text":"예시) 20201209"
}
]
}
},(error, response, body) => {
console.log(body)
});
return;
}
else if(message.text == '/치료중' && start_checker == true){
menu = 5;
start_checker = false;
request.post(
{
url: TARGET_URL,
headers: {
'Authorization': `Bearer ${TOKEN}`
},
json: {
"replyToken":eventObj.replyToken,
"messages":[
{
"type":"text",
"text":"확인하고 싶으신 일자를 적어주세요."
},
{
"type":"text",
"text":"예시) 20201209"
}
]
}
},(error, response, body) => {
console.log(body)
});
return;
}
else if(message.text == '/음성' && start_checker == true){
menu = 6;
start_checker = false;
request.post(
{
url: TARGET_URL,
headers: {
'Authorization': `Bearer ${TOKEN}`
},
json: {
"replyToken":eventObj.replyToken,
"messages":[
{
"type":"text",
"text":"확인하고 싶으신 일자를 적어주세요."
},
{
"type":"text",
"text":"예시) 20201209"
}
]
}
},(error, response, body) => {
console.log(body)
});
return;
}
else if(message.text == '/누적검사' && start_checker == true){
menu = 7;
start_checker = false;
request.post(
{
url: TARGET_URL,
headers: {
'Authorization': `Bearer ${TOKEN}`
},
json: {
"replyToken":eventObj.replyToken,
"messages":[
{
"type":"text",
"text":"확인하고 싶으신 일자를 적어주세요."
},
{
"type":"text",
"text":"예시) 20201209"
}
]
}
},(error, response, body) => {
console.log(body)
});
return;
}
else if(message.text == '/누적확진' && start_checker == true){
menu = 8;
start_checker = false;
request.post(
{
url: TARGET_URL,
headers: {
'Authorization': `Bearer ${TOKEN}`
},
json: {
"replyToken":eventObj.replyToken,
"messages":[
{
"type":"text",
"text":"확인하고 싶으신 일자를 적어주세요."
},
{
......@@ -69,21 +290,88 @@ app.post('/hook', function (req, res) {
});
return;
}
else
else if(start_checker == true){
menu = 0;
request.post(
{
url: TARGET_URL,
headers: {
'Authorization': `Bearer ${TOKEN}`
},
json: {
"replyToken":eventObj.replyToken,
"messages":[
{
"type":"text",
"text":"선택하신 정보가 정확하지 않거나 없습니다.\\n처음부터 다시 진행해주세요."
},
]
}
},(error, response, body) => {
console.log(body)
});
start_checker = false;
return;
}
if((menu != 0) && (message.text)){
date = message.text;
queryParams = '?' + encodeURIComponent('ServiceKey') + '=' + SERVICE_KEY; /* Service Key*/
queryParams += '&' + encodeURIComponent('pageNo') + '=' + encodeURIComponent('1'); /* */
queryParams += '&' + encodeURIComponent('numOfRows') + '=' + encodeURIComponent('4'); /* */
queryParams += '&' + encodeURIComponent('startCreateDt') + '=' + encodeURIComponent(date);
queryParams += '&' + encodeURIComponent('endCreateDt') + '=' + encodeURIComponent(date); /* */
bot_reply(eventObj.replyToken, message);
res.sendStatus(200);
queryParams += '&' + encodeURIComponent('endCreateDt') + '=' + encodeURIComponent(date);
switch(menu){
case 1:
bot_reply_1(eventObj.replyToken, message);
break;
case 2:
bot_reply_2(eventObj.replyToken, message);
break;
case 3:
bot_reply_3(eventObj.replyToken, message);
break;
case 4:
bot_reply_4(eventObj.replyToken, message);
break;
case 5:
bot_reply_5(eventObj.replyToken, message);
break;
case 6:
bot_reply_6(eventObj.replyToken, message);
break;
case 7:
bot_reply_7(eventObj.replyToken, message);
break;
case 8:
bot_reply_8(eventObj.replyToken, message);
break;
default :
break;
}
}
else if(menu == 0){
request.post(
{
url: TARGET_URL,
headers: {
'Authorization': `Bearer ${TOKEN}`
},
json: {
"replyToken":eventObj.replyToken,
"messages":[
{
"type":"text",
"text":"코로나 봇을 찾으시나요?\n명령어는 /코로나 또는 /corona 입니다."
}
]
}
},(error, response, body) => {
console.log(body)
});
}
res.sendStatus(200);
});
function bot_reply(replyToken, message) {
function bot_reply_1(replyToken, message) {
request({
url: CORONA_URL + queryParams,
method: 'GET'
......@@ -108,12 +396,320 @@ function bot_reply(replyToken, message) {
"messages":[
{
"type":"text",
"text": '선택하신 날짜의 Corona Virus-19 현황은 다음과 같습니다.'
"text": '선택하신 날짜와 정보의 Corona Virus-19 현황은 다음과 같습니다.'
},
{
"type":"text",
"text": "확진자 수 : " + resultMessage.decideCnt._text
},
{
"type":"text",
"text": "등록일시분초 : " + resultMessage.createDt._text
}
]
}
},(error, response, body) => {
console.log(body)
});
}
});
}
function bot_reply_2(replyToken, message) {
request({
url: CORONA_URL + queryParams,
method: 'GET'
},(error, response, body) => {
if(!error && response.statusCode == 200) {
console.log('Status', response.statusCode);
console.log('Headers', JSON.stringify(response.headers));
var xmlToJson = convert.xml2json(response.body, {compact: true, spaces: 4});
const jsonData = JSON.parse(xmlToJson); // json text -> json object
console.log('Reponse received', xmlToJson); // json text
var resultMessage = jsonData.response.body.items.item;
request.post(
{
url: TARGET_URL,
headers: {
'Authorization': `Bearer ${TOKEN}`
},
json: {
"replyToken":replyToken,
"messages":[
{
"type":"text",
"text": '선택하신 날짜와 정보의 Corona Virus-19 현황은 다음과 같습니다.'
},
{
"type":"text",
"text": "격리해제 수 : " + resultMessage.clearCnt._text
},
{
"type":"text",
"text": "등록일시분초 : " + resultMessage.createDt._text
}
]
}
},(error, response, body) => {
console.log(body)
});
}
});
}
function bot_reply_3(replyToken, message) {
request({
url: CORONA_URL + queryParams,
method: 'GET'
},(error, response, body) => {
if(!error && response.statusCode == 200) {
console.log('Status', response.statusCode);
console.log('Headers', JSON.stringify(response.headers));
var xmlToJson = convert.xml2json(response.body, {compact: true, spaces: 4});
const jsonData = JSON.parse(xmlToJson); // json text -> json object
console.log('Reponse received', xmlToJson); // json text
var resultMessage = jsonData.response.body.items.item;
request.post(
{
url: TARGET_URL,
headers: {
'Authorization': `Bearer ${TOKEN}`
},
json: {
"replyToken":replyToken,
"messages":[
{
"type":"text",
"text": '선택하신 날짜와 정보의 Corona Virus-19 현황은 다음과 같습니다.'
},
{
"type":"text",
"text": "검사진행 수 : " + resultMessage.examCnt._text
},
{
"type":"text",
"text": "등록일시분초 : " + resultMessage.createDt._text
}
]
}
},(error, response, body) => {
console.log(body)
});
}
});
}
function bot_reply_4(replyToken, message) {
request({
url: CORONA_URL + queryParams,
method: 'GET'
},(error, response, body) => {
if(!error && response.statusCode == 200) {
console.log('Status', response.statusCode);
console.log('Headers', JSON.stringify(response.headers));
var xmlToJson = convert.xml2json(response.body, {compact: true, spaces: 4});
const jsonData = JSON.parse(xmlToJson); // json text -> json object
console.log('Reponse received', xmlToJson); // json text
var resultMessage = jsonData.response.body.items.item;
request.post(
{
url: TARGET_URL,
headers: {
'Authorization': `Bearer ${TOKEN}`
},
json: {
"replyToken":replyToken,
"messages":[
{
"type":"text",
"text": '선택하신 날짜와 정보의 Corona Virus-19 현황은 다음과 같습니다.'
},
{
"type":"text",
"text": "사망자 수 : " + resultMessage.deathCnt._text
},
{
"type":"text",
"text": "등록일시분초 : " + resultMessage.createDt._text
}
]
}
},(error, response, body) => {
console.log(body)
});
}
});
}
function bot_reply_5(replyToken, message) {
request({
url: CORONA_URL + queryParams,
method: 'GET'
},(error, response, body) => {
if(!error && response.statusCode == 200) {
console.log('Status', response.statusCode);
console.log('Headers', JSON.stringify(response.headers));
var xmlToJson = convert.xml2json(response.body, {compact: true, spaces: 4});
const jsonData = JSON.parse(xmlToJson); // json text -> json object
console.log('Reponse received', xmlToJson); // json text
var resultMessage = jsonData.response.body.items.item;
request.post(
{
url: TARGET_URL,
headers: {
'Authorization': `Bearer ${TOKEN}`
},
json: {
"replyToken":replyToken,
"messages":[
{
"type":"text",
"text": '선택하신 날짜와 정보의 Corona Virus-19 현황은 다음과 같습니다.'
},
{
"type":"text",
"text": "치료중 환자 수 : " + resultMessage.careCnt._text
},
{
"type":"text",
"text": "등록일시분초 : " + resultMessage.createDt._text
}
]
}
},(error, response, body) => {
console.log(body)
});
}
});
}
function bot_reply_6(replyToken, message) {
request({
url: CORONA_URL + queryParams,
method: 'GET'
},(error, response, body) => {
if(!error && response.statusCode == 200) {
console.log('Status', response.statusCode);
console.log('Headers', JSON.stringify(response.headers));
var xmlToJson = convert.xml2json(response.body, {compact: true, spaces: 4});
const jsonData = JSON.parse(xmlToJson); // json text -> json object
console.log('Reponse received', xmlToJson); // json text
var resultMessage = jsonData.response.body.items.item;
request.post(
{
url: TARGET_URL,
headers: {
'Authorization': `Bearer ${TOKEN}`
},
json: {
"replyToken":replyToken,
"messages":[
{
"type":"text",
"text": '선택하신 날짜와 정보의 Corona Virus-19 현황은 다음과 같습니다.'
},
{
"type":"text",
"text": "결과 음성 수 : " + resultMessage.resutlNegCnt._text
},
{
"type":"text",
"text": "등록일시분초 : " + resultMessage.createDt._text
}
]
}
},(error, response, body) => {
console.log(body)
});
}
});
}
function bot_reply_7(replyToken, message) {
request({
url: CORONA_URL + queryParams,
method: 'GET'
},(error, response, body) => {
if(!error && response.statusCode == 200) {
console.log('Status', response.statusCode);
console.log('Headers', JSON.stringify(response.headers));
var xmlToJson = convert.xml2json(response.body, {compact: true, spaces: 4});
const jsonData = JSON.parse(xmlToJson); // json text -> json object
console.log('Reponse received', xmlToJson); // json text
var resultMessage = jsonData.response.body.items.item;
request.post(
{
url: TARGET_URL,
headers: {
'Authorization': `Bearer ${TOKEN}`
},
json: {
"replyToken":replyToken,
"messages":[
{
"type":"text",
"text": '선택하신 날짜와 정보의 Corona Virus-19 현황은 다음과 같습니다.'
},
{
"type":"text",
"text": "누적 검사 수 : " + resultMessage.accExamCnt._text
},
{
"type":"text",
"text": "누적 검사 완료 수 : " + resultMessage.accExamCompCnt._text
},
{
"type":"text",
"text": "등록일시분초 : " + resultMessage.createDt._text
}
]
}
},(error, response, body) => {
console.log(body)
});
}
});
}
function bot_reply_8(replyToken, message) {
request({
url: CORONA_URL + queryParams,
method: 'GET'
},(error, response, body) => {
if(!error && response.statusCode == 200) {
console.log('Status', response.statusCode);
console.log('Headers', JSON.stringify(response.headers));
var xmlToJson = convert.xml2json(response.body, {compact: true, spaces: 4});
const jsonData = JSON.parse(xmlToJson); // json text -> json object
console.log('Reponse received', xmlToJson); // json text
var resultMessage = jsonData.response.body.items.item;
request.post(
{
url: TARGET_URL,
headers: {
'Authorization': `Bearer ${TOKEN}`
},
json: {
"replyToken":replyToken,
"messages":[
{
"type":"text",
"text": '선택하신 날짜와 정보의 Corona Virus-19 현황은 다음과 같습니다.'
},
{
"type":"text",
"text": "누적 확진률 : " + resultMessage.accDefRate._text
},
{
"type":"text",
"text": JSON.stringify(resultMessage)
"text": "등록일시분초 : " + resultMessage.createDt._text
}
]
}
......@@ -124,7 +720,7 @@ function bot_reply(replyToken, message) {
});
}
// 오류처리
// Https server 오류처리
try {
const option = {
ca: fs.readFileSync('/etc/letsencrypt/live/' + domain +'/fullchain.pem'),
......