app.js
4.16 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
128
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('/', (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) => {
if (event.type !== 'message' || event.message.type !== 'text') {
// ignore non-text-message event
return reject(new Error('메세지 혹은, 텍스트가 아닙니다.'));
}
return new Promise((resolve) => {
//언어 감지 option
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!');
});