곽원석

Merge branch 'development' into master

...@@ -17,14 +17,19 @@ ...@@ -17,14 +17,19 @@
17 ## 개발 환경 및 도구 : 17 ## 개발 환경 및 도구 :
18 * Ubuntu Server 18.04 LTS 18 * Ubuntu Server 18.04 LTS
19 * Windows 10 19 * Windows 10
20 - * Ubuntu 16.04.7 20 + * Ubuntu 20.04 LTS (Focal Fossa)
21 21
22 22
23 - 23 +## 사용방법 :
24 +<img src="/QR코드.jpg" width="20%" height="20%"alt="line"></img>
25 + Line 앱을 설치 후 QR코드를 사용해 친구 추가를 해주세요!
24 26
25 ## 설치방법 : 27 ## 설치방법 :
26 - 개발환경 설정이 끝나는 대로 추가예정 28 + 미리 구축된 aws에서
27 - (aws구축이 불가능한 문제가 있음) 29 + git clone http://khuhub.khu.ac.kr/2014104077/OSS-Project.git
30 + npm install --save express
31 + npm install --save request
32 + npm install --save xml-js
28 33
29 34
30 ## 주요 기능 및 명령어 35 ## 주요 기능 및 명령어
...@@ -38,8 +43,9 @@ ...@@ -38,8 +43,9 @@
38 곽원석 <rhkrdnjstjr1@khu.ac.kr> 43 곽원석 <rhkrdnjstjr1@khu.ac.kr>
39 44
40 45
41 -License 46 +### License :
42 The MIT License (MIT) 47 The MIT License (MIT)
48 +
43 Copyright (c) 2020 곽원석 49 Copyright (c) 2020 곽원석
44 Permission is hereby granted, free of charge, to any person obtaining a copy 50 Permission is hereby granted, free of charge, to any person obtaining a copy
45 of this software and associated documentation files (the "Software"), to deal 51 of this software and associated documentation files (the "Software"), to deal
......
1 +//웹 프레임 웤
1 var express = require('express'); 2 var express = require('express');
2 -var app = express();
3 3
4 +// 요청 리소스 표현 모듈
5 +var request = require('request');
6 +
7 +// api로 받아올 데이터포맷이 xml이므로 json으로 파싱할 필요가 있음
8 +var convert = require('xml-js');
9 +const bodyParser = require('body-parser');
10 +var moment = require('moment');
11 +
12 +// 라인 메신져
13 +const TARGET_URL = 'https://api.line.me/v2/bot/message/reply'
14 +const TOKEN = 'OPv3udmn1UGx+xWZFm80KeZbeGJm63nyt+sTpvBr1Mbc1Y0FAeK4MohQLcWq5yytJ6vnaNgXZfigAEFdbjzs05b4QAU+9r1jcZ05t6QvhWDTRYT0Z+YDMMePXtrQYCT84kmkH0OpJ4smBFwLxrtwtAdB04t89/1O/w1cDnyilFU='
4 15
5 // 공공보건포털_API 16 // 공공보건포털_API
6 -var request = require('request');
7 -// 파싱할 URL
8 -var url = 'http://openapi.data.go.kr/openapi/service/rest/Covid19/getCovid19InfStateJson';
9 -var queryParams = '?' + encodeURIComponent('ServiceKey') + '=서비스키'; /* Service Key*/
10 -queryParams += '&' + encodeURIComponent('pageNo') + '=' + encodeURIComponent('1'); /* */
11 -queryParams += '&' + encodeURIComponent('numOfRows') + '=' + encodeURIComponent('10'); /* */
12 -queryParams += '&' + encodeURIComponent('startCreateDt') + '=' + encodeURIComponent('20200310'); /* */
13 -queryParams += '&' + encodeURIComponent('endCreateDt') + '=' + encodeURIComponent('20200315'); /* */
14 -
15 -request({
16 - url: url + queryParams,
17 - method: 'GET'
18 -}, function (error, response, body) {
19 - //console.log('Status', response.statusCode);
20 - //console.log('Headers', JSON.stringify(response.headers));
21 - //console.log('Reponse received', body);
22 -});
...\ No newline at end of file ...\ No newline at end of file
17 +const CORONA_URL = 'http://openapi.data.go.kr/openapi/service/rest/Covid19/getCovid19InfStateJson';
18 +const SERVICE_KEY = 'DMUPOq6b%2B%2F1gqfLEXQ6bnhgoTO73BfPprA6HVNcV%2F6vHMGG%2Bgiw%2BPDkPvX1eQ7b9uvl%2B42fxUPkU0W3Si907Lw%3D%3D'
19 +queryParams = '?' + encodeURIComponent('ServiceKey') + '=' + SERVICE_KEY; // Service Key
20 +queryParams += '&' + encodeURIComponent('pageNo') + '=' + encodeURIComponent('1');
21 +queryParams += '&' + encodeURIComponent('numOfRows') + '=' + encodeURIComponent('4');
22 +var menu = 0;
23 +var start_checker = false;
24 +
25 +// express 미들웨어 정의
26 +var app = express();
27 +app.use(bodyParser.json());
28 +
29 +// 기타 비동기식 오류처리에 쓰일 모듈들
30 +const fs = require('fs');
31 +const path = require('path');
32 +const HTTPS = require('https');
33 +const { measureMemory } = require('vm');
34 +const domain = "www.oss-chatbot-kwak.tk"
35 +const sslport = 23023;
36 +
37 +// 챗봇으로 입력
38 +app.post('/hook', function (req, res) {
39 +
40 + var eventObj = req.body.events[0];
41 + var source = eventObj.source;
42 + var message = eventObj.message;
43 +
44 + // request log
45 + console.log('======================', new Date() ,'======================');
46 + console.log('[request]', req.body);
47 + console.log('[request source] ', eventObj.source);
48 + console.log('[request message]', eventObj.message);
49 +
50 + // 챗봇시작
51 + if(message.text == '/코로나' || message.text == '/corona'){
52 + request.post(
53 + {
54 + url: TARGET_URL,
55 + headers: {
56 + 'Authorization': `Bearer ${TOKEN}`
57 + },
58 + json: {
59 + "replyToken":eventObj.replyToken,
60 + "messages":[
61 + {
62 + "type":"text",
63 + "text":"명령어 : " + message.text + " 로 코로나 19 bot을 시작하셨습니다."
64 + },
65 + {
66 + "type":"text",
67 + "text":"명령어 :\n1. 확진자 수 :\t\t\t\t\t\t\t/확진자\n2. 격리해제 수 :\t\t/격리해제\n3. 검사진행 수 :\t\t/검사진행\n4. 사망자 수 :\t\t\t\t\t\t\t/사망자\n5. 치료중 환자 수 :\t/치료중\n6. 결과음성 수 :\t\t/결과음성\n7. 누적검사 수 :\t\t/누적검사\n8. 누적 확진률 :\t\t/누적확진\n"
68 + }
69 + ]
70 + }
71 + },(error, response, body) => {
72 + console.log(body)
73 + });
74 + start_checker = true;
75 + return;
76 + }
77 + else if(message.text == '/확진자' && start_checker == true){
78 + menu = 1;
79 + start_checker = false;
80 + request.post(
81 + {
82 + url: TARGET_URL,
83 + headers: {
84 + 'Authorization': `Bearer ${TOKEN}`
85 + },
86 + json: {
87 + "replyToken":eventObj.replyToken,
88 + "messages":[
89 + {
90 + "type":"text",
91 + "text":"확인하고 싶으신 일자를 적어주세요."
92 + },
93 + {
94 + "type":"text",
95 + "text":"포맷) YYYYMMDD"
96 + }
97 + ]
98 + }
99 + },(error, response, body) => {
100 + console.log(body)
101 + });
102 + return;
103 + }
104 + else if(message.text == '/격리해제' && start_checker == true){
105 + menu = 2;
106 + start_checker = false;
107 + request.post(
108 + {
109 + url: TARGET_URL,
110 + headers: {
111 + 'Authorization': `Bearer ${TOKEN}`
112 + },
113 + json: {
114 + "replyToken":eventObj.replyToken,
115 + "messages":[
116 + {
117 + "type":"text",
118 + "text":"확인하고 싶으신 일자를 적어주세요."
119 + },
120 + {
121 + "type":"text",
122 + "text":"포맷) YYYYMMDD"
123 + }
124 + ]
125 + }
126 + },(error, response, body) => {
127 + console.log(body)
128 + });
129 + return;
130 + }
131 + else if(message.text == '/검사진행' && start_checker == true){
132 + menu = 3;
133 + start_checker = false;
134 + request.post(
135 + {
136 + url: TARGET_URL,
137 + headers: {
138 + 'Authorization': `Bearer ${TOKEN}`
139 + },
140 + json: {
141 + "replyToken":eventObj.replyToken,
142 + "messages":[
143 + {
144 + "type":"text",
145 + "text":"확인하고 싶으신 일자를 적어주세요."
146 + },
147 + {
148 + "type":"text",
149 + "text":"포맷) YYYYMMDD"
150 + }
151 + ]
152 + }
153 + },(error, response, body) => {
154 + console.log(body)
155 + });
156 + return;
157 + }
158 + else if(message.text == '/사망자' && start_checker == true){
159 + menu = 4;
160 + start_checker = false;
161 + request.post(
162 + {
163 + url: TARGET_URL,
164 + headers: {
165 + 'Authorization': `Bearer ${TOKEN}`
166 + },
167 + json: {
168 + "replyToken":eventObj.replyToken,
169 + "messages":[
170 + {
171 + "type":"text",
172 + "text":"확인하고 싶으신 일자를 적어주세요."
173 + },
174 + {
175 + "type":"text",
176 + "text":"포맷) YYYYMMDD"
177 + }
178 + ]
179 + }
180 + },(error, response, body) => {
181 + console.log(body)
182 + });
183 + return;
184 + }
185 + else if(message.text == '/치료중' && start_checker == true){
186 + menu = 5;
187 + start_checker = false;
188 + request.post(
189 + {
190 + url: TARGET_URL,
191 + headers: {
192 + 'Authorization': `Bearer ${TOKEN}`
193 + },
194 + json: {
195 + "replyToken":eventObj.replyToken,
196 + "messages":[
197 + {
198 + "type":"text",
199 + "text":"확인하고 싶으신 일자를 적어주세요."
200 + },
201 + {
202 + "type":"text",
203 + "text":"포맷) YYYYMMDD"
204 + }
205 + ]
206 + }
207 + },(error, response, body) => {
208 + console.log(body)
209 + });
210 + return;
211 + }
212 + else if(message.text == '/음성' && start_checker == true){
213 + menu = 6;
214 + start_checker = false;
215 + request.post(
216 + {
217 + url: TARGET_URL,
218 + headers: {
219 + 'Authorization': `Bearer ${TOKEN}`
220 + },
221 + json: {
222 + "replyToken":eventObj.replyToken,
223 + "messages":[
224 + {
225 + "type":"text",
226 + "text":"확인하고 싶으신 일자를 적어주세요."
227 + },
228 + {
229 + "type":"text",
230 + "text":"포맷) YYYYMMDD"
231 + }
232 + ]
233 + }
234 + },(error, response, body) => {
235 + console.log(body)
236 + });
237 + return;
238 + }
239 + else if(message.text == '/누적검사' && start_checker == true){
240 + menu = 7;
241 + start_checker = false;
242 + request.post(
243 + {
244 + url: TARGET_URL,
245 + headers: {
246 + 'Authorization': `Bearer ${TOKEN}`
247 + },
248 + json: {
249 + "replyToken":eventObj.replyToken,
250 + "messages":[
251 + {
252 + "type":"text",
253 + "text":"확인하고 싶으신 일자를 적어주세요."
254 + },
255 + {
256 + "type":"text",
257 + "text":"포맷) YYYYMMDD"
258 + }
259 + ]
260 + }
261 + },(error, response, body) => {
262 + console.log(body)
263 + });
264 + return;
265 + }
266 + else if(message.text == '/누적확진' && start_checker == true){
267 + menu = 8;
268 + start_checker = false;
269 + request.post(
270 + {
271 + url: TARGET_URL,
272 + headers: {
273 + 'Authorization': `Bearer ${TOKEN}`
274 + },
275 + json: {
276 + "replyToken":eventObj.replyToken,
277 + "messages":[
278 + {
279 + "type":"text",
280 + "text":"확인하고 싶으신 일자를 적어주세요.\n포맷 : YYYYMMDD 입니다."
281 + },
282 + {
283 + "type":"text",
284 + "text":"포맷) YYYYMMDD"
285 + }
286 + ]
287 + }
288 + },(error, response, body) => {
289 + console.log(body)
290 + });
291 + return;
292 + }
293 + else if(start_checker == true){
294 + menu = 0;
295 + request.post(
296 + {
297 + url: TARGET_URL,
298 + headers: {
299 + 'Authorization': `Bearer ${TOKEN}`
300 + },
301 + json: {
302 + "replyToken":eventObj.replyToken,
303 + "messages":[
304 + {
305 + "type":"text",
306 + "text":"선택하신 정보가 정확하지 않거나 없습니다.\n처음부터 다시 진행해주세요."
307 + },
308 + ]
309 + }
310 + },(error, response, body) => {
311 + console.log(body)
312 + });
313 + start_checker = false;
314 + return;
315 + }
316 +
317 + if((menu != 0) && moment(message.text).isAfter(20200301)){
318 + today = message.text;
319 + queryParams += '&' + encodeURIComponent('endCreateDt') + '=' + encodeURIComponent(today);
320 + switch(menu){
321 + case 1:
322 + bot_reply_1(eventObj.replyToken, message);
323 + break;
324 + case 2:
325 + bot_reply_2(eventObj.replyToken, message);
326 + break;
327 + case 3:
328 + bot_reply_3(eventObj.replyToken, message);
329 + break;
330 + case 4:
331 + bot_reply_4(eventObj.replyToken, message);
332 + break;
333 + case 5:
334 + bot_reply_5(eventObj.replyToken, message);
335 + break;
336 + case 6:
337 + bot_reply_6(eventObj.replyToken, message);
338 + break;
339 + case 7:
340 + bot_reply_7(eventObj.replyToken, message);
341 + break;
342 + case 8:
343 + bot_reply_8(eventObj.replyToken, message);
344 + break;
345 + default :
346 + break;
347 + }
348 + }
349 + else if(menu == 0){
350 + request.post(
351 + {
352 + url: TARGET_URL,
353 + headers: {
354 + 'Authorization': `Bearer ${TOKEN}`
355 + },
356 + json: {
357 + "replyToken":eventObj.replyToken,
358 + "messages":[
359 + {
360 + "type":"text",
361 + "text":"코로나 봇을 찾으시나요?\n명령어는 /코로나 또는 /corona 입니다."
362 + }
363 + ]
364 + }
365 + },(error, response, body) => {
366 + console.log(body)
367 + });
368 + }
369 + else{
370 + request.post(
371 + {
372 + url: TARGET_URL,
373 + headers: {
374 + 'Authorization': `Bearer ${TOKEN}`
375 + },
376 + json: {
377 + "replyToken":eventObj.replyToken,
378 + "messages":[
379 + {
380 + "type":"text",
381 + "text":"바른 날짜를 입력해주세요.."
382 + }
383 + ]
384 + }
385 + },(error, response, body) => {
386 + console.log(body)
387 + });
388 + }
389 +
390 +
391 + res.sendStatus(200);
392 +});
393 +
394 +function bot_reply_1(replyToken, message) {
395 + request({
396 + url: CORONA_URL + queryParams,
397 + method: 'GET'
398 + },(error, response, body) => {
399 + if(!error && response.statusCode == 200) {
400 + console.log('Status', response.statusCode);
401 + console.log('Headers', JSON.stringify(response.headers));
402 + var xmlToJson = convert.xml2json(response.body, {compact: true, spaces: 4});
403 + const jsonData = JSON.parse(xmlToJson); // json text -> json object
404 + console.log('Reponse received', xmlToJson); // json text
405 +
406 + var resultMessage1 = jsonData.response.body.items.item[1];
407 + var resultMessage2 = jsonData.response.body.items.item[0];
408 +
409 + request.post(
410 + {
411 + url: TARGET_URL,
412 + headers: {
413 + 'Authorization': `Bearer ${TOKEN}`
414 + },
415 + json: {
416 + "replyToken":replyToken,
417 + "messages":[
418 + {
419 + "type":"text",
420 + "text": '선택하신 날짜와 정보의 Corona Virus-19 현황은 다음과 같습니다.'
421 + },
422 + {
423 + "type":"text",
424 + "text": "확진자 수 : " + (parseInt(resultMessage2.decideCnt._text)-parseInt(resultMessage1.decideCnt._text))
425 + },
426 + {
427 + "type":"text",
428 + "text": "등록일시분초 : " + resultMessage2.createDt._text
429 + }
430 + ]
431 + }
432 + },(error, response, body) => {
433 + console.log(body)
434 + });
435 + }
436 + });
437 +}
438 +function bot_reply_2(replyToken, message) {
439 + request({
440 + url: CORONA_URL + queryParams,
441 + method: 'GET'
442 + },(error, response, body) => {
443 + if(!error && response.statusCode == 200) {
444 + console.log('Status', response.statusCode);
445 + console.log('Headers', JSON.stringify(response.headers));
446 + var xmlToJson = convert.xml2json(response.body, {compact: true, spaces: 4});
447 + const jsonData = JSON.parse(xmlToJson); // json text -> json object
448 + console.log('Reponse received', xmlToJson); // json text
449 +
450 + var resultMessage1 = jsonData.response.body.items.item[1];
451 + var resultMessage2 = jsonData.response.body.items.item[0];
452 + request.post(
453 + {
454 + url: TARGET_URL,
455 + headers: {
456 + 'Authorization': `Bearer ${TOKEN}`
457 + },
458 + json: {
459 + "replyToken":replyToken,
460 + "messages":[
461 + {
462 + "type":"text",
463 + "text": '선택하신 날짜와 정보의 Corona Virus-19 현황은 다음과 같습니다.'
464 + },
465 + {
466 + "type":"text",
467 + "text": "격리해제 수 : " + (parseInt(resultMessage2.clearCnt._text)-parseInt(resultMessage1.clearCnt._text))
468 + },
469 + {
470 + "type":"text",
471 + "text": "등록일시분초 : " + resultMessage2.createDt._text
472 + }
473 + ]
474 + }
475 + },(error, response, body) => {
476 + console.log(body)
477 + });
478 + }
479 + });
480 +}
481 +function bot_reply_3(replyToken, message) {
482 + request({
483 + url: CORONA_URL + queryParams,
484 + method: 'GET'
485 + },(error, response, body) => {
486 + if(!error && response.statusCode == 200) {
487 + console.log('Status', response.statusCode);
488 + console.log('Headers', JSON.stringify(response.headers));
489 + var xmlToJson = convert.xml2json(response.body, {compact: true, spaces: 4});
490 + const jsonData = JSON.parse(xmlToJson); // json text -> json object
491 + console.log('Reponse received', xmlToJson); // json text
492 +
493 + var resultMessage1 = jsonData.response.body.items.item[1];
494 + var resultMessage2 = jsonData.response.body.items.item[0];
495 + request.post(
496 + {
497 + url: TARGET_URL,
498 + headers: {
499 + 'Authorization': `Bearer ${TOKEN}`
500 + },
501 + json: {
502 + "replyToken":replyToken,
503 + "messages":[
504 + {
505 + "type":"text",
506 + "text": '선택하신 날짜와 정보의 Corona Virus-19 현황은 다음과 같습니다.'
507 + },
508 + {
509 + "type":"text",
510 + "text": "검사진행 수 : " + (parseInt(resultMessage2.examCnt._text)-parseInt(resultMessage1.examCnt._text))
511 + },
512 + {
513 + "type":"text",
514 + "text": "등록일시분초 : " + resultMessage2.createDt._text
515 + }
516 + ]
517 + }
518 + },(error, response, body) => {
519 + console.log(body)
520 + });
521 + }
522 + });
523 +}
524 +function bot_reply_4(replyToken, message) {
525 + request({
526 + url: CORONA_URL + queryParams,
527 + method: 'GET'
528 + },(error, response, body) => {
529 + if(!error && response.statusCode == 200) {
530 + console.log('Status', response.statusCode);
531 + console.log('Headers', JSON.stringify(response.headers));
532 + var xmlToJson = convert.xml2json(response.body, {compact: true, spaces: 4});
533 + const jsonData = JSON.parse(xmlToJson); // json text -> json object
534 + console.log('Reponse received', xmlToJson); // json text
535 +
536 + var resultMessage1 = jsonData.response.body.items.item[1];
537 + var resultMessage2 = jsonData.response.body.items.item[0];
538 + request.post(
539 + {
540 + url: TARGET_URL,
541 + headers: {
542 + 'Authorization': `Bearer ${TOKEN}`
543 + },
544 + json: {
545 + "replyToken":replyToken,
546 + "messages":[
547 + {
548 + "type":"text",
549 + "text": '선택하신 날짜와 정보의 Corona Virus-19 현황은 다음과 같습니다.'
550 + },
551 + {
552 + "type":"text",
553 + "text": "사망자 수 : " + (parseInt(resultMessage2.deathCnt._text)-parseInt(resultMessage1.deathCnt._text))
554 + },
555 + {
556 + "type":"text",
557 + "text": "등록일시분초 : " + resultMessage2.createDt._text
558 + }
559 + ]
560 + }
561 + },(error, response, body) => {
562 + console.log(body)
563 + });
564 + }
565 + });
566 +}
567 +function bot_reply_5(replyToken, message) {
568 + request({
569 + url: CORONA_URL + queryParams,
570 + method: 'GET'
571 + },(error, response, body) => {
572 + if(!error && response.statusCode == 200) {
573 + console.log('Status', response.statusCode);
574 + console.log('Headers', JSON.stringify(response.headers));
575 + var xmlToJson = convert.xml2json(response.body, {compact: true, spaces: 4});
576 + const jsonData = JSON.parse(xmlToJson); // json text -> json object
577 + console.log('Reponse received', xmlToJson); // json text
578 +
579 + var resultMessage1 = jsonData.response.body.items.item[1];
580 + var resultMessage2 = jsonData.response.body.items.item[0];
581 + request.post(
582 + {
583 + url: TARGET_URL,
584 + headers: {
585 + 'Authorization': `Bearer ${TOKEN}`
586 + },
587 + json: {
588 + "replyToken":replyToken,
589 + "messages":[
590 + {
591 + "type":"text",
592 + "text": '선택하신 날짜와 정보의 Corona Virus-19 현황은 다음과 같습니다.'
593 + },
594 + {
595 + "type":"text",
596 + "text": "치료중 환자 수 : " + (parseInt(resultMessage2.careCnt._text)-parseInt(resultMessage1.careCnt._text))
597 + },
598 + {
599 + "type":"text",
600 + "text": "등록일시분초 : " + resultMessage2.createDt._text
601 + }
602 + ]
603 + }
604 + },(error, response, body) => {
605 + console.log(body)
606 + });
607 + }
608 + });
609 +}
610 +function bot_reply_6(replyToken, message) {
611 + request({
612 + url: CORONA_URL + queryParams,
613 + method: 'GET'
614 + },(error, response, body) => {
615 + if(!error && response.statusCode == 200) {
616 + console.log('Status', response.statusCode);
617 + console.log('Headers', JSON.stringify(response.headers));
618 + var xmlToJson = convert.xml2json(response.body, {compact: true, spaces: 4});
619 + const jsonData = JSON.parse(xmlToJson); // json text -> json object
620 + console.log('Reponse received', xmlToJson); // json text
621 +
622 + var resultMessage1 = jsonData.response.body.items.item[1];
623 + var resultMessage2 = jsonData.response.body.items.item[0];
624 + request.post(
625 + {
626 + url: TARGET_URL,
627 + headers: {
628 + 'Authorization': `Bearer ${TOKEN}`
629 + },
630 + json: {
631 + "replyToken":replyToken,
632 + "messages":[
633 + {
634 + "type":"text",
635 + "text": '선택하신 날짜와 정보의 Corona Virus-19 현황은 다음과 같습니다.'
636 + },
637 + {
638 + "type":"text",
639 + "text": "결과 음성 수 : " + (parseInt(resultMessage2.resutlNegCnt._text)-parseInt(resultMessage1.resutlNegCnt._text))
640 + },
641 + {
642 + "type":"text",
643 + "text": "등록일시분초 : " + resultMessage2.createDt._text
644 + }
645 + ]
646 + }
647 + },(error, response, body) => {
648 + console.log(body)
649 + });
650 + }
651 + });
652 +}
653 +function bot_reply_7(replyToken, message) {
654 + request({
655 + url: CORONA_URL + queryParams,
656 + method: 'GET'
657 + },(error, response, body) => {
658 + if(!error && response.statusCode == 200) {
659 + console.log('Status', response.statusCode);
660 + console.log('Headers', JSON.stringify(response.headers));
661 + var xmlToJson = convert.xml2json(response.body, {compact: true, spaces: 4});
662 + const jsonData = JSON.parse(xmlToJson); // json text -> json object
663 + console.log('Reponse received', xmlToJson); // json text
664 +
665 + var resultMessage = jsonData.response.body.items.item;
666 +
667 + request.post(
668 + {
669 + url: TARGET_URL,
670 + headers: {
671 + 'Authorization': `Bearer ${TOKEN}`
672 + },
673 + json: {
674 + "replyToken":replyToken,
675 + "messages":[
676 + {
677 + "type":"text",
678 + "text": '선택하신 날짜와 정보의 Corona Virus-19 현황은 다음과 같습니다.'
679 + },
680 + {
681 + "type":"text",
682 + "text": "누적 검사 수 : " + resultMessage.accExamCnt._text
683 + },
684 + {
685 + "type":"text",
686 + "text": "누적 검사 완료 수 : " + resultMessage.accExamCompCnt._text
687 + },
688 + {
689 + "type":"text",
690 + "text": "등록일시분초 : " + resultMessage.createDt._text
691 + }
692 + ]
693 + }
694 + },(error, response, body) => {
695 + console.log(body)
696 + });
697 + }
698 + });
699 +}
700 +function bot_reply_8(replyToken, message) {
701 + request({
702 + url: CORONA_URL + queryParams,
703 + method: 'GET'
704 + },(error, response, body) => {
705 + if(!error && response.statusCode == 200) {
706 + console.log('Status', response.statusCode);
707 + console.log('Headers', JSON.stringify(response.headers));
708 + var xmlToJson = convert.xml2json(response.body, {compact: true, spaces: 4});
709 + const jsonData = JSON.parse(xmlToJson); // json text -> json object
710 + console.log('Reponse received', xmlToJson); // json text
711 +
712 + var resultMessage = jsonData.response.body.items.item;
713 +
714 + request.post(
715 + {
716 + url: TARGET_URL,
717 + headers: {
718 + 'Authorization': `Bearer ${TOKEN}`
719 + },
720 + json: {
721 + "replyToken":replyToken,
722 + "messages":[
723 + {
724 + "type":"text",
725 + "text": '선택하신 날짜와 정보의 Corona Virus-19 현황은 다음과 같습니다.'
726 + },
727 + {
728 + "type":"text",
729 + "text": "누적 확진률 : " + resultMessage.accDefRate._text
730 + },
731 + {
732 + "type":"text",
733 + "text": "등록일시분초 : " + resultMessage.createDt._text
734 + }
735 + ]
736 + }
737 + },(error, response, body) => {
738 + console.log(body)
739 + });
740 + }
741 + });
742 +}
743 +
744 +// Https server 오류처리
745 +try {
746 + const option = {
747 + ca: fs.readFileSync('/etc/letsencrypt/live/' + domain +'/fullchain.pem'),
748 + key: fs.readFileSync(path.resolve(process.cwd(), '/etc/letsencrypt/live/' + domain +'/privkey.pem'), 'utf8').toString(),
749 + cert: fs.readFileSync(path.resolve(process.cwd(), '/etc/letsencrypt/live/' + domain +'/cert.pem'), 'utf8').toString(),
750 + };
751 +
752 + HTTPS.createServer(option, app).listen(sslport, () => {
753 + console.log(`[HTTPS] Server is started on port ${sslport}`);
754 + });
755 + } catch (error) {
756 + console.log('[HTTPS] HTTPS 오류가 발생하였습니다. HTTPS 서버는 실행되지 않습니다.');
757 + console.log(error);
758 + }
...\ No newline at end of file ...\ No newline at end of file
......
1 -var express = require('express');
2 -var app = express();
3 -const line = require('@line/bot-sdk');
4 -
5 -
6 -//papago api
7 -var request = require('request');
8 -
9 -//번역 api_url
10 -var translate_api_url = 'https://openapi.naver.com/v1/papago/n2mt';
11 -
12 -//언어감지 api_url
13 -var languagedetect_api_url = 'https://openapi.naver.com/v1/papago/detectLangs'
14 -
15 -// Naver Auth Key
16 -//새로 발급받은 naver papago api id, pw 입력
17 -var client_id = 'xZMx34y7uru1v8lywZ2d';
18 -var client_secret = 'p6L7M7WsH9';
19 -
20 -const config = {
21 - channelAccessToken: 'mnny0MJSezgBXzR9C3Ddcc1Csdb7Y9jkvy2nqV5saOmvR2YOJ1/kj/2M0CNsLA+57B2qDpdUQ7WbCTtIKx/LAJ6Kwfop4tX3up7EM8H9EZK1td6GMbhhCb6wvUFVdb1PcTO4joCv8mspd3ubo8a+gAdB04t89/1O/w1cDnyilFU=',
22 - channelSecret: 'bde77633a16fc5bfbd532d5990c6170e',
23 -};
24 -
25 -
26 -// create LINE SDK client
27 -const client = new line.Client(config);
28 -
29 -// create Express app
30 -// about Express itself: https://expressjs.com/
31 -
32 -// register a webhook handler with middleware
33 -// about the middleware, please refer to doc
34 -app.post('/webhook', line.middleware(config), (req, res) => {
35 - Promise
36 - .all(req.body.events.map(handleEvent))
37 - .then((result) => res.json(result))
38 - .catch((err) => {
39 - console.error(err);
40 - res.status(200).end();
41 - });
42 -});
43 -
44 -// event handler
45 -function handleEvent(event) {
46 - if (event.type !== 'message' || event.message.type !== 'text') {
47 - // ignore non-text-message event
48 - return Promise.resolve(null);
49 - }
50 - return new Promise(function(resolve, reject) {
51 - //언어 감지 option
52 - var detect_options = {
53 - url : languagedetect_api_url,
54 - form : {'query': event.message.text},
55 - headers: {'X-Naver-Client-Id': client_id, 'X-Naver-Client-Secret': client_secret}
56 - };
57 -
58 - //papago 언어 감지
59 - request.post(detect_options,function(error,response,body){
60 - console.log(response.statusCode);
61 - if(!error && response.statusCode == 200){
62 - var detect_body = JSON.parse(response.body);
63 - var source = '';
64 - var target = '';
65 - var result = { type: 'text', text:''};
66 -
67 - //언어 감지가 제대로 됐는지 확인
68 - console.log(detect_body.langCode);
69 -
70 -
71 - //번역은 한국어->영어 / 영어->한국어만 지원
72 - if(detect_body.langCode == 'ko'||detect_body.langCode == 'en'){
73 - source = detect_body.langCode == 'ko' ? 'ko':'en';
74 - target = source == 'ko' ? 'en':'ko';
75 - //papago 번역 option
76 - var options = {
77 - url: translate_api_url,
78 - // 한국어(source : ko), 영어(target: en), 카톡에서 받는 메시지(text)
79 - form: {'source':source, 'target':target, 'text':event.message.text},
80 - headers: {'X-Naver-Client-Id': client_id, 'X-Naver-Client-Secret': client_secret}
81 - };
82 -
83 - // Naver Post API
84 - request.post(options, function(error, response, body){
85 - // Translate API Sucess
86 - if(!error && response.statusCode == 200){
87 - // JSON
88 - var objBody = JSON.parse(response.body);
89 - // Message 잘 찍히는지 확인
90 -
91 - result.text = objBody.message.result.translatedText;
92 - console.log(result.text);
93 - //번역된 문장 보내기
94 - client.replyMessage(event.replyToken,result).then(resolve).catch(reject);
95 - }
96 - });
97 - }
98 - // 메시지의 언어가 영어 또는 한국어가 아닐 경우
99 - else{
100 - result.text = '언어를 감지할 수 없습니다. \n 번역 언어는 한글 또는 영어만 가능합니다.';
101 - client.replyMessage(event.replyToken,result).then(resolve).catch(reject);
102 - }
103 -
104 - }
105 -
106 - });
107 -
108 - });
109 - }
110 -
111 -app.listen(3000, function () {
112 - console.log('Linebot listening on port 3000!');
113 -});
1 { 1 {
2 - "name": "linebot", 2 + "name": "corona_bot",
3 "version": "1.0.0", 3 "version": "1.0.0",
4 "lockfileVersion": 1, 4 "lockfileVersion": 1,
5 "requires": true, 5 "requires": true,
...@@ -48,19 +48,73 @@ ...@@ -48,19 +48,73 @@
48 "integrity": "sha512-RO4ig5taKmcrU4Rex8ojG1gpwFkjddzug9iPQSDvbewHN9vDpcFewevkaOK+KT+w1LeZnxbgOyfXwV4pxsQ4GQ==" 48 "integrity": "sha512-RO4ig5taKmcrU4Rex8ojG1gpwFkjddzug9iPQSDvbewHN9vDpcFewevkaOK+KT+w1LeZnxbgOyfXwV4pxsQ4GQ=="
49 }, 49 },
50 "accepts": { 50 "accepts": {
51 - "version": "1.3.5", 51 + "version": "1.3.7",
52 - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 52 + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
53 - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 53 + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
54 "requires": { 54 "requires": {
55 - "mime-types": "~2.1.18", 55 + "mime-types": "~2.1.24",
56 - "negotiator": "0.6.1" 56 + "negotiator": "0.6.2"
57 + },
58 + "dependencies": {
59 + "mime-db": {
60 + "version": "1.44.0",
61 + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
62 + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
63 + },
64 + "mime-types": {
65 + "version": "2.1.27",
66 + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
67 + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
68 + "requires": {
69 + "mime-db": "1.44.0"
70 + }
71 + }
72 + }
73 + },
74 + "ajv": {
75 + "version": "6.12.6",
76 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
77 + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
78 + "requires": {
79 + "fast-deep-equal": "^3.1.1",
80 + "fast-json-stable-stringify": "^2.0.0",
81 + "json-schema-traverse": "^0.4.1",
82 + "uri-js": "^4.2.2"
57 } 83 }
58 }, 84 },
59 "array-flatten": { 85 "array-flatten": {
60 "version": "1.1.1", 86 "version": "1.1.1",
61 - "resolved": "http://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 87 + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
62 "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 88 "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
63 }, 89 },
90 + "asn1": {
91 + "version": "0.2.4",
92 + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
93 + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
94 + "requires": {
95 + "safer-buffer": "~2.1.0"
96 + }
97 + },
98 + "assert-plus": {
99 + "version": "1.0.0",
100 + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
101 + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
102 + },
103 + "asynckit": {
104 + "version": "0.4.0",
105 + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
106 + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
107 + },
108 + "aws-sign2": {
109 + "version": "0.7.0",
110 + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
111 + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
112 + },
113 + "aws4": {
114 + "version": "1.11.0",
115 + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
116 + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
117 + },
64 "axios": { 118 "axios": {
65 "version": "0.16.2", 119 "version": "0.16.2",
66 "resolved": "https://registry.npmjs.org/axios/-/axios-0.16.2.tgz", 120 "resolved": "https://registry.npmjs.org/axios/-/axios-0.16.2.tgz",
...@@ -70,6 +124,14 @@ ...@@ -70,6 +124,14 @@
70 "is-buffer": "^1.1.5" 124 "is-buffer": "^1.1.5"
71 } 125 }
72 }, 126 },
127 + "bcrypt-pbkdf": {
128 + "version": "1.0.2",
129 + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
130 + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
131 + "requires": {
132 + "tweetnacl": "^0.14.3"
133 + }
134 + },
73 "body-parser": { 135 "body-parser": {
74 "version": "1.18.3", 136 "version": "1.18.3",
75 "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 137 "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
...@@ -92,10 +154,26 @@ ...@@ -92,10 +154,26 @@
92 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 154 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
93 "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 155 "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
94 }, 156 },
157 + "caseless": {
158 + "version": "0.12.0",
159 + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
160 + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
161 + },
162 + "combined-stream": {
163 + "version": "1.0.8",
164 + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
165 + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
166 + "requires": {
167 + "delayed-stream": "~1.0.0"
168 + }
169 + },
95 "content-disposition": { 170 "content-disposition": {
96 - "version": "0.5.2", 171 + "version": "0.5.3",
97 - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 172 + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
98 - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 173 + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
174 + "requires": {
175 + "safe-buffer": "5.1.2"
176 + }
99 }, 177 },
100 "content-type": { 178 "content-type": {
101 "version": "1.0.4", 179 "version": "1.0.4",
...@@ -103,15 +181,28 @@ ...@@ -103,15 +181,28 @@
103 "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 181 "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
104 }, 182 },
105 "cookie": { 183 "cookie": {
106 - "version": "0.3.1", 184 + "version": "0.4.0",
107 - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 185 + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
108 - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 186 + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
109 }, 187 },
110 "cookie-signature": { 188 "cookie-signature": {
111 "version": "1.0.6", 189 "version": "1.0.6",
112 "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 190 "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
113 "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 191 "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
114 }, 192 },
193 + "core-util-is": {
194 + "version": "1.0.2",
195 + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
196 + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
197 + },
198 + "dashdash": {
199 + "version": "1.14.1",
200 + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
201 + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
202 + "requires": {
203 + "assert-plus": "^1.0.0"
204 + }
205 + },
115 "debug": { 206 "debug": {
116 "version": "2.6.9", 207 "version": "2.6.9",
117 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 208 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
...@@ -120,6 +211,11 @@ ...@@ -120,6 +211,11 @@
120 "ms": "2.0.0" 211 "ms": "2.0.0"
121 } 212 }
122 }, 213 },
214 + "delayed-stream": {
215 + "version": "1.0.0",
216 + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
217 + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
218 + },
123 "depd": { 219 "depd": {
124 "version": "1.1.2", 220 "version": "1.1.2",
125 "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 221 "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
...@@ -130,6 +226,15 @@ ...@@ -130,6 +226,15 @@
130 "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 226 "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
131 "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 227 "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
132 }, 228 },
229 + "ecc-jsbn": {
230 + "version": "0.1.2",
231 + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
232 + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
233 + "requires": {
234 + "jsbn": "~0.1.0",
235 + "safer-buffer": "^2.1.0"
236 + }
237 + },
133 "ee-first": { 238 "ee-first": {
134 "version": "1.1.1", 239 "version": "1.1.1",
135 "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 240 "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
...@@ -151,59 +256,178 @@ ...@@ -151,59 +256,178 @@
151 "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 256 "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
152 }, 257 },
153 "express": { 258 "express": {
154 - "version": "4.16.4", 259 + "version": "4.17.1",
155 - "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 260 + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
156 - "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 261 + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
157 "requires": { 262 "requires": {
158 - "accepts": "~1.3.5", 263 + "accepts": "~1.3.7",
159 "array-flatten": "1.1.1", 264 "array-flatten": "1.1.1",
160 - "body-parser": "1.18.3", 265 + "body-parser": "1.19.0",
161 - "content-disposition": "0.5.2", 266 + "content-disposition": "0.5.3",
162 "content-type": "~1.0.4", 267 "content-type": "~1.0.4",
163 - "cookie": "0.3.1", 268 + "cookie": "0.4.0",
164 "cookie-signature": "1.0.6", 269 "cookie-signature": "1.0.6",
165 "debug": "2.6.9", 270 "debug": "2.6.9",
166 "depd": "~1.1.2", 271 "depd": "~1.1.2",
167 "encodeurl": "~1.0.2", 272 "encodeurl": "~1.0.2",
168 "escape-html": "~1.0.3", 273 "escape-html": "~1.0.3",
169 "etag": "~1.8.1", 274 "etag": "~1.8.1",
170 - "finalhandler": "1.1.1", 275 + "finalhandler": "~1.1.2",
171 "fresh": "0.5.2", 276 "fresh": "0.5.2",
172 "merge-descriptors": "1.0.1", 277 "merge-descriptors": "1.0.1",
173 "methods": "~1.1.2", 278 "methods": "~1.1.2",
174 "on-finished": "~2.3.0", 279 "on-finished": "~2.3.0",
175 - "parseurl": "~1.3.2", 280 + "parseurl": "~1.3.3",
176 "path-to-regexp": "0.1.7", 281 "path-to-regexp": "0.1.7",
177 - "proxy-addr": "~2.0.4", 282 + "proxy-addr": "~2.0.5",
178 - "qs": "6.5.2", 283 + "qs": "6.7.0",
179 - "range-parser": "~1.2.0", 284 + "range-parser": "~1.2.1",
180 "safe-buffer": "5.1.2", 285 "safe-buffer": "5.1.2",
181 - "send": "0.16.2", 286 + "send": "0.17.1",
182 - "serve-static": "1.13.2", 287 + "serve-static": "1.14.1",
183 - "setprototypeof": "1.1.0", 288 + "setprototypeof": "1.1.1",
184 - "statuses": "~1.4.0", 289 + "statuses": "~1.5.0",
185 - "type-is": "~1.6.16", 290 + "type-is": "~1.6.18",
186 "utils-merge": "1.0.1", 291 "utils-merge": "1.0.1",
187 "vary": "~1.1.2" 292 "vary": "~1.1.2"
293 + },
294 + "dependencies": {
295 + "body-parser": {
296 + "version": "1.19.0",
297 + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
298 + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
299 + "requires": {
300 + "bytes": "3.1.0",
301 + "content-type": "~1.0.4",
302 + "debug": "2.6.9",
303 + "depd": "~1.1.2",
304 + "http-errors": "1.7.2",
305 + "iconv-lite": "0.4.24",
306 + "on-finished": "~2.3.0",
307 + "qs": "6.7.0",
308 + "raw-body": "2.4.0",
309 + "type-is": "~1.6.17"
310 + }
311 + },
312 + "bytes": {
313 + "version": "3.1.0",
314 + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
315 + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
316 + },
317 + "http-errors": {
318 + "version": "1.7.2",
319 + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
320 + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
321 + "requires": {
322 + "depd": "~1.1.2",
323 + "inherits": "2.0.3",
324 + "setprototypeof": "1.1.1",
325 + "statuses": ">= 1.5.0 < 2",
326 + "toidentifier": "1.0.0"
327 + }
328 + },
329 + "iconv-lite": {
330 + "version": "0.4.24",
331 + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
332 + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
333 + "requires": {
334 + "safer-buffer": ">= 2.1.2 < 3"
335 + }
336 + },
337 + "mime-db": {
338 + "version": "1.44.0",
339 + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
340 + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
341 + },
342 + "mime-types": {
343 + "version": "2.1.27",
344 + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
345 + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
346 + "requires": {
347 + "mime-db": "1.44.0"
348 + }
349 + },
350 + "qs": {
351 + "version": "6.7.0",
352 + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
353 + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
354 + },
355 + "raw-body": {
356 + "version": "2.4.0",
357 + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
358 + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
359 + "requires": {
360 + "bytes": "3.1.0",
361 + "http-errors": "1.7.2",
362 + "iconv-lite": "0.4.24",
363 + "unpipe": "1.0.0"
364 + }
365 + },
366 + "setprototypeof": {
367 + "version": "1.1.1",
368 + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
369 + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
370 + },
371 + "statuses": {
372 + "version": "1.5.0",
373 + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
374 + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
375 + },
376 + "type-is": {
377 + "version": "1.6.18",
378 + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
379 + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
380 + "requires": {
381 + "media-typer": "0.3.0",
382 + "mime-types": "~2.1.24"
383 + }
384 + }
188 } 385 }
189 }, 386 },
387 + "extend": {
388 + "version": "3.0.2",
389 + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
390 + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
391 + },
392 + "extsprintf": {
393 + "version": "1.3.0",
394 + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
395 + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
396 + },
397 + "fast-deep-equal": {
398 + "version": "3.1.3",
399 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
400 + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
401 + },
402 + "fast-json-stable-stringify": {
403 + "version": "2.1.0",
404 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
405 + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
406 + },
190 "file-type": { 407 "file-type": {
191 "version": "7.7.1", 408 "version": "7.7.1",
192 "resolved": "https://registry.npmjs.org/file-type/-/file-type-7.7.1.tgz", 409 "resolved": "https://registry.npmjs.org/file-type/-/file-type-7.7.1.tgz",
193 "integrity": "sha512-bTrKkzzZI6wH+NXhyD3SOXtb2zXTw2SbwI2RxUlRcXVsnN7jNL5hJzVQLYv7FOQhxFkK4XWdAflEaWFpaLLWpQ==" 410 "integrity": "sha512-bTrKkzzZI6wH+NXhyD3SOXtb2zXTw2SbwI2RxUlRcXVsnN7jNL5hJzVQLYv7FOQhxFkK4XWdAflEaWFpaLLWpQ=="
194 }, 411 },
195 "finalhandler": { 412 "finalhandler": {
196 - "version": "1.1.1", 413 + "version": "1.1.2",
197 - "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 414 + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
198 - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 415 + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
199 "requires": { 416 "requires": {
200 "debug": "2.6.9", 417 "debug": "2.6.9",
201 "encodeurl": "~1.0.2", 418 "encodeurl": "~1.0.2",
202 "escape-html": "~1.0.3", 419 "escape-html": "~1.0.3",
203 "on-finished": "~2.3.0", 420 "on-finished": "~2.3.0",
204 - "parseurl": "~1.3.2", 421 + "parseurl": "~1.3.3",
205 - "statuses": "~1.4.0", 422 + "statuses": "~1.5.0",
206 "unpipe": "~1.0.0" 423 "unpipe": "~1.0.0"
424 + },
425 + "dependencies": {
426 + "statuses": {
427 + "version": "1.5.0",
428 + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
429 + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
430 + }
207 } 431 }
208 }, 432 },
209 "follow-redirects": { 433 "follow-redirects": {
...@@ -224,6 +448,21 @@ ...@@ -224,6 +448,21 @@
224 } 448 }
225 } 449 }
226 }, 450 },
451 + "forever-agent": {
452 + "version": "0.6.1",
453 + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
454 + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
455 + },
456 + "form-data": {
457 + "version": "2.3.3",
458 + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
459 + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
460 + "requires": {
461 + "asynckit": "^0.4.0",
462 + "combined-stream": "^1.0.6",
463 + "mime-types": "^2.1.12"
464 + }
465 + },
227 "forwarded": { 466 "forwarded": {
228 "version": "0.1.2", 467 "version": "0.1.2",
229 "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 468 "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
...@@ -234,6 +473,28 @@ ...@@ -234,6 +473,28 @@
234 "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 473 "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
235 "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 474 "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
236 }, 475 },
476 + "getpass": {
477 + "version": "0.1.7",
478 + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
479 + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
480 + "requires": {
481 + "assert-plus": "^1.0.0"
482 + }
483 + },
484 + "har-schema": {
485 + "version": "2.0.0",
486 + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
487 + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
488 + },
489 + "har-validator": {
490 + "version": "5.1.5",
491 + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
492 + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
493 + "requires": {
494 + "ajv": "^6.12.3",
495 + "har-schema": "^2.0.0"
496 + }
497 + },
237 "http-errors": { 498 "http-errors": {
238 "version": "1.6.3", 499 "version": "1.6.3",
239 "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 500 "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
...@@ -245,6 +506,16 @@ ...@@ -245,6 +506,16 @@
245 "statuses": ">= 1.4.0 < 2" 506 "statuses": ">= 1.4.0 < 2"
246 } 507 }
247 }, 508 },
509 + "http-signature": {
510 + "version": "1.2.0",
511 + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
512 + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
513 + "requires": {
514 + "assert-plus": "^1.0.0",
515 + "jsprim": "^1.2.2",
516 + "sshpk": "^1.7.0"
517 + }
518 + },
248 "iconv-lite": { 519 "iconv-lite": {
249 "version": "0.4.23", 520 "version": "0.4.23",
250 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 521 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
...@@ -259,15 +530,56 @@ ...@@ -259,15 +530,56 @@
259 "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 530 "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
260 }, 531 },
261 "ipaddr.js": { 532 "ipaddr.js": {
262 - "version": "1.8.0", 533 + "version": "1.9.1",
263 - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 534 + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
264 - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" 535 + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
265 }, 536 },
266 "is-buffer": { 537 "is-buffer": {
267 "version": "1.1.6", 538 "version": "1.1.6",
268 "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 539 "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
269 "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 540 "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
270 }, 541 },
542 + "is-typedarray": {
543 + "version": "1.0.0",
544 + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
545 + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
546 + },
547 + "isstream": {
548 + "version": "0.1.2",
549 + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
550 + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
551 + },
552 + "jsbn": {
553 + "version": "0.1.1",
554 + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
555 + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
556 + },
557 + "json-schema": {
558 + "version": "0.2.3",
559 + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
560 + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
561 + },
562 + "json-schema-traverse": {
563 + "version": "0.4.1",
564 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
565 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
566 + },
567 + "json-stringify-safe": {
568 + "version": "5.0.1",
569 + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
570 + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
571 + },
572 + "jsprim": {
573 + "version": "1.4.1",
574 + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
575 + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
576 + "requires": {
577 + "assert-plus": "1.0.0",
578 + "extsprintf": "1.3.0",
579 + "json-schema": "0.2.3",
580 + "verror": "1.10.0"
581 + }
582 + },
271 "media-typer": { 583 "media-typer": {
272 "version": "0.3.0", 584 "version": "0.3.0",
273 "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 585 "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
...@@ -284,9 +596,9 @@ ...@@ -284,9 +596,9 @@
284 "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 596 "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
285 }, 597 },
286 "mime": { 598 "mime": {
287 - "version": "1.4.1", 599 + "version": "1.6.0",
288 - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 600 + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
289 - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 601 + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
290 }, 602 },
291 "mime-db": { 603 "mime-db": {
292 "version": "1.37.0", 604 "version": "1.37.0",
...@@ -307,9 +619,14 @@ ...@@ -307,9 +619,14 @@
307 "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 619 "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
308 }, 620 },
309 "negotiator": { 621 "negotiator": {
310 - "version": "0.6.1", 622 + "version": "0.6.2",
311 - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 623 + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
312 - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 624 + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
625 + },
626 + "oauth-sign": {
627 + "version": "0.9.0",
628 + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
629 + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
313 }, 630 },
314 "on-finished": { 631 "on-finished": {
315 "version": "2.3.0", 632 "version": "2.3.0",
...@@ -320,33 +637,48 @@ ...@@ -320,33 +637,48 @@
320 } 637 }
321 }, 638 },
322 "parseurl": { 639 "parseurl": {
323 - "version": "1.3.2", 640 + "version": "1.3.3",
324 - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 641 + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
325 - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 642 + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
326 }, 643 },
327 "path-to-regexp": { 644 "path-to-regexp": {
328 "version": "0.1.7", 645 "version": "0.1.7",
329 "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 646 "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
330 "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 647 "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
331 }, 648 },
649 + "performance-now": {
650 + "version": "2.1.0",
651 + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
652 + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
653 + },
332 "proxy-addr": { 654 "proxy-addr": {
333 - "version": "2.0.4", 655 + "version": "2.0.6",
334 - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", 656 + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
335 - "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", 657 + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
336 "requires": { 658 "requires": {
337 "forwarded": "~0.1.2", 659 "forwarded": "~0.1.2",
338 - "ipaddr.js": "1.8.0" 660 + "ipaddr.js": "1.9.1"
339 } 661 }
340 }, 662 },
663 + "psl": {
664 + "version": "1.8.0",
665 + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
666 + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
667 + },
668 + "punycode": {
669 + "version": "2.1.1",
670 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
671 + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
672 + },
341 "qs": { 673 "qs": {
342 "version": "6.5.2", 674 "version": "6.5.2",
343 "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 675 "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
344 "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 676 "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
345 }, 677 },
346 "range-parser": { 678 "range-parser": {
347 - "version": "1.2.0", 679 + "version": "1.2.1",
348 - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 680 + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
349 - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 681 + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
350 }, 682 },
351 "raw-body": { 683 "raw-body": {
352 "version": "2.3.3", 684 "version": "2.3.3",
...@@ -359,6 +691,33 @@ ...@@ -359,6 +691,33 @@
359 "unpipe": "1.0.0" 691 "unpipe": "1.0.0"
360 } 692 }
361 }, 693 },
694 + "request": {
695 + "version": "2.88.2",
696 + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
697 + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
698 + "requires": {
699 + "aws-sign2": "~0.7.0",
700 + "aws4": "^1.8.0",
701 + "caseless": "~0.12.0",
702 + "combined-stream": "~1.0.6",
703 + "extend": "~3.0.2",
704 + "forever-agent": "~0.6.1",
705 + "form-data": "~2.3.2",
706 + "har-validator": "~5.1.3",
707 + "http-signature": "~1.2.0",
708 + "is-typedarray": "~1.0.0",
709 + "isstream": "~0.1.2",
710 + "json-stringify-safe": "~5.0.1",
711 + "mime-types": "~2.1.19",
712 + "oauth-sign": "~0.9.0",
713 + "performance-now": "^2.1.0",
714 + "qs": "~6.5.2",
715 + "safe-buffer": "^5.1.2",
716 + "tough-cookie": "~2.5.0",
717 + "tunnel-agent": "^0.6.0",
718 + "uuid": "^3.3.2"
719 + }
720 + },
362 "safe-buffer": { 721 "safe-buffer": {
363 "version": "5.1.2", 722 "version": "5.1.2",
364 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 723 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
...@@ -370,9 +729,9 @@ ...@@ -370,9 +729,9 @@
370 "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 729 "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
371 }, 730 },
372 "send": { 731 "send": {
373 - "version": "0.16.2", 732 + "version": "0.17.1",
374 - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 733 + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
375 - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 734 + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
376 "requires": { 735 "requires": {
377 "debug": "2.6.9", 736 "debug": "2.6.9",
378 "depd": "~1.1.2", 737 "depd": "~1.1.2",
...@@ -381,23 +740,57 @@ ...@@ -381,23 +740,57 @@
381 "escape-html": "~1.0.3", 740 "escape-html": "~1.0.3",
382 "etag": "~1.8.1", 741 "etag": "~1.8.1",
383 "fresh": "0.5.2", 742 "fresh": "0.5.2",
384 - "http-errors": "~1.6.2", 743 + "http-errors": "~1.7.2",
385 - "mime": "1.4.1", 744 + "mime": "1.6.0",
386 - "ms": "2.0.0", 745 + "ms": "2.1.1",
387 "on-finished": "~2.3.0", 746 "on-finished": "~2.3.0",
388 - "range-parser": "~1.2.0", 747 + "range-parser": "~1.2.1",
389 - "statuses": "~1.4.0" 748 + "statuses": "~1.5.0"
749 + },
750 + "dependencies": {
751 + "http-errors": {
752 + "version": "1.7.3",
753 + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
754 + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
755 + "requires": {
756 + "depd": "~1.1.2",
757 + "inherits": "2.0.4",
758 + "setprototypeof": "1.1.1",
759 + "statuses": ">= 1.5.0 < 2",
760 + "toidentifier": "1.0.0"
761 + }
762 + },
763 + "inherits": {
764 + "version": "2.0.4",
765 + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
766 + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
767 + },
768 + "ms": {
769 + "version": "2.1.1",
770 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
771 + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
772 + },
773 + "setprototypeof": {
774 + "version": "1.1.1",
775 + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
776 + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
777 + },
778 + "statuses": {
779 + "version": "1.5.0",
780 + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
781 + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
782 + }
390 } 783 }
391 }, 784 },
392 "serve-static": { 785 "serve-static": {
393 - "version": "1.13.2", 786 + "version": "1.14.1",
394 - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 787 + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
395 - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 788 + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
396 "requires": { 789 "requires": {
397 "encodeurl": "~1.0.2", 790 "encodeurl": "~1.0.2",
398 "escape-html": "~1.0.3", 791 "escape-html": "~1.0.3",
399 - "parseurl": "~1.3.2", 792 + "parseurl": "~1.3.3",
400 - "send": "0.16.2" 793 + "send": "0.17.1"
401 } 794 }
402 }, 795 },
403 "setprototypeof": { 796 "setprototypeof": {
...@@ -405,11 +798,54 @@ ...@@ -405,11 +798,54 @@
405 "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 798 "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
406 "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 799 "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
407 }, 800 },
801 + "sshpk": {
802 + "version": "1.16.1",
803 + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
804 + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
805 + "requires": {
806 + "asn1": "~0.2.3",
807 + "assert-plus": "^1.0.0",
808 + "bcrypt-pbkdf": "^1.0.0",
809 + "dashdash": "^1.12.0",
810 + "ecc-jsbn": "~0.1.1",
811 + "getpass": "^0.1.1",
812 + "jsbn": "~0.1.0",
813 + "safer-buffer": "^2.0.2",
814 + "tweetnacl": "~0.14.0"
815 + }
816 + },
408 "statuses": { 817 "statuses": {
409 "version": "1.4.0", 818 "version": "1.4.0",
410 "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 819 "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
411 "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 820 "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
412 }, 821 },
822 + "toidentifier": {
823 + "version": "1.0.0",
824 + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
825 + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
826 + },
827 + "tough-cookie": {
828 + "version": "2.5.0",
829 + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
830 + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
831 + "requires": {
832 + "psl": "^1.1.28",
833 + "punycode": "^2.1.1"
834 + }
835 + },
836 + "tunnel-agent": {
837 + "version": "0.6.0",
838 + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
839 + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
840 + "requires": {
841 + "safe-buffer": "^5.0.1"
842 + }
843 + },
844 + "tweetnacl": {
845 + "version": "0.14.5",
846 + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
847 + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
848 + },
413 "type-is": { 849 "type-is": {
414 "version": "1.6.16", 850 "version": "1.6.16",
415 "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 851 "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
...@@ -424,15 +860,38 @@ ...@@ -424,15 +860,38 @@
424 "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 860 "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
425 "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 861 "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
426 }, 862 },
863 + "uri-js": {
864 + "version": "4.4.0",
865 + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz",
866 + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==",
867 + "requires": {
868 + "punycode": "^2.1.0"
869 + }
870 + },
427 "utils-merge": { 871 "utils-merge": {
428 "version": "1.0.1", 872 "version": "1.0.1",
429 "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 873 "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
430 "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 874 "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
431 }, 875 },
876 + "uuid": {
877 + "version": "3.4.0",
878 + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
879 + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
880 + },
432 "vary": { 881 "vary": {
433 "version": "1.1.2", 882 "version": "1.1.2",
434 "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 883 "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
435 "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 884 "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
885 + },
886 + "verror": {
887 + "version": "1.10.0",
888 + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
889 + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
890 + "requires": {
891 + "assert-plus": "^1.0.0",
892 + "core-util-is": "1.0.2",
893 + "extsprintf": "^1.2.0"
894 + }
436 } 895 }
437 } 896 }
438 } 897 }
......
...@@ -4,13 +4,21 @@ ...@@ -4,13 +4,21 @@
4 "description": "", 4 "description": "",
5 "main": "app.js", 5 "main": "app.js",
6 "scripts": { 6 "scripts": {
7 - "test": "echo \"Error: no test specified\" && exit 1", 7 + "test": "echo \"Error: no test specified\" && exit 1"
8 - "start": "node server.js"
9 }, 8 },
10 - "author": "KwakWonseok", 9 + "repository": {
11 - "license": "MIT", 10 + "type": "git",
12 - "dependencies": { 11 + "url": "http://khuhub.khu.ac.kr/2014104077/OSS-Project.git"
13 - "@line/bot-sdk": "^6.4.0", 12 + }
14 - "express": "^4.16.4" 13 + "author": {
14 + "name": "KwakWonseok",
15 + "email": "rhkrdnjstjr1@khu.ac.kr",
16 + "url": "http://khuhub.khu.ac.kr/u/2014104077"
17 + }
18 + "license": "MIT",
19 + "dependencies": {
20 + "@line/bot-sdk": "^6.4.0",
21 + "express": "^4.17.1",
22 + "request": "^2.88.2"
23 + }
15 } 24 }
16 -}
......