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))

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

로그 확인

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