박다솔

add all file

1 +node_modules
1 +var express = require('express');
2 +const request = require('request');
3 +const TARGET_URL = 'https://api.line.me/v2/bot/message/reply'
4 +const TOKEN = 'h8xN39Zg0nRmPhRcwCfUt35UhGQvinzOSzl1VSHWPdaKaW4VDDs2bTvhvxnOH1FVzzJ4t1L0ih/uJ1idIKz8SvPin3PM4nLgt6roTaEVw105aIsZqDwlsKPS2ewb2WVbL2TK/BqVEBQ2MmHO2xFRzAdB04t89/1O/w1cDnyilFU='
5 +const PAPAGO_URL = 'https://openapi.naver.com/v1/papago/n2mt'
6 +const PAPAGO_ID = 'W5BknW1dTHXMah9QZ_KK'
7 +const PAPAGO_SECRET = 'doQdf3ZMU3'
8 +const fs = require('fs');
9 +const path = require('path');
10 +const HTTPS = require('https');
11 +const domain = "www.oss0522test.tk"
12 +const sslport = 23023;
13 +const bodyParser = require('body-parser');
14 +
15 +const vision = require('@google-cloud/vision'); //구글 클라우드 비전 api
16 +const line = require('@line/bot-sdk');
17 +
18 +
19 +//1. 이미지 텍스트 추출 - google cloud vision api 사용
20 +// 전송받은 이미지 불러오기 -> 추출
21 +//2. 추출 후 바로 번역? / 텍스트만 출력?
22 +//3. richmenu 활용하기
23 +
24 +
25 +
26 +/*
27 +var query = "언어를 감지할 문장을 입력하세요.";
28 +app.get('/detectLangs', function (req, res) {
29 + var api_url = 'https://openapi.naver.com/v1/papago/detectLangs';
30 + var request = require('request');
31 + var options = {
32 + url: api_url,
33 + form: {'query': query},
34 + headers: {'X-Naver-Client-Id':PAPAGO_ID, 'X-Naver-Client-Secret': PAPAGO_SECRET}
35 + };
36 + request.post(options, function (error, response, body) {
37 + if (!error && response.statusCode == 200) {
38 + res.writeHead(200, {'Content-Type': 'text/json;charset=utf-8'});
39 + res.end(body);
40 + } else {
41 + res.status(response.statusCode).end();
42 + console.log('error = ' + response.statusCode);
43 + }
44 + });
45 + });
46 + app.listen(3000, function () {
47 + console.log('http://127.0.0.1:3000/detectLangs app listening on port 3000!');
48 + });
49 + */
50 +
51 +const client_vision = new vision.ImageAnnotatorClient();
52 +
53 + //이미지에서 텍스트 추출
54 +function vision_image(bucketName, fileName){
55 + const [result] = await client_vision.textDetection(`gs://${bucketName}/${fileName}`);
56 + const detections = result.textAnnotations;
57 + console.log('Text:');
58 + detections.forEach(text => console.log(text));
59 +}
60 +
61 +
62 +
63 +
64 +
65 +
66 +
67 +const client_line = new line.Client({
68 + channelAccessToken: TOKEN
69 +});
70 +
71 +client_line.setRichMenuImage('<rich_menu_id>', fs.createReadStream('./example.png')) //richmenu 이미지 설정
72 +
73 +client_line.createRichMenu(richmenu) //richmenu 만들기
74 + .then((richMenuId) =>
75 + console.log(richMenuId))
76 +
77 +const richmenu = {
78 + "size": {
79 + "width": 2500,
80 + "height": 1686
81 + },
82 + "selected": false,
83 + "name": "Choose language",
84 + "chatBarText": "ko/ja/en/fr",
85 + "areas": [
86 + {
87 + "bounds": {
88 + "x": 0,
89 + "y": 0,
90 + "width": 2500,
91 + "height": 1686
92 + },
93 + "action": {
94 + "type": "postback",
95 + "data": "action=buy&itemid=123"
96 + }
97 + }
98 + ]
99 +};
100 +
101 +
102 +
103 +
104 +
105 +
106 +
107 +
108 +
109 +var app = express();
110 +app.use(bodyParser.json());
111 +var trans_lang;
112 +app.post('/hook', function (req, res) {
113 +
114 + var eventObj = req.body.events[0];
115 + var source = eventObj.source;
116 + var message = eventObj.message;
117 +
118 +
119 + // request log
120 + console.log('======================', new Date() ,'======================');
121 + console.log('[request]', req.body);
122 + console.log('[request source] ', eventObj.source);
123 + console.log('[request message]', eventObj.message);
124 +
125 +
126 + if (eventObj.message.type == "text"){ //입력이 텍스트일 경우
127 +
128 + if (eventObj.message.text == '영어'){
129 + trans_lang = 'en';
130 + }else if (eventObj.message.text == '일본어'){
131 + trans_lang = 'ja';
132 + }else if (eventObj.message.text == '프랑스어'){
133 + trans_lang = 'fr';
134 + }else {
135 + trans(eventObj.replyToken, eventObj.message.text, trans_lang);
136 + }
137 +
138 + } else if (eventObj.message.type == "image"){ //입력이 이미지일 경우
139 + //이미지 저장? -> google cloud storage이나 웹
140 + vision_iamge(bucketName, fileName);
141 + //추출된 텍스트, 번역된 텍스트
142 +
143 + }
144 +
145 +
146 + res.sendStatus(200);
147 +});
148 +
149 +
150 +function trans(replyToken, message, language) {
151 +
152 + request.post(
153 + {
154 + url: PAPAGO_URL,
155 + headers: {
156 + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
157 + 'X-Naver-Client-Id': `${PAPAGO_ID}`,
158 + 'X-Naver-Client-Secret': `${PAPAGO_SECRET}`
159 + },
160 + body: `source=ko&target=${language}&text=` + message,
161 + json:true
162 + },(error, response, body) => {
163 + if(!error && response.statusCode == 200) {
164 + console.log(body.message);
165 + var transMessage = body.message.result.translatedText;
166 + request.post(
167 + {
168 + url: TARGET_URL,
169 + headers: {
170 + 'Authorization': `Bearer ${TOKEN}`
171 + },
172 + json: {
173 + "replyToken":replyToken,
174 + "messages":[
175 + {
176 + "type":"text",
177 + "text":transMessage
178 + }
179 + ]
180 + }
181 + },(error, response, body) => {
182 + console.log(body)
183 + });
184 + }
185 + });
186 +
187 +}
188 +
189 +try {
190 + const option = {
191 + ca: fs.readFileSync('/etc/letsencrypt/live/' + domain +'/fullchain.pem'),
192 + key: fs.readFileSync(path.resolve(process.cwd(), '/etc/letsencrypt/live/' + domain +'/privkey.pem'), 'utf8').toString(),
193 + cert: fs.readFileSync(path.resolve(process.cwd(), '/etc/letsencrypt/live/' + domain +'/cert.pem'), 'utf8').toString(),
194 + };
195 +
196 + HTTPS.createServer(option, app).listen(sslport, () => {
197 + console.log(`[HTTPS] Server is started on port ${sslport}`);
198 + });
199 + } catch (error) {
200 + console.log('[HTTPS] HTTPS 오류가 발생하였습니다. HTTPS 서버는 실행되지 않습니다.');
201 + console.log(error);
202 + }
...\ No newline at end of file ...\ No newline at end of file
1 +{
2 + "folders": [
3 + {
4 + "path": "."
5 + }
6 + ]
7 +}
...\ No newline at end of file ...\ No newline at end of file
1 +{
2 + "type": "service_account",
3 + "project_id": "focused-clock-277615",
4 + "private_key_id": "3a427d503822cd0cda160719b27fe0b501cd9062",
5 + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC4bKFLZu8tXjE8\nuJEYKTb4j2Oql4pDvpsuAd/M8pk5k29JRI3g3fs74MA1Xaqtgtr1NVhcw0ysrNSx\ntffKjVlVfW2w3OXLGAkqtp2mJMOsnRdJw1MkBonZMDRjUHL3gfj6jzeipuMv5MIN\nWG8wtDCo9kn/+hU75bz1kUGqMd/hmzDwFbVpOw8kQVTVxR+gfldETKizt+yAnTYq\nTJyg7YvcbNuBuO9NbdC4INwMsJ9kCnhTMUZmEzC3Rd2sXNU+hlRYXvGdXn+fb36e\nSVhNKrjghwUUf9WvVBsv1ZOQ15AR8ZeKwMvhvUcx4qvWlBOXH7OAyiH2I1abxfBs\nW7oY4dkLAgMBAAECggEAR2QZziADH1tSkRBbbnBp7K9JJBz0c4QB+z3Tfjk9MkoN\n7t1gVLdpjUTT8vSW4QMCMqDbW1FoyYE/9qkbymeMOOlMgIYKWGOuDMBTZ6DctGG9\nRZscgJodW5tq9DUMxB4mnQu6vDaBRKV3rwXYSRC/s3Bftfz/oketLZx0wGb9JQ4v\nOdTzRZkJk2rImPWDJ0gcgSSzzE6H7h5yFfcWDNP0ckDL6WD1Ow9ca6IU0/F5WjWt\n/4/9ZHi34S5pzjmkKRb4OU5BD9TOA88/drufDklwRbQqqFk65bu1qfVKssAipLSv\n1JgqELciJSgKZ3M5BpwjYwBSqIjVsahErGO1V37TeQKBgQDoVGp7JKmGY/1Py5mb\nEDyKD1f9z9mREu8w8KLBcezg8TU+7Agncx9RHfcTVO0z/+jBxe/DFMYD1GD4G33J\nxshxo9hIDZu41Kcc0j1ThEulslrlqWOZEbgc3aRwgDtWq3eDkK3ERQJu/EORWcoE\nF7FQ7xxQ7sZUPcO5o1s5lS7pUwKBgQDLNsDi92AXn3Y017wagXDkihXNLHgPBiTO\n04rTnxJVf2OQ1lLk7KF164p5nDzMp7HYACKpHkqDSk/3RiJFb/hwjLFNd2xMqAHK\ni576oQ7W4tRfwKQ72/WtTg9oHb7EK97yJPh6pOgQJ8E5n3XP7VQ9WkIDp/G52rob\nQCvPRDiCaQKBgCJOHK70OefzKbs3mAXSfu3v2BFNOJX4UsNKNO4VcWHBnBgfaBDT\nKeOjZhE/sArGlcrO/Fk03ww/ttXL0WYS6RQGmnABOmYvWEGkNZP4a+caj9triJ5Y\nhHQWsio+dQSWKv6NRWs+uV5D94Il3PN/wBnwRKEasMRNnnHx0g2NnrCrAoGAREW2\n9AnsLMOUMRixx63pQb7qqC3igBmuUBZeM87jl/ned5Cp9ONTM4zYzxagjplgdJNH\nEc5tdkKHLypO5UlDDH0YLFCNAAwJ3gSeetGVbLh0ZV8RTlMN7RWms3Ia30ll87Bc\nEshIdvUEQ9nA+QRhIuOp/hR0b95+XB1pGo9u9NECgYEA0wFbLJB6PDIWxFxoDyLZ\nBoTZZwp4N9iLQ4XsQgWDtxolvQxq81erhnv+fJLUYVbfCByxoMERockw+Q0kt6Jq\nzO6RcYtbEtI5t0o3AmxMrmfK2E82AtHeMA6OUe1J7SE293DpfZL+3lTdRBqqmy7p\npzp/x7VdqltRv8dk7Nc0zzU=\n-----END PRIVATE KEY-----\n",
6 + "client_email": "line-catbot@focused-clock-277615.iam.gserviceaccount.com",
7 + "client_id": "103446613286646603686",
8 + "auth_uri": "https://accounts.google.com/o/oauth2/auth",
9 + "token_uri": "https://oauth2.googleapis.com/token",
10 + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
11 + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/line-catbot%40focused-clock-277615.iam.gserviceaccount.com"
12 +}
This diff could not be displayed because it is too large.
1 +{
2 + "name": "app",
3 + "version": "1.0.0",
4 + "description": "photo",
5 + "main": "app.js",
6 + "dependencies": {
7 + "@google-cloud/storage": "^5.1.0",
8 + "@google-cloud/translate": "^6.0.0",
9 + "@google-cloud/vision": "^2.0.0",
10 + "axios": "^0.19.2",
11 + "body-parser": "^1.19.0",
12 + "core-js": "^3.6.5",
13 + "express": "^4.17.1",
14 + "express-session": "^1.17.1",
15 + "expression": "0.0.1",
16 + "fs": "0.0.1-security",
17 + "jade": "^1.11.0",
18 + "multer": "^1.4.2",
19 + "pug": "^3.0.0",
20 + "request": "^2.88.2"
21 + },
22 + "repository field": {
23 + "type": "http",
24 + "url": "http://khuhub.khu.ac.kr/2019102171/termprojecttest.git"
25 + },
26 + "license": ""
27 +}
1 +doctype html
2 +html
3 + head
4 + meta(chartest='utf-8')
5 + body
6 + form(action='upload' method='post' enctype="multipart/form-data")
7 + input(type='file' name='userfile')
8 + input(type='submit')
...\ No newline at end of file ...\ No newline at end of file