Showing
9 changed files
with
257 additions
and
0 deletions
.gitignore
0 → 100644
| 1 | +node_modules |
app.js
0 → 100644
| 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 |
app.js.code-workspace
0 → 100644
focused-clock-277615-3a427d503822.json
0 → 100644
| 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 | +} |
package-lock.json
0 → 100644
This diff could not be displayed because it is too large.
package.json
0 → 100644
| 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 | +} |
uploads/테스트용.png
0 → 100644
5.64 KB
uploads/테스트용2.png
0 → 100644
13.2 KB
-
Please register or login to post a comment