Showing
1 changed file
with
87 additions
and
86 deletions
1 | -var express = require('express'); | 1 | +const express = require('express'); |
2 | -var app = express(); | ||
3 | const config = require('./API_config'); | 2 | const config = require('./API_config'); |
4 | const line = require('@line/bot-sdk'); | 3 | const line = require('@line/bot-sdk'); |
4 | +const request = require('request'); | ||
5 | 5 | ||
6 | -//papago api | 6 | +const app = express(); |
7 | -var request = require('request'); | ||
8 | 7 | ||
9 | //번역 api_url | 8 | //번역 api_url |
10 | -var translate_api_url = 'https://openapi.naver.com/v1/papago/n2mt'; | 9 | +const translate_api_url = 'https://openapi.naver.com/v1/papago/n2mt'; |
11 | 10 | ||
12 | //언어감지 api_url | 11 | //언어감지 api_url |
13 | -var languagedetect_api_url = 'https://openapi.naver.com/v1/papago/detectLangs'; | 12 | +const languagedetect_api_url = 'https://openapi.naver.com/v1/papago/detectLangs'; |
14 | 13 | ||
15 | // Naver Auth Key | 14 | // Naver Auth Key |
16 | //새로 발급받은 naver papago api id, pw 입력 | 15 | //새로 발급받은 naver papago api id, pw 입력 |
17 | const client_id = config.client_id; | 16 | const client_id = config.client_id; |
18 | const client_secret = config.client_secret; | 17 | const client_secret = config.client_secret; |
19 | // Line Channel Access Tocken | 18 | // Line Channel Access Tocken |
20 | -const line_access = config.line_channel; | 19 | +const line_channel = config.line_channel; |
21 | 20 | ||
22 | // create LINE SDK client | 21 | // create LINE SDK client |
23 | -const client = new line.Client(line_access); | 22 | +const client = new line.Client(line_channel); |
24 | - | ||
25 | -// create Express app | ||
26 | -// about Express itself: https://expressjs.com/ | ||
27 | 23 | ||
28 | // ELB health checker | 24 | // ELB health checker |
29 | app.get('/', (req, res) => { | 25 | app.get('/', (req, res) => { |
30 | - console.log('hello,,,,'); | 26 | + console.log('ELB health check'); |
31 | res.writeHead(200, { "Content-Type": "text/html" }); | 27 | res.writeHead(200, { "Content-Type": "text/html" }); |
32 | res.end(); | 28 | res.end(); |
33 | }); | 29 | }); |
34 | 30 | ||
35 | // register a webhook handler with middleware | 31 | // register a webhook handler with middleware |
36 | // about the middleware, please refer to doc | 32 | // about the middleware, please refer to doc |
37 | -app.post('/webhook', line.middleware(line_access), (req, res) => { | 33 | +app.post('/webhook', line.middleware(line_channel), (req, res) => { |
38 | - Promise | 34 | + const promises = req.body.events.map(async (event) => { |
39 | - .all(req.body.events.map(event => handleEvent(event))) | 35 | + let language_type = await language_detector(event); |
40 | - .then((result) => res.json(result)) | 36 | + let options = await option_maker(language_type, event); |
41 | - .catch((err) => { | 37 | + let result = await receive_result(options, event); |
42 | - console.error(err); | 38 | + client.replyMessage(event.replyToken,result); |
43 | - res.status(200).end(); | 39 | + }) |
40 | + Promise | ||
41 | + .all(promises) | ||
42 | + .then((result) => res.json(result)) | ||
43 | + .catch((err) => { | ||
44 | + console.error(err); | ||
45 | + res.status(200).end(); | ||
44 | }); | 46 | }); |
45 | }); | 47 | }); |
46 | 48 | ||
47 | -// event handler | 49 | +const language_detector = (event) => { |
48 | -function handleEvent(event) { | 50 | + if (event.type !== 'message' || event.message.type !== 'text') { |
49 | - if (event.type !== 'message' || event.message.type !== 'text') { | 51 | + // ignore non-text-message event |
50 | - // ignore non-text-message event | 52 | + return reject(new Error('메세지 혹은, 텍스트가 아닙니다.')); |
51 | - return Promise.resolve(null); | 53 | + } |
52 | - } | 54 | + return new Promise((resolve) => { |
53 | - return new Promise(function(resolve, reject) { | 55 | + //언어 감지 option |
54 | - //언어 감지 option | 56 | + resolve({ |
55 | - var detect_options = { | 57 | + url : languagedetect_api_url, |
56 | - url : languagedetect_api_url, | 58 | + form : {'query': event.message.text}, |
57 | - form : {'query': event.message.text}, | 59 | + headers: {'X-Naver-Client-Id': client_id, 'X-Naver-Client-Secret': client_secret} |
58 | - headers: {'X-Naver-Client-Id': client_id, 'X-Naver-Client-Secret': client_secret} | 60 | + }); |
59 | - }; | 61 | + }) |
60 | - | 62 | +} |
61 | - //papago 언어 감지 | 63 | + |
62 | - request.post(detect_options,function(error,response,body){ | 64 | +const option_maker = (language_type, event) => { |
63 | - console.log(response.statusCode); | 65 | + return new Promise((resolve, reject) => { |
64 | - if(!error && response.statusCode == 200){ | 66 | + request.post(language_type, (error,response) => { |
65 | - var detect_body = JSON.parse(response.body); | 67 | + console.log(response.statusCode); |
66 | - var source = ''; | 68 | + if(!error && response.statusCode == 200){ |
67 | - var target = ''; | 69 | + let detect_body = JSON.parse(response.body); |
68 | - var result = { type: 'text', text:''}; | 70 | + let source = ''; |
69 | - | 71 | + let target = ''; |
70 | - //언어 감지가 제대로 됐는지 확인 | 72 | + if (detect_body.langCode == 'ko'||detect_body.langCode =='en'){ |
71 | - console.log(detect_body.langCode); | 73 | + source = detect_body.langCode =='ko'? 'ko':'en'; |
72 | - | 74 | + target = detect_body.langCode =='ko'? 'en':'ko'; |
73 | - | 75 | + } |
74 | - //번역은 한국어->영어 / 영어->한국어만 지원 | 76 | + //언어 감지가 제대로 됐는지 확인 |
75 | - if(detect_body.langCode == 'ko'||detect_body.langCode == 'en'){ | 77 | + console.log(detect_body.langCode); |
76 | - source = detect_body.langCode == 'ko' ? 'ko':'en'; | 78 | + source = detect_body.langCode; |
77 | - target = source == 'ko' ? 'en':'ko'; | 79 | + |
78 | - //papago 번역 option | 80 | + var options = { |
79 | - var options = { | 81 | + url: translate_api_url, |
80 | - url: translate_api_url, | 82 | + form: {'source':source, 'target': target, 'text':event.message.text}, |
81 | - // 한국어(source : ko), 영어(target: en), 카톡에서 받는 메시지(text) | 83 | + headers: {'X-Naver-Client-Id': client_id, 'X-Naver-Client-Secret': client_secret} |
82 | - form: {'source':source, 'target':target, 'text':event.message.text}, | 84 | + }; |
83 | - headers: {'X-Naver-Client-Id': client_id, 'X-Naver-Client-Secret': client_secret} | 85 | + resolve(options); |
84 | - }; | 86 | + } |
85 | - | 87 | + else{ |
86 | - // Naver Post API | 88 | + reject(new Error("request is failed")); |
87 | - request.post(options, function(error, response, body){ | 89 | + } |
88 | - // Translate API Sucess | 90 | + }) |
89 | - if(!error && response.statusCode == 200){ | 91 | + }) |
90 | - // JSON | 92 | +} |
91 | - var objBody = JSON.parse(response.body); | 93 | + |
92 | - // Message 잘 찍히는지 확인 | 94 | +const receive_result = (options, event) => { |
93 | - | 95 | + return new Promise((resolve, reject) => { |
94 | - result.text = objBody.message.result.translatedText; | 96 | + var result = { type:'text', text: ''}; |
95 | - console.log(result.text); | 97 | + request.post(options, (error, response) => { |
96 | - //번역된 문장 보내기 | 98 | + // Translate API Sucess |
97 | - client.replyMessage(event.replyToken,result).then(resolve).catch(reject); | 99 | + if(!error && response.statusCode == 200){ |
98 | - } | 100 | + // JSON |
99 | - }); | 101 | + var objBody = JSON.parse(response.body); |
100 | - } | 102 | + // Message 잘 찍히는지 확인 |
101 | - // 메시지의 언어가 영어 또는 한국어가 아닐 경우 | 103 | + result.text = objBody.message.result.translatedText; |
102 | - else{ | 104 | + console.log(result.text); |
103 | - result.text = '언어를 감지할 수 없습니다. \n 번역 언어는 한글 또는 영어만 가능합니다.'; | 105 | + resolve(result); |
104 | - client.replyMessage(event.replyToken,result).then(resolve).catch(reject); | 106 | + } |
105 | - } | 107 | + else{ |
106 | - | 108 | + result.text = '언어를 감지할 수 없습니다. \n 번역 언어는 한글 또는 영어만 가능합니다.'; |
107 | - } | 109 | + client.replyMessage(event.replyToken,result).then(resolve).catch(reject); |
108 | - | 110 | + reject(new Error("request is failed")); |
109 | - }); | 111 | + } |
110 | - | 112 | + }) |
111 | - }); | 113 | + }) |
112 | - } | 114 | +} |
113 | - | ||
114 | 115 | ||
115 | app.listen(3000, function () { | 116 | app.listen(3000, function () { |
116 | console.log('Linebot listening on port 3000!'); | 117 | console.log('Linebot listening on port 3000!'); | ... | ... |
-
Please register or login to post a comment