DMKael

Start Project

1 +node_modules/
2 +.env
...\ 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 +require("dotenv").config({path : '.env'});
5 +
6 +
7 +//papago api
8 +var request = require('request');
9 +
10 +//번역 api_url
11 +var translate_api_url = 'https://openapi.naver.com/v1/papago/n2mt';
12 +
13 +//언어감지 api_url
14 +var languagedetect_api_url = 'https://openapi.naver.com/v1/papago/detectLangs'
15 +
16 +// Naver Auth Key
17 +//새로 발급받은 naver papago api id, pw 입력
18 +var client_id = process.env.client_id;
19 +var client_secret = process.env.client_secret;
20 +const config = {
21 + channelAccessToken: process.env.channelAccessToken,
22 + channelSecret: process.env.channelSecret,
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 +#!/usr/bin/env node
2 +
3 +/**
4 + * Module dependencies.
5 + */
6 +
7 +var app = require('../app');
8 +var debug = require('debug')('project:server');
9 +var http = require('http');
10 +
11 +/**
12 + * Get port from environment and store in Express.
13 + */
14 +
15 +var port = normalizePort(process.env.PORT || '3000');
16 +app.set('port', port);
17 +
18 +/**
19 + * Create HTTP server.
20 + */
21 +
22 +var server = http.createServer(app);
23 +
24 +/**
25 + * Listen on provided port, on all network interfaces.
26 + */
27 +
28 +server.listen(port);
29 +server.on('error', onError);
30 +server.on('listening', onListening);
31 +
32 +/**
33 + * Normalize a port into a number, string, or false.
34 + */
35 +
36 +function normalizePort(val) {
37 + var port = parseInt(val, 10);
38 +
39 + if (isNaN(port)) {
40 + // named pipe
41 + return val;
42 + }
43 +
44 + if (port >= 0) {
45 + // port number
46 + return port;
47 + }
48 +
49 + return false;
50 +}
51 +
52 +/**
53 + * Event listener for HTTP server "error" event.
54 + */
55 +
56 +function onError(error) {
57 + if (error.syscall !== 'listen') {
58 + throw error;
59 + }
60 +
61 + var bind = typeof port === 'string'
62 + ? 'Pipe ' + port
63 + : 'Port ' + port;
64 +
65 + // handle specific listen errors with friendly messages
66 + switch (error.code) {
67 + case 'EACCES':
68 + console.error(bind + ' requires elevated privileges');
69 + process.exit(1);
70 + break;
71 + case 'EADDRINUSE':
72 + console.error(bind + ' is already in use');
73 + process.exit(1);
74 + break;
75 + default:
76 + throw error;
77 + }
78 +}
79 +
80 +/**
81 + * Event listener for HTTP server "listening" event.
82 + */
83 +
84 +function onListening() {
85 + var addr = server.address();
86 + var bind = typeof addr === 'string'
87 + ? 'pipe ' + addr
88 + : 'port ' + addr.port;
89 + debug('Listening on ' + bind);
90 +}
This diff is collapsed. Click to expand it.
1 +{
2 + "name": "linebot",
3 + "version": "1.0.0",
4 + "description": "",
5 + "main": "app.js",
6 + "scripts": {
7 + "test": "echo \"Error: no test specified\" && exit 1",
8 + "start": "node server.js"
9 + },
10 + "author": "김형도",
11 + "license": "MIT",
12 + "dependencies": {
13 + "@line/bot-sdk": "^6.8.3",
14 + "dotenv": "^8.2.0",
15 + "express": "^4.17.1",
16 + "request": "^2.88.0",
17 + "request-promise-native": "^1.0.8"
18 + }
19 +}