PostgreSQL_with_kakao_chatbot

챗봇 평점 남기기 기능 구현

  • 평가 점수를 입력받아 DB에 기록하고 평균 통계를 계산한다.

  • 단, 1사람당 1번씩만 평점 남기기가 가능하며 두 번째부터는 가장 최근 점수로 갱신된다.

  • 알고리즘

    • id 검색 후, 없을 경우 평가를 기록 = INSERT
    • id 검색 후, 있을 경우 평가를 갱신 = UPDATE
  • 코드 작성

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
import psycopg2
from datetime import datetime

passwd = '5280c3caeed8c1cb512f19d6fc238a6ab642556e69c3050ddfe232c4c4372d0e'
db = psycopg2.connect(host='ec2-3-234-131-8.compute-1.amazonaws.com', dbname='ec2-3-234-131-8.compute-1.amazonaws.com',user='ndurbfpbebgdrc',password= passwd,port=5432)
cur=db.cursor()

# 날짜, id, 점수
date_data = datetime.today().strftime('%Y-%m-%d')
id_data = "'ww'"
idid_data = 'ww'
score_data = '2'

# SELECT문 - id로 검색하여 조회
cur.execute("SELECT * FROM score WHERE id=%s;" % (id_data))
rows = cur.fetchall()
print(rows)
print(type(rows))

# rows 길이 = 0
# 해당 id가 남긴 기록이 없음 = 첫 평가
# 점수를 포함한 데이터를 INSERT
if len(rows) == 0:
cur.execute("INSERT INTO score (date, id, score) VALUES (%s, %s, %s);"
, (datetime.today().strftime('%Y-%m-%d'), idid_data, score_data) )

# rows 길이 != 0
# 해당 id가 남긴 기록이 있음 = 최소 두 번째 평가
# 기존에 남긴 점수를 새로 UPDATE
else :
cur.execute("UPDATE score SET date=%s, score=%s WHERE id=%s;"
, (datetime.today().strftime('%Y-%m-%d'),score_data, idid_data) )

# cur.execute("SELECT * FROM score WHERE id=%s;" % (id_data))
# rows = cur.fetchall()
# print(rows)
# print(type(rows))

# POSTGRESQL DB에 COMMIT 하기
# db.commit()
  • 챗봇 스킬로 사용 가능하도록 형식을 맞추어 다시 작성
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
# # db에 점수추가
@app.route('/api/dbinsert', methods=['POST'])
def dbinsert():
body = request.get_json() # 사용자가 입력한 데이터

# date_data = datetime.today().strftime('%Y-%m-%d')
id_data = "'%s'" %str(body['userRequest']['user']['id'])
idid_data = '%s' %str(body['userRequest']['user']['id'])
score_data = str(list(body['userRequest']['utterance'])[1])
cur=db.cursor()

cur.execute("SELECT * FROM score WHERE id=%s;" % (id_data))
rows = cur.fetchall()

if len(rows) == 0:
cur.execute("INSERT INTO score (date, id, score) VALUES (%s, %s, %s);"
, (datetime.today().strftime('%Y-%m-%d'), idid_data, score_data) )

else :
cur.execute("UPDATE score SET date=%s, score=%s WHERE id=%s;"
, (datetime.today().strftime('%Y-%m-%d'),score_data, idid_data) )

db.commit()

responseBody = {
"version": "2.0",
"template": {
"outputs": [
{
"simpleText": {
"text": "점수가 반영되었습니다.\n감사합니다."
}
}
]
}
}

return responseBody
  • 블록 제작
  • 별점 버튼을 점수 저장할 블록으로 연결

Untitled

  • 스킬 만들고 적용하기

Untitled

  • 실행 결과

Untitled

Untitled

PostgreSQL_on_Heroku

헤로쿠에서 PostgreSQL 사용하기

heroku에서 postgresql 설치

  • 내 홈페이지의 Resources로 들어가기

Untitled

  • Add-ons 에 postgres 검색

Untitled

  • Heroku Postgres설치를 위해 Submit Order Form 클릭
    Untitled

  • Heroku Postgres 클릭

    Untitled

  • 하면 현재 사용중인 DB현황을 볼 수 있다.

Untitled

pgAdmin에서 heroku 와 연동

  • pgAdmin 실행
    • 중간에 문제가 생긴다면ubuntu에서 service start를 해볼것

sudo service postgresql status

sudo service postgresql start

사용자 계정 Password 설정

  • 기본적으로 admin 사용자로 등록이 되어 있다. 보통 DB 초기 세팅 시에는 패스워드를 입력받아야 한다. ( password : 2016***** )

sudo passwd postgres

Untitled

  • Servers(우클릭) → Register → Server… → 클릭

Untitled

Untitled

  • General 탭의 Name 작성해주기

Untitled

  • Connection탭의 주소 작성해주기

    • Heroku 홈페이지의 Datastores → Settings → View CreDentials… 클릭

      Untitled

      ——> 양식에 맞춰 작성해주기

      Untitled

      ——> Save 클릭

  • 서버가 추가된것을 확인

Untitled

  • Heroku에서 대여해준 DataBase들 목록중에서 나의 DB를 찾아야함.

Untitled

Python으로 db에 데이터 입력하기

  • 테이블을 생성하고 데이터를 입력하는 python 코드 작성 후 실행

Untitled

Untitled

  • pgAdmin에서 확인

    • Query Tool 실행

    Untitled

    • test 테이블을 확인하는 쿼리 작성 후 실행

      Untitled

      ——> 성공!

python에서 db쿼리가 잘 작동하는지 확인

  • psycopg2 설치
1
pip3 install psycopg2-binary
  • 파이썬에서 test 테이블을 조회하는 코드를 작성 후 실행
  • python3 명령어로 실행

Untitled

Untitled

——> 성공!

최종 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# # 테이블 생성 + 데이터 집어넣기

import psycopg2

passwd = ''
db = psycopg2.connect(host='ec2-54-204-56-171.compute-1.amazonaws.com', dbname='d2p5j2up8o05rg',user='dywzgxybcyjnzu',password= passwd,port=5432)
cur=db.cursor()

# cur.execute("DROP TABLE test")

cur.execute("CREATE TABLE test (url varchar, title varchar);")

cur.execute("INSERT INTO test (url, title) VALUES (%s, %s);"
, ("google.com", "구글입니다") )

db.commit()

print("good")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# # 테이블 조회하기

import psycopg2

passwd = ''
db = psycopg2.connect(host='ec2-54-204-56-171.compute-1.amazonaws.com', dbname='d2p5j2up8o05rg',user='dywzgxybcyjnzu',password= passwd,port=5432)
cur=db.cursor()

cur.execute("SELECT * FROM test;")
rows = cur.fetchall()

print(rows)
print(rows[0][0])
print(type(rows))

Crawling data for chatbot

크롤링 - 인기종목 top5

  • 챗봇에 필요한 자료 수집 목적
  • 크롤링 코드를 먼저 작성하고 이후에 스킬 형태로 변환하여 사용할 예정

준비

  • 크롤링할 url 선택 : https://finance.naver.com/
  • 추출할 정보를 우클릭 → 검사
  • 표시된 html을 copy → copy selector

크롤링 코드

  • url과 copy selector를 이용하여 코드 작성
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
import requests
from bs4 import BeautifulSoup

import pandas as pd
import numpy as np
url = 'https://finance.naver.com/'

response = requests.get(url)
response.raise_for_status()
html = response.text
soup = BeautifulSoup(html, 'html.parser')
tbody = soup.select_one('#container > div.aside > div > div.aside_area.aside_popular > table > tbody')
trs = tbody.select('tr')
datas = []
for tr in trs:
name = tr.select_one('th > a').get_text()
current_price = tr.select_one('td').get_text()
change_direction = tr['class'][0]
change_price = tr.select_one('td > span').get_text()
datas.append([name, current_price, change_direction, change_price])

# print(datas)
df = pd.DataFrame(datas, columns=['종목명', '현재가', '등락', '전일대비' ], index=range(1, 6))
df = str(df)
print(df)
  • 결과

Untitled

크롤링 코드-2-

  • 앞의 코드를 조금만 바꿔보자
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
import requests
from bs4 import BeautifulSoup

import pandas as pd
import numpy as np
url = 'https://finance.naver.com/'

response = requests.get(url)
response.raise_for_status()
html = response.text
soup = BeautifulSoup(html, 'html.parser')
tbody = soup.select_one('#container > div.aside > div > div.aside_area.aside_popular > table > tbody')

trs = tbody.select('tr')
datas = []
for tr in trs:
name = tr.select_one('a').get_text()
current_price = tr.select_one('td').get_text()
change_direction = []
if tr['class'][0] == "up":
change_direction.append("▲")
else:
change_direction.append("▼")
change_price = tr.select_one('span').get_text()
datas.append([name, current_price, change_direction, change_price])

# print(datas)
df = pd.DataFrame(datas, columns=['종목명', '현재가', '등락', '전일대비' ], index=range(1, 6))
df = str(df)
print(df)
  • 결과

Untitled

Crawling start for chatbot data

크롤링 기초

  • 크롤링한 데이터를 카카오 스킬을 통해 챗봇에 출력하도록 할 것이다
  • 우선 크롤링 기초를 연습하고 시작할 예정

사이트 정보 가져오기 - requests 사용법

1. requests 모듈 설치

  • VSCord에서 실행. 가상환경 진입 후 진행.
1
pip install requests

2. URL 요청하기 -get

  • status_code 는 응답코드를 가져온다.
  • text에는 HTML 코드가 담겨 있다.
1
2
3
4
5
6
import requests

response = requests.get('https://www.naver.com/')

print(response.status_code)
print(response.text)
  • status_code 의 응답코드는 200이 출력된다.
  • text의 HTML 코드는 다음과 같이 출력된다.

Untitled

사이트 정보 추출하기 - beaurifulsoup 사용법

0. BeautifulSoup가 필요한 이유

  • request.text를 이용해 가져온 데이터는 텍스트형태의 html.
  • 텍스트형태의 데이터에서 원하는 html 태그를 추출할 수 있을까?
  • 이를 쉽게 할 수 있게 도와주는 녀석이 바로 “뷰티풀수프”.
  • 즉, html을 수프객체로 만들어서 추출하기 쉽게 만들어준다.

1. beautifulsoup 설치

1
pip install beautifulsoup4

2.beautifulsoup 사용법

  • 정보를 추출할 사이트의 url 참고
  • 응답 코드가 200 일때, html 을 받아와 soup 객체로 변환
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import requests
from bs4 import BeautifulSoup

url = 'https://kin.naver.com/search/list.nhn?query=%ED%8C%8C%EC%9D%B4%EC%8D%AC'

response = requests.get(url)

if response.status_code == 200:
html = response.text
soup = BeautifulSoup(html, 'html.parser')
print(soup)

else :
print(response.status_code)

웹 크롤링 예제

  • 추출할 정보를 우클릭 → 검사
    • 다음과 같이 선택한 정보의 html이 표시된다

Untitled

  • 해당 html 우클릭 → copy → copy selector

Untitled

  • 복사한 copy selector를 붙여넣어서 코드 작성
    • copy selector 예시 : #s_content > div.section > ul > li:nth-child(1) > dl > dt > a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import requests
from bs4 import BeautifulSoup

url = 'https://kin.naver.com/search/list.nhn?query=%ED%8C%8C%EC%9D%B4%EC%8D%AC'

response = requests.get(url)

if response.status_code == 200:
html = response.text
soup = BeautifulSoup(html, 'html.parser')
title = soup.select_one('#s_content > div.section > ul > li:nth-child(1) > dl > dt > a')
print(title)

else :
print(response.status_code)
  • 다음과 같이 처음 지정했던 정보가 출력된다.

Untitled

텍스트만 출력

  • 텍스트만 뽑아오고 싶다면 get_text() 함수를 이용하면 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import requests
from bs4 import BeautifulSoup

url = 'https://kin.naver.com/search/list.nhn?query=%ED%8C%8C%EC%9D%B4%EC%8D%AC'

response = requests.get(url)

if response.status_code == 200:
html = response.text
soup = BeautifulSoup(html, 'html.parser')
title = soup.select_one('#s_content > div.section > ul > li:nth-child(1) > dl > dt > a')
print(title.get_text()) # get_text() 이용하여 텍스트만 출력

else :
print(response.status_code)
  • 결과

Untitled

Kakao Chatbot Skill with GoormIDE

스킬 사용 : 구름 IDE

  • 구름 IDE를 이용한 스킬 사용 시도
  • 그러나 구름IDE는 서버 실행 후 해당 창을 종료하면 스킬 사용이 불가능 = 편의성이 떨어짐
  • 된다는 것만 확인하고 실제 챗봇 스킬에는 사용하지 않았다
  • 단, Heroku에 비해 난이도는 낮은 편이라 수월하다는 장점이 있었다

사전준비

  • 카카오 채널 생성
  • 카카오 챗봇 오픈 빌더 OBT 승인
  • 구름 IDE 가입 : https://ide.goorm.io/

컨테이너 생성

  • 구름 IDE 가입 후에 컨테이너를 생성한다.

Untitled

  • 생성 시 설정 : 이름, 설명, 공개범위 등
  • 추가 모듈/패키지 : 항목 모두 체크

Untitled

  • 생성 완료

Untitled

  • 컨테이너 실행

Untitled

파일 생성, 코드 작성

  • 파일 생성 : application.py
  • 랜덤으로 숫자를 생성하는 코드를 작성해본다
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
from flask import Flask, jsonify
import sys
import random
application = Flask(__name__)

@application.route("/")
def start():
return "Hello goorm!!!"

@application.route("/random", methods=["POST"])
def random_function():
response = {
"version": "2.0",
"template": {
"outputs": [
{
"simpleText": {
"text": str(random.randint(1,10))
}
}
]
}
}
return jsonify(response)

if __name__ == "__main__":
application.run(host='0.0.0.0', port=int(sys.argv[1]), debug=True)
  • 실행 : python [application.py](http://application.py/) 80
  • 서버가 작동한다.
  • 구름을 사용하는 동안에는 이 창을 종료해서는 안 된다.

Untitled

  • 컨테이너 관리 창에서 ‘설정으로 가기’

Untitled

Untitled

스킬 사용

Untitled

  • 블록에서 사용할 스킬을 설정한다.

Untitled

결과

  • 설정한 발화패턴 입력시 랜덤으로 숫자가 생성된다

Untitled

  • Reference

https://www.youtube.com/watch?v=EWK9G9XAk00&t=97s

Kakao Chatbot 스킬 사용

사전준비

  • Heroku 배포 이후에 진행
  • Hello world가 출력된 페이지를 띄어야 한다.

스킬 서버 구축 기본편

  • 스킬 서버에서 제공하는 2가지 API URI는 다음과 닽다.
  • 단순 텍스트형 응답 스킬
    • POST /api/sayHello
  • 단순 이미지형 응답 스킬
    • POST /api/showHello

(1) 스킬 서버 예제

  • 코드 작성 : main.py
    • 코드 print(body['userRequest']['utterance'])와 responseBody 영역은 추후 설명 할 예정이다.
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
from flask import Flask, request
import json

app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello, World!!!!!!!!!!!!!!!!!!!!!!!'

# 카카오톡 텍스트형 응답
@app.route('/api/sayHello', methods=['POST'])
def sayHello():
body = request.get_json() # 사용자가 입력한 데이터
print(body)
print(body['userRequest']['utterance'])

responseBody = {
"version": "2.0",
"template": {
"outputs": [
{
"simpleText": {
"text": "반가워!!!!! hello I'm Ryan"
}
}
]
}
}

return responseBody

# 카카오톡 이미지형 응답
@app.route('/api/showHello', methods=['POST'])
def showHello():
body = request.get_json()
print(body)
print(body['userRequest']['utterance'])

responseBody = {
"version": "2.0",
"template": {
"outputs": [
{
"simpleImage": {
"imageUrl": "https://t1.daumcdn.net/friends/prod/category/M001_friends_ryan2.jpg",
"altText": "hello I'm Ryan"
}
}
]
}
}

return responseBody
  • 코드 저장 후 배포 시 주의점
    • 경로에 주의해야 한다!
  • 배포 진행한다.
1
2
3
4
$ git add .
$ git commit -am "your_message" # 이 부분만 자유롭게 쓸 수 있다.
$ git push origin main ## Github Repository에 업데이트
$ git push heroku main ## Heroku 코드 배포

(2) 스킬 서버 등록

단순 텍스트형 응답

  • 아래와 같이 스킬 서버 정보를 입력하고 저장한다.
  • 코드에서 정의한 이름을 URL 뒤에 덧붙인다 : /api/sayHello

Untitled

단순 이미지형 응답

  • 텍스트형 응답과 같은 과정을 거친다.
  • /api/showHello

(3) 시나리오

  • 여기가 가장 중요하다. 이제 시나리오를 등록한다. 이 때 중요한 것은 파라미터 설정 탭에서 스킬 선택을 개별적으로 호출 할 수 있다.

단순 텍스트형 응답’ 스킬 사용

  • 봇 응답에서 스킬 데이터를 선택 후, 저장 버튼을 클릭한다.

Untitled

단순 이미지형 응답’ 스킬 사용

  • 사용할 스킬 데이터를 선택 후, 저장한다.

(4) 배포

  • 배포 탭을 클릭한 후, 배포를 진행

Untitled

(5) 테스트

  • 봇 테스트를 열고 아래와 같이 테스트를 한다.

  • 배포 완료 후 사용 가능

  • 단순 텍스트형 응답

    • 설정한 텍스트 출력
    • 정상 작동
  • 단순 이미지형 응답

    • 설정한 이미지 출력
    • 정상 작동

Untitled

(6) 로그 확인

  • Heroku 에서는 로그를 쉽게 확인 가능
1
heroku logs

(7) 출력

챗봇 빌더를 활용한 사칙연산 계산기 구현

  • 사칙 연산을 구현하는 챗봇을 만들어 본다.

(1) 엔티티 구성

  • 엔티티(Entity) : 봇이 이해할 수 있는 용어를 체계적으로 정리한 데이터 사전
  • 엔티티 구조는 = 엔티티명, 대표 엔트리, 동의어
  • 엔티티의 자세한 설명은 다음 링크에서 확인
  • 사칙연산을 예로 들면 아래와 같이 지정할 수 있다.
    • division, subtraction 등은 대표 엔트리를 말한다.
    • 동의어에 해당하는 값이 나오면 추후에 확인할 로그 값에는 대표 엔트리만 별도로 데이터를 수집할 수 있다.

Untitled

(2) 시나리오 구성

  • 엔티티를 구성했다면, 이제 시나리오를 구성한다.
  • 사용할 파라미터를 설정한다.

Untitled

  • 패턴 발화를 할 때 원하는 파라미터를 별도로 지정할 수 있다.
  • 패턴 발화를 보면 빨간색 네모 박스를 확인할 수 있는 데, 이 부분에서 파라미터를 설정할 수 있다.
  • 더하기, +에서의 파라미터는 엔티티 그룹을 설정하게 된다.

Untitled

  • 실제 파라미터 설정된 값은 다음과 같다.

Untitled

(3) 파이썬 코드

  • 이제 다음 코드를 작성하여 기존 main.py에 추가한다.
  • 코드 작성시, 한가지 유의 사항은 json.loads() 함수를 반드시 써줘야 한다. Python Dictionary를 String으로 변경하는 것은 str() 함수를 사용하면 쉽게 변경이 가능하지만, 문자열 dictionary를 Dictionary로 바로 변경은 되지 않는다. 따라서, json.loads()를 사용한다.
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
from flask import Flask, request
import json

# 메인 로직!!
def cals(opt_operator, number01, number02):
if opt_operator == "addition":
return number01 + number02
elif opt_operator == "subtraction":
return number01 - number02
elif opt_operator == "multiplication":
return number01 * number02
elif opt_operator == "division":
return number01 / number02

app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello, World!!!!!!!!!!!!!!!!!!!!!!!'

# 카카오톡 텍스트형 응답
@app.route('/api/sayHello', methods=['POST'])
def sayHello():
body = request.get_json() # 사용자가 입력한 데이터
print(body)
print(body['userRequest']['utterance'])

responseBody = {
"version": "2.0",
"template": {
"outputs": [
{
"simpleText": {
"text": "반가워!!!!! hello I'm Ryan"
}
}
]
}
}

return responseBody

# 카카오톡 이미지형 응답
@app.route('/api/showHello', methods=['POST'])
def showHello():
body = request.get_json()
print(body)
print(body['userRequest']['utterance'])

responseBody = {
"version": "2.0",
"template": {
"outputs": [
{
"simpleImage": {
"imageUrl": "https://t1.daumcdn.net/friends/prod/category/M001_friends_ryan2.jpg",
"altText": "hello I'm Ryan"
}
}
]
}
}

return responseBody

# 카카오톡 Calculator 계산기 응답
@app.route('/api/calCulator', methods=['POST'])
def calCulator():
body = request.get_json()
print(body)
params_df = body['action']['params']
print(type(params_df))
opt_operator = params_df['operators']
number01 = json.loads(params_df['sys_number01'])['amount']
number02 = json.loads(params_df['sys_number02'])['amount']

print(opt_operator, type(opt_operator), number01, type(number01))

answer_text = str(cals(opt_operator, number01, number02))

responseBody = {
"version": "2.0",
"template": {
"outputs": [
{
"simpleText": {
"text": answer_text
}
}
]
}
}

return responseBody
  • 코드를 저장 후 git배포한다.
  • 스킬 설정

Untitled

  • 스킬을 사용할 블록에서 스킬을 지정하고 챗봇 배포한다.

Untitled

  • 배포 후 카카오톡에서 직접 실험

  • (+) 연산 정상작동

  • (-)연산 정상작동

  • (x) 연산 정상작동

  • (%) 연산 정상작동

  • 사칙연산 모두 정상작동하므로 성공

Untitled

Heroku 배포

개요

  • 카카오톡 챗봇 만들기를 Python + FLASK를 통해 간단한 튜토리얼을 만들어본다.

사전준비

  • OBT 참여승인을 받아야 한다.

기본설정

  • 카카오톡 챗봇 버튼 클릭 후, 봇 이름 생성

    • [봇 만들기] - [카카오톡 챗봇]
  • 카카오톡 채널 연결을 진행한다.

Untitled

  • 바탕화면 폴더 생성 : chatbotnos
  • 깃허브 Repo 생성 : chatbotnos

Untitled

  • heroku app 생성 : chatbotnos

Untitled

나만의 주소 생성됨 : https://chatbotnos.herokuapp.com/

로컬 폴더 생성

  • VSCord에서 c 드라이브 경로에 폴더 생성 : chatbotnos
    • 폴더 우클릭 : git bash here
    • git clone [ 깃허브 repo 주소 ]

가상환경 생성

  • 가상환경 생성

    • pip3 install virtualenv
    • virtualenv venv # 노트북으로 진행. 환경설정에 부족한 부분이 있는지 실패
  • virtualenv 명령 실패 시, 다음 명령으로 대응

    • 가상환경 생성 : python -m venv venv
    • 가상환경 진입 : source venv/Scripts/activate

Untitled

Heroku App 구축

  • 간단하게 app 파일을 만들어 Heroku App URL을 확보해보자.

  • 파일 생성 : chatbotnos/app/main.py

    • mkdir app
    • cd app
    • vi main.py
  • 다음 코드 작성

  • 들여쓰기 주의 !!!!

1
2
3
4
5
6
7
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello, World!'
  • 파일 생성 : chatbotnos/wsgi.py
    • app은 폴더를 말하고, main은 main.py를 말한다.
    • 해당 파일에 코드 작성 : vi wsgi.py
1
2
3
4
from app.main import app

if __name__ == "__main__":
app.run(threaded=True, port=5000)
  • Procfile 파일 작성 (오타 x. profile x)

    • 카카오톡 챗봇에서는 포트번호를 입력을 해줘야 한다.
      • localhost:5000 처럼 명시적으로 입력해주는 것으로 생각하면 된다.
  • 파일 생성 : chatbotnos/Procfile

    • vi Procfile
    • 코드 작성
1
web: gunicorn --bind 0.0.0.0:$PORT wsgi:app
  • 파일 생성 : chatbotnos/runtime.txt
    • vi runtime.txt
1
python-3.8.5

heroku CLI 설치

  • 구글링 : heroku cli
    • install the Heroky CLI

Untitled

  • 설치 진행

Untitled

  • 디폴트 설정으로 설치

Untitled

Heroku login

  • Heroku CLI 설치 후 로그인을 진행해야 한다.
  • cmd에서 실행
1
heroku login
  • press any key : 아무 키나 입력한다

Untitled

  • 로그인 창이 출력된다.

Untitled

  • 로그인 진행

.gitignore 파일 작성

https://www.toptal.com/developers/gitignore

  • 해당 링크에서 키워드 입력하고 ‘생성’
  • 키워드 : virtualenv, vs

Untitled

  • 복사 : ctrl + A
  • .gitignore 파일에 붙여넣어 완성

Untitled

Requirements.txt 파일

  • 다음 코드를 실행하여 생성한다.
  • 하는 김에 gunicorn 설치
    • pip install -r requirements.txt
    • pip install gunicorn
    • pip freeze > requirements.txt

Heroku 배포

  • Heroku Project 생성

    • 다른 사용자들과 이름 다르게 진행! = 유일값
    • 언더바 사용불가 : name_name (x)
    • 로컬 폴더명 == Github Repo == Heroku Project 이름
  • 위 코드에서 이미 있는 이름이라 뜨면 다음 코드 실행

  • 기존 Existing App과 연동하려면 배포 전 아래 코드를 선 실행 후, 배포를 진행한다.

    • heroku git:remote -a chatbotnos
1
git init
  • heroku 배포 메뉴얼의 코드
1
2
$ heroku git:clone -a chatbotnos 
$ cd chatbotnos
  • Heroku 배포
    • Heroku에 배포하기 위해서는 크게 아래 코드만 기억한다.
1
2
3
4
$ git add .
$ git commit -am "your_message" # 이 부분만 자유롭게 쓸 수 있다.
$ git push origin main ## Github Repository에 업데이트
$ git push heroku main ## Heroku 코드 배포
  • 배포 완료

Untitled

로그 확인

Kakao 스킬서버

챗봇에 다음과 같은 연산을 도입하게 위한 기능이다

5*10은 무엇인가요?

  • 사칙연산

  • number01 operator number02

  • def cal(number1, number2)

         number 1 * number 2
    

스킬의 역할

  1. 바로 동작에서 출력으로 이동함으로써 달성 불가능한 것을 스킬을 거쳐서 가능케 함
  2. [발화입력 → 동작 → 스킬 → 출력]

Untitled

  • 웰컴 블록(Welcome Block)

웰컴 블록은 사용자가 봇을 처음 사용할 때 받게되는 웰컴메시지를 설정하는 블록.

웰컴블록’이 ‘사용중’일 경우 사용자가 봇을 처음 사용할 때 웰컴블록에 설정된 응답이 전송되고, ‘미사용’일 경우 응답을 설정하는 부분이 비활성화 되고 OFF로 표기.

  • 폴백 블록(Fallback Block)

폴백 블록은 사용자의 발화 의도가 어떠한 블록과도 매칭이 되지 않을 때 (=봇이 사용자의 발화 의도를 이해하지 못할 때)의 응답을 설정하는 블록.

  • 탈출 블록(Exit Block)

탈출 블록은 봇의 되묻기 상황에서 사용자가 대화를 초기화하거나 탈출하고 싶을때 쓰는 사용자 명령어를 정의하는 블록.

스킬 처리 과정

  • 봇 시스템 = 주문 블록
  • 사용자 발화 : ‘피자 주문 할께요’
  • 주문 블록 — [스킬 호출] —> 스킬 서버
  • 주문 블록 <— [스킬 응답] — 스킬 서버
  • 챗봇 답변 : ‘피자 주문 완료’

Untitled

서버와 DB 구조

  • 서버가 2개 필요
  • 폭백 블록 → ←챗봇 API 서버 ↔ 챗봇 엔진 서버 ↔ 학습 DB

Untitled

스킬 사용

  • 카카오 챗봇 → 스킬 → 생성
  • 단, 서버 주소가 필요하다.

Untitled

  • 주소 끝에 다음과 같은 형식으로 입력

    • 단순 테스트 응답 스킬 주소 끝에 입력 : .com/api/sayHello
    • 단순 계산기 텍스트 응답 스킬 주소 끝에 입력 : .com/api/calCulator
  • body = request.get_json() # 사용자가 입력한 데이터

  • responseBody 는 일종의 템플릿. 이 틀에서 응답 형식으로 작성한다.

  • simpletext

스킬 사용 코드 예시 : SimpleImage

간단한 이미지형 출력 요소입니다. 이미지 링크 주소를 포함하면 이를 스크랩하여 사용자에게 전달합니다. 이미지 링크 주소가 유효하지 않을 수 있기 때문에, 대체 텍스트를 꼭 포함해야 합니다.

상세 필드

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"version": "2.0",
"template": {
"outputs": [
{
"simpleImage": {
"imageUrl": "http://k.kakaocdn.net/dn/83BvP/bl20duRC1Q1/lj3JUcmrzC53YIjNDkqbWK/i_6piz1p.jpg",
"altText": "보물상자입니다"
}
}
]
}
}

엔티티 설정

  • 엔티티 → 나의 엔티티 관리 → (엔티티 생성)

Untitled

  • 이 엔티티와 동일한 이름으로 변수를 생성하고 코드 작성

  • def clas(opt_operator, number01, number02) : # 메인로직!!!

  • sys.number 사용 가능한지 체크

Untitled

  • 파라미터 설정

Untitled

  • 사용자 발화 : 다음과 같이 발화에서 엔티티를 설정

Untitled

  • 로그값 확인이 가능한 것을 사용 : aws, heroku, 구름IDE 중에서 선택

heroku project 생성 시 주의

  • 이름 다르게 생성! = 유일값
  • heroku-kakap-chatbot은 사용 불가
  • 언더바 _ 사용불가
  • 다음 3가지를 같은 이름으로 생성
    • 로컬 폴더명 == Github Repo == Heroku Project 이름

Heroku 가입

Heroku란?

헤로쿠(Heroku)는 간단히 git을 통해 무료로 웹 사이트를 호스팅할 수 있게 해주는 서비스다. 무료인 이유는 해당 도메인으로 몇 시간 동안 요청이 없으면 수면상태로 전환해 초기 접속이 늦기 때문이다.그래서 개인 블로그 서버나 포트폴리오 결과물 배포 용으로 가볍게 활용하기 좋은 호스팅 플랫폼이다. 현재 공식적으로 Node.js, Ruby, Java, PHP, Python, Go, Scala, Cjojure 언어를 지원한다.

Heroku 배포 준비

  1. 배포를 위한 소스코드 파일이 있어야할 것!

  2. 헤로쿠 배포작업은 Git으로 이루어지니 Git이 설치되어 있을 것! (깃 설치) (깃 설치 도움말 포스팅)

  3. 헤로쿠 계정 생성

  • 깃 설치 및 환경 설정은 “깃 설치” 글에 걸어둔 사이트에서 설치파일을 받아 설치하면 되고 이를포함한 환경설정은 옆 “깃 설치 도움말 포스팅” 글을 참고하길 바란다.

Heroku 회원가입

  • 구글링 : heroku
  • 회원가입

https://www.heroku.com/

Untitled

  • 정보를 입력하고 회원가입 진행

Untitled

  • e-mail 에서 회원가입 메일을 수신
  • 메일의 링크를 이용

Untitled

  • 비밀번호 설정

Untitled

  • 가입 완료

Untitled

  • 로그인하면 다음 대시보드가 나타난다

Untitled

Reference

https://blog.naver.com/dsz08082/221952990439?isInf=true

Kakao Chatbot open builder

챗봇 제작

챗봇 설정

  • 프로필 설정 : 모든 사항에 관해 공개로 전환

Untitled

  • 운영 채널 연결 : ‘tutorial’ 챗봇 ↔ ‘휴먼주식도우미챗봇’ 채널
    • 배포만 하면 카카오톡에서 검색 가능하다.

Untitled

  • 배포
    • 첫 배포 : 이제 카카오톡에서 검색이 가능하며 사용이 가능해진다.
    • 그 이후의 배포 : 작성한 블록 시나리오 등이 실제 카카오톡에 반영된다.

Untitled

  • 관리자 초대
    • 조원들과 챗봇을 공동으로 관리하기 위해 설정

Untitled

시나리오 작성

  • 앞서 제작된 시나리오 구상안을 토대로 챗봇의 시나리오, 블록 작성

  • 시나리오 생성

  • 주요 기능을 기반으로 시나리오 생성

Untitled

  • 0 메뉴

    • 주요 기능을 모두 사용할 수 있는 메뉴를 호출할 시나리오를 의도하고 생성
  • 1 주식이 처음이신가요?

    • 주식 초심자를 위해 ‘계정 생성 방법’과 ‘주식 거래하는 방법’ 등을 설명하기 위한 시나리오
  • 2 주식 단어

    • 입문자를 위한 간단한 주식 용어를 설명하고 더 많은 용어를 공부하기 원하는 사용자를 위한 추가적으로 자료를 담을 예정
  • 3 종목별 시세를 알려드릴까요

    • 종목 시세를 확인 가능하도록 크롤링한 데이터를 출력할 시나리오를 계획
  • 4 현재 인기 많은 종목 알려드릴까요?

    • 처음 주식하는 사람들에게 주식을 추천하기 위한 기능을 넣을 시나리오
  • 5 꼭 알아야 할 이슈

    • 초심자가 현재의 주식 관련 흐름을 파악하는데 도움을 줄 정보를 알려줘야 할 시나리오 생성

블록 작성

  • 시나리오 아래에 구상안을 구현할 블록들을 작성

  • 블록명을 넘버링하여 상위 하위를 구분 가능하게 함.

  • 상위에서 하위로 넘어갈 수 있게 제작

    • 예를 들어, 1-1 블록에서 1-1-1 블록이나 1-1-2 블록으로 이동 가능
  • 거의 모든 블록에 돌아가기 기능 탑재. 반대로 하위에서 상위로 이동하도록 구현

  • 0 메뉴얼 블록

    • 0 메뉴얼 : 주요 기능 사용과 개선사항 전달이 가능한 메뉴를 출력하는 블록

Untitled

  • 1 주식이 처음이신가요 블록
    • 다음 두 가지 기능 중 하나를 선택하고 호출하는 블록
    • 1-1 계정 만드는 법 알아보기
      • 1-1-1 오프라인으로 계좌 개설하기
      • 1-1-2 온라인으로 계좌 개설하기
    • 1-2 기초 상식 알아보기
      • 1-2-1 주식은 이렇게 거래합니다
      • 1-2-2 주식 시장의 결제 방식
      • 1-2-3 증권사 수수료, 증권거래세

Untitled

  • 2 주식 단어 목록 블록
    • 간단한 단어와 그 뜻이 담긴 여러 블록과 연결
    • 더 많은 용어를 알고 싶은 초심자를 위한 자료의 링크가 연결된 버튼을 제작

Untitled

  • 3 종목별 시세 확인 블록
    • 종목 시세를 확인 가능하도록 크롤링한 데이터를 출력할 예정
    • 임시로 시가총액 확인 가능한 링크를 연결

Untitled

  • 4 최근 인기 종목 알려드립니다 블록
    • 거래상위, 상승주, 하락주를 확인 가능한 링크를 연결
    • 매수상위, 매도상위를 기반으로 인기 많은 종목을 출력할 예정
    • 임시로 매수상위, 매도상위 확인 가능한 링크를 연결

Untitled

  • 5 꼭 알아야할 이슈,뉴스 블록
    • 주식 관련 뉴스를 확인할 수 있게 설정
    • 매일 뉴스를 찾아서 확인하기 번거로운 사용자들을 위한 관련 기능 추천

Untitled

제네릭 메뉴 설정

  • +시나리오 밑에 ‘시나리오 설정’ 에서 설정
  • 주요 기능과 같은 이름으로 제네릭 메뉴 생성
  • 각 제네릭 메뉴를 주요 기능을 사용할 수 있는 블록과 연결한다.

Untitled

배포 : 챗봇 시나리오 반영 여부 확인

  • 배포 후 카카오톡에서 의도대로 기능이 작동하는 시험

Untitled

Untitled

Untitled

Untitled

피드백 받습니다.

  • 카카오톡 검색 : 휴먼주식도우미챗봇

Untitled

  • 개선사항 전달 or 상담직원 연결

Untitled

Untitled

  • 개선사항을 적어주세요

Untitled

  • 채널에서 확인하고 개선

Untitled