전언석
var express = require('express');
const request = require('request');
const TARGET_URL = 'https://api.line.me/v2/bot/message/reply'
const TOKEN = ''
const fs = require('fs');
const path = require('path');
const HTTPS = require('https');
const domain = "2019102226.osschatbot2022.ml"
const sslport = 23023;
const bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.json());
app.post('/hook', function (req, res) {
var eventObj = req.body.events[0];
var source = eventObj.source;
var message = eventObj.message;
// request log
console.log('======================', new Date(), '======================');
// mwsql
var mysql = require('mysql');
var db = mysql.createConnection({
host: 'chatbot.c7fzgftc3yrm.us-east-1.rds.amazonaws.com',
user: 'chatbot',
password: '',
database: 'chatbot',
port: '3306'
});
db.connect();
db.query('SELECT * FROM data', function (error, results, fields) {
if (error) {
console.log(error);
}
var arr = new Array();
var input_ingredients_list = message.text.split(" ");
for (var i = 0; i < results.length; i++) {
var ingredients_list = results[i].ingredients.split(", ");
if (ingredients_list.filter(x => input_ingredients_list.includes(x)).length === input_ingredients_list.length) {
arr.push(i);
}
}
if (arr.length != 0) {
var num = arr[Math.floor(Math.random() * arr.length)];
request.post(
{
url: TARGET_URL,
headers: {
'Authorization': `Bearer ${TOKEN}`
},
json: {
"replyToken": eventObj.replyToken,
"messages": [
{
"type": "text",
"text": `메뉴는 "${results[[num]].menu}" 입니다.`
},
{
"type": "text",
"text": `필요한 재료는\n\n"${results[[num]].ingredients}"\n\n입니다.`
},
{
"type": "text",
"text": `레시피\n\n${results[[num]].recipe}`
}
]
}
}, (error, response, body) => {
console.log(body)
});
}
else {
request.post(
{
url: TARGET_URL,
headers: {
'Authorization': `Bearer ${TOKEN}`
},
json: {
"replyToken": eventObj.replyToken,
"messages": [
{
"type": "text",
"text": `재료를 다시 입력해주세요.`
}
]
}
}, (error, response, body) => {
console.log(body)
});
}
});
db.end();
res.sendStatus(200);
});
try {
const option = {
ca: fs.readFileSync('/etc/letsencrypt/live/' + domain + '/fullchain.pem'),
key: fs.readFileSync(path.resolve(process.cwd(), '/etc/letsencrypt/live/' + domain + '/privkey.pem'), 'utf8').toString(),
cert: fs.readFileSync(path.resolve(process.cwd(), '/etc/letsencrypt/live/' + domain + '/cert.pem'), 'utf8').toString(),
};
HTTPS.createServer(option, app).listen(sslport, () => {
console.log(`[HTTPS] Server is started on port ${sslport}`);
});
} catch (error) {
console.log('[HTTPS] HTTPS 오류가 발생하였습니다. HTTPS 서버는 실행되지 않습니다.');
console.log(error);
}
......@@ -12,7 +12,6 @@
<li><a href="#설명">설명</a></li>
<li><a href="#사용기술">사용기술</a></li>
<li><a href="#사용법">사용법</a></li>
<li><a href="#구조">구조</a></li>
<li><a href="#진행정도">진행정도</a></li>
<li><a href="#만든사람">만든사람</a></li>
</ol>
......@@ -30,6 +29,7 @@
* Express
* web crawling
* MySQL
<img src="/images/chatbot_structure.jpg">
---
### 사용법
......@@ -39,13 +39,60 @@
<img src="/images/add_channel_info.png" width="450px" height="300px">
<br>
* 개발자
---
### 구조
<p></p>
<p>1. Clone repository</p>
<p>터미널을 열고 다음을 입력</p>
```git clone http://khuhub.khu.ac.kr/2019102197/Ingredient-to-Dish-ChatBot.git
```
<br>
<p>2. Node.js download</p>
<p>터미널을 열고 다음을 입력</p>
```npm install
```
<br>
<p>3. AWS RDS 사용법</p>
<p>AWS RDS 선택</p>
<p>데이터베이스 생성</p>
<p>-엔진 옵션 Amazon Aurora -> MySQL</p>
<p>-사용자 이름, 암호 생성 후 기억</p>
<p>-퍼블릭 액세스 아니요 -> 예</p>
<p>파라미터 그룹 선택 -> 파라미터 그룹 생성</p>
<p>생성된 파리미터 그룹 선택 -> 파라미터 편집</p>
<p>-char 검색 -> 모든 파라미터 값 utf8로 변경</p>
<p>-collation 검색 -> 모든 파라미터 값 utf8로 변경</p>
<p>RDS 인스턴스 수정에서 DB 파라미터 그룹 방금 생성한 파라미터 그룹으로 바꾸기></p>
<p>EC2 보안 그룹 ID 복사</p>
<p>RDS의 VPC 보안 그룹 들어가서 인바운드 규칙 수정</p>
<p>규칙 추가 후 유형 MYSQL/Aurora로 변경</p>
<p>소스에 보안 그룹 ID 붙여넣기</p>
<p>규칙 추가 하나 더 한 후 유형 MYSQL/Aurora로 변경</p>
<p>소스 유형에 내IP 선택</p>
<p>규칙 저장 후 MYSQL workbench 실행 후</p>
<p>새 DATABASE 생성</p>
<p>주소는 RDS의 엔드포인트를 복사 붙여넣기 해줌</p>
<br>
<p>4. csv 파일 연결</p>
<p>MySQL Workbench에서 새로운 MySQL Connections 생성</p>
<p>RDS 설정에서 생성한 Hostname, 사용자 이름과 비밀번호를 입력</p>
<br>
<p>5. 토큰, 도메인 등등 값 수정</p>
<p>reply.js에서 토큰, 도메인 값을 자신의 것으로 수정</p>
<p>RDS와 MySQL 설정할 때 만든 값 입력</p>
```nodejs
var db = mysql.createConnection({
host: '값 입력',
user: '값 입력',
password: '값 입력',
database: '값 입력',
port: '3306'
});
```
<p>etc. web crawling 코드 설정</p>
<p>터미널을 열고 다음 명령어 입력</p>
```pip3 install requests
pip3 install pymysql
pip3 install beautifulsoup4
```
<br>
---
### 진행정도
- [x] 챗봇을 올릴 aws 서비스 생성
......
var xhr = new XMLHttpRequest();
var url = 'http://apis.data.go.kr/1390802/AgriFood/FdCkry/getKoreanFoodFdCkryList'; /*URL*/
var queryParams = '?' + encodeURIComponent('serviceKey') + '='+'R7bFhjvvAMmxJxzcrL8NWkYHVa227zfpwvpwgXxcixNdMY0EbdbsbCboj3zXEsXniKNHyqu2dEllJCRk1LsdxA%3D%3D'; /*Service Key*/
queryParams += '&' + encodeURIComponent('service_Type') + '=' + encodeURIComponent('xml'); /**/
queryParams += '&' + encodeURIComponent('Page_No') + '=' + encodeURIComponent('1'); /**/
queryParams += '&' + encodeURIComponent('Page_Size') + '=' + encodeURIComponent('20'); /**/
queryParams += '&' + encodeURIComponent('food_Name') + '=' + encodeURIComponent('밥'); /**/
queryParams += '&' + encodeURIComponent('ckry_Name') + '=' + encodeURIComponent('조리'); /**/
xhr.open('GET', url + queryParams);
xhr.onreadystatechange = function () {
if (this.readyState == 4) {
alert('Status: '+this.status+'nHeaders: '+JSON.stringify(this.getAllResponseHeaders())+'nBody: '+this.responseText);
}
};
xhr.send('');
\ No newline at end of file
......@@ -3,14 +3,14 @@ import requests
from bs4 import BeautifulSoup
import pymysql
#pip3 install requests, pip3 install pymyaql, pip3 install beautifulsoup4를 하고 진행, pip3대신 pip 사용가능
#pip3 install requests, pip3 install pymysql, pip3 install beautifulsoup4를 하고 진행, pip3대신 pip 사용가능
#사이트가 크롤링을 공격으로 인식하는 것을 방지하기 위해 중간중간에 sleep함수를 사용
conn = pymysql.connect(host="localhost", user="root",password='abcde12345abcde',db='db_recipe', charset='utf8')
curs = conn.cursor(pymysql.cursors.DictCursor)
for pagenum in range(1,35): #크롤링 할 상위 페이지 개수. 약 40개정도의 레시피 링크가 한 페이지에 이어져 있음
for pagenum in range(1,2): #크롤링 할 상위 페이지 개수. 약 40개정도의 레시피 링크가 한 페이지에 이어져 있음
print(pagenum)
page = requests.get('https://www.10000recipe.com/recipe/list.html?order=reco&page='+str(pagenum))
......
This diff could not be displayed because it is too large.