app.js
4.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
const express = require('express');
const config = require('./API_config');
const line = require('@line/bot-sdk');
const request = require('request');
const app = express();
//번역 api_url
const translate_api_url = 'https://openapi.naver.com/v1/papago/n2mt';
//언어감지 api_url
const languagedetect_api_url = 'https://openapi.naver.com/v1/papago/detectLangs';
// Naver Auth Key
//새로 발급받은 naver papago api id, pw 입력
const client_id = config.client_id;
const client_secret = config.client_secret;
// Line Channel Access Tocken
const line_channel = config.line_channel;
// create LINE SDK client
const client = new line.Client(line_channel);
// ELB health checker
app.get('/', (req, res) => {
console.log('ELB health check');
res.writeHead(200, { "Content-Type": "text/html" });
res.end();
});
// register a webhook handler with middleware
app.post('/webhook', line.middleware(line_channel), (req, res) => {
// webhook post 요청에 대해 promises를 전체 수행한다.
// 전체 수행은 순차수행이기 때문에 동기처리 필요 => async await 패턴을 사용한다
const promises = req.body.events.map(async (event) => {
let api_connector = await api_connect(event);
let options = await option_maker(api_connector, event);
let result = await receive_result(options, event);
client.replyMessage(event.replyToken,result);
})
Promise
.all(promises)
.then((result) => res.json(result))
.catch((err) => {
console.error(err);
res.status(200).end();
});
});
// 이벤트 타입 검사 이후
// language detector api url 및 client id, secret 을 담은 connector를 반환한다.
const api_connect = (event) => {
return new Promise((resolve, reject) => {
if (event.type !== 'message' || event.message.type !== 'text'){
//언어 감지 option
reject(new Error('메세지 혹은, 텍스트가 아닙니다.'));
} else {
resolve({
url : languagedetect_api_url,
form : {'query': event.message.text},
headers: {'X-Naver-Client-Id': client_id, 'X-Naver-Client-Secret': client_secret}
});
}
})
}
// post 요청으로 api connector를 이용해 language를 분석한 뒤
// source 및 target 설정, 번역 API url을 포함한 options을 반환한다
const option_maker = (api_connector, event) => {
return new Promise((resolve, reject) => {
request.post(api_connector, (error,response) => {
console.log(response.statusCode);
if(!error && response.statusCode == 200){
let detect_body = JSON.parse(response.body);
let source = '';
let target = '';
if (detect_body.langCode == 'ko'||detect_body.langCode =='en'){
source = detect_body.langCode =='ko'? 'ko':'en';
target = detect_body.langCode =='ko'? 'en':'ko';
}
//언어 감지가 제대로 됐는지 확인
console.log(detect_body.langCode);
source = detect_body.langCode;
var options = {
url: translate_api_url,
form: {'source':source, 'target': target, 'text':event.message.text},
headers: {'X-Naver-Client-Id': client_id, 'X-Naver-Client-Secret': client_secret}
};
resolve(options);
}
else{
// 예외처리
reject(new Error("request is failed"));
}
})
})
}
// options를 받아서 post 요청을 통해 번역을 실행한다.
// response를 JSON parsing 한 뒤 결과 result에 메세지를 담아서 반환한다.
const receive_result = (options, event) => {
return new Promise((resolve, reject) => {
var result = { type:'text', text: ''};
request.post(options, (error, response) => {
// Translate API Sucess
if(!error && response.statusCode == 200){
// JSON
var objBody = JSON.parse(response.body);
// Message 잘 찍히는지 확인
result.text = objBody.message.result.translatedText;
console.log(result.text);
resolve(result);
}
else{
// 예외처리
result.text = '언어를 감지할 수 없습니다. \n 번역 언어는 한글 또는 영어만 가능합니다.';
client.replyMessage(event.replyToken,result).then(resolve).catch(reject);
reject(new Error("request is failed"));
}
})
})
}
app.listen(3000, function () {
console.log('Linebot listening on port 3000!');
});