카카오톡 봇 만들기 (3)

지금까지 flask 실행을 하였다 . 이제부터 본격적으로 봇 테스트 기능을 이용하여 구축해보겠다.

기본 설정

테스트이기 때문에 일단 작동이 잘되는지 확인을 해보겠다.

우선 봇 관련 발화와 스킬관련 설정을 해야한다. 다시 카카오톡 봇 설정으로 들어가자

발화 설정

발화는 쉽게말하면 사용자가 카카오톡으로 친 채팅이라고 보면된다.

카카오톡에 등록한 사용자 발화에 대해서 제대로 서버에 json 형식으로 보내지는 것을 볼 수가 있다.

테스트를 위해서 "오늘의 메뉴"라고 등록을 한 뒤 엔터를 누르도록 하자.

스킬 설정

이제 우리가 사용하는 서버를 연결하기 위해서 스킬을 만들도록 하자

스킬탭으로 이동하여 다음과 같이 스킬을 생성하도록 하자.

여기서 중요한것은 url설정이다.

첫번 째로 https로 하면 제대로 동작하지 않는다. 꼭 http로 해야한다.

그리고 localhost:5000에는 Azure로 생성한 곳의 Ip를 넣어주도록하자.

현재 필자는 주소 뒤에 /message로 하였는데 이는 구현하기 나름이다.

그 후 다시 홈화면으로 돌아와서 스킬데이터 사용으로 봇응답을 설정해주고 파라미터에서도 스킬 등록을 해준뒤 저장을 해준다.

Flask 코드작성

이제 테스트하기 위한 코드를 작성해보도록하자. 예제 코드는 다음과 같다.

from flask import Flask, json, request, jsonify
import sys

app = Flask(__name__)

@app.route('/message', methods=['POST'])
def Message():
    content = request.get_json()
    content = content['userRequest']['utterance']
    content=content.replace("\n","")
    print(content)
    if content == u"오늘의 메뉴":
        dataSend = {
            "version" : "2.0",
            "template" : {
                "outputs" : [
                    {
                        "simpleText" : {
                            "text" : "테스트입니다."
                        }
                    }
                ]
            }
        }
    else:
        dataSend = {
            "version" : "2.0",
            "template" : {
                "outputs" : [
                    {
                        "simpleText" : {
                            "text" : "error입니다."
                        }
                    }
                ]
            }
        }
    return jsonify(dataSend)

if __name__ == "__main__":
    app.run(host='0.0.0.0',port=5000)

하나씩 코드를 살펴보도록 하자

우선 어노테이션을 사용하여 route를 설정해주도록 하자 이는 아무거나 원하는 것으로 설정하도록 하자

나는 /message로 설정하였다 이렇게 설정하면 쉽게말하면 http://localhost:5000/message로 이동했을 때의 기능을 보여준다고 하면된다.

methodsPOST형식으로 사용하였다. json으로 값을 받아야하기 때문에 POST로 하였다.

@app.route('/message', methods=['POST'])

밑의 def Message()부분이 이해 안된다면 이전 게시물을 참고하도록 하자

content = request.get_json() # 사용자가 입력한 정보를 json형태로 가져옴
content = content['userRequest']['utterance'] # user가 입력한 발화를 가져옴

content에서 userRequestutterance는 이전 게시물에서 사용자의 발화를 나타내는 정보라고 하였다. 이를 통해서 사용자가 입력한 정보를 가져오게 된다.

content=content.replace("\n","") # '\n'문자를 ""로 대체한다.
print(content) #사용자의 입력을 제대로 받는 지 확인하기 위한 수단

주의할 점이 있는데 사용자의 정보는 엔터를 받기 때문에 \n을 포함해서 반환이 된다. 이를 없애기 위해서는 여러가지 방법이 있는데 나는 replace를 사용하여 해결하였다.

다른방법으로는 split을 사용하거나 if문 안에서 판별을 할 때 오늘의 메뉴\n으로 비교하는 방법도 있다.

if content == u"오늘의 메뉴":
        dataSend = {
            "version" : "2.0",
            "template" : {
                "outputs" : [
                    {
                        "simpleText" : {
                            "text" : "테스트입니다."
                        }
                    }
                ]
            }
        }
    else:
        dataSend = {
            "version" : "2.0",
            "template" : {
                "outputs" : [
                    {
                        "simpleText" : {
                            "text" : "error입니다."
                        }
                    }
                ]
            }
        }
    return jsonify(dataSend)

"오늘의 메뉴"에 u를 붙여주는 이유는 unicode변환이라고 하는데 붙여주지 않아도 작동하는 것을 볼 수 있다.

그리고는 이전 게시물에서 보여주었던 형식을 차목하여 simpleText형으로 데이터를 dataSend라는 변수에 담아서 jsonify(dataSend)로 Json형식으로 보내주도록 한다.

이제 터미널에서 python3 파일명.py를 이용하여 서버를 작동하도록 한다.

작동 확인

작동확인을 위해서는 봇테스트 기능을 사용한다.

봇테스트를 키고 우리가 입력했던 "오늘의 메뉴"를 입력해보자.

정상적으로 작동하는 것을 볼 수 있다. 또한, 터미널 창에서도 제대로 작동하는 것을 볼 수 있다.

다음시간에는 엔티티 추가와 엔티티를 읽어오는 법과 quickreply에 대해서 구현해보도록하자

'Python > Flask' 카테고리의 다른 글

[Python/Flask] 카카오톡 봇 만들기 (2)  (0) 2021.06.30
[Python/Flask] 카카오톡 봇 만들기 (1)  (0) 2021.06.30

카카오톡 봇만들기(2)

지난 시간 까지 가상머신 구축과 ssh 구축까지 완료하였다. 이번 시간에는 flask구축을 해보려고 한다.

Flask 설치

  • Flask 구축을 하기 위해서는 우선 SSH창을 킨다.
  • python 설치을 설치하기 전에 다음과 같은 명령어를 ssh창에서 입력한다.
  • sudo apt-get install update
  • sudo apt-get install upgrade
  • python 설치를 위해 다음과 같은 명령어를 입력한다.
  • sudo apt-get install python3
  • sudo apt-get install python3-pip
  • 이제 Flask과 다른 것들을 설치하기 위해서 다음과 같은 명령어를 입력한다.
  • pip install flaskpip install jsonifypip install bs4sudo apt-get install vim
  • pip install selenium
  • pip install selenium
  • pip install requests
  • 다음과 같은 파일들을 설치하는데 오류가 발생한다면 pip version을 업그레드 해주거나 혹은 pip3로 설치해보기를 바란다.

카카오톡 오픈빌더 사용

  • 카카오톡 오픈빌더를 사용하기 전에는 반드시 사전 승인이 필요하다. 사전승인이 안되었다면 좀더 기다려보길 바란다.
  • 카카오톡 오픈빌더 승인이 났다면 나의 봇에 들어가 봇을 생성하자

  • 봇을 만들었으면 시나리오를 추가하여 새로운 시나리오를 생성한다.

  • 엔티티를 만들기 전에 카카오톡 오픈빌더의 스킬에 대해서 알아보자

카카오톡 오픈빌더 스킬사용(응답별 JSON 포맷)

카카오톡 오픈빌더 도움말

  • 이 내용은 위의 링크를 참조하여 작성하였습니다.

  • 카카오톡 봇을 만들기 위해서는 이 Flask를 사용하기 전에 이 내용을 숙지해야할 필요가 있다.
  • 우리가 사용할 JSON 포맷위주로 살펴보도록 하겠다.

userRequest

  • 이 타입은 사용자의 정보를 담고 있다. 사용자의 발화와 시간대/언어, 반응한 블록의 정보를 추가적으로 포함하고 있다.

쉽게 말하면 사용자의 채팅이라고 생각할 수 있다.

상세필드

필드명 타입 설명
timezone string 사용자의 시간대를 반환합니다.한국에서 보낸 요청이라면 “Asia/Seoul”를 갖습니다.
block Block 사용자의 발화에 반응한 블록의 정보입니다.블록의 id와 name을 포함합니다.
utterance string 봇 시스템에 전달된 사용자의 발화입니다.
lang string 사용자의 언어를 반환합니다.한국에서 보낸 요청이라면 “kr”를 갖습니다.
user User 사용자의 정보입니다.

상세필드는 이런식으로 이루어져 있다. 하나하나 살펴보자

  1. timezone은 채팅을 입력한 사용자의 시간대를 가지고 있는 변수이다.
  2. block은 자세하게 모르겠는데 카카오톡 오픈빌더에서 봇을 구성할 때 웰컴 블록 이런식으로 여러가지 블록을 구성한다. 이 내용인 것 같다.
  3. utterance는 중요하다. 이는 사용자가 입력한 채팅을 가지고 있는 변수이다. 이를 많이 사용할 것 이다.
  4. lang은 어떤 언어를 사용했는지 반환한다. 한국에서면 kr을 가진다.
  5. user는 입력한 사용자의 정보이다. 입력한 사용자는 고유 id를 가지고 있다.

예시코드

{
 "userRequest": {
    "timezone": "Asia/Seoul",
    "params": {},
    "block": {
      "id": "<블록 id>",
      "name": "<블록 이름>"
    },
    "utterance": "<사용자 발화>",
    "lang": "kr",
    "user": {
      "id": "<사용자 botUserKey>",
      "type": "botUserKey",
      "properties": {
        "plusfriendUserKey": "<카카오톡 채널 사용자 id>"
      }
    }
  },
  "contexts": [],
  "bot": {
    "id": "<봇 id>",
    "name": "<봇 이름>"
  },
  "action": {
    "name": "<스킬 이름>",
    "clientExtra": null,
    "params": {},
    "id": "<스킬 id>",
    "detailParams": {}
  }
}

SkillResponse

  • 스킬응답으로 이는 vesion/template/context/data의 총 4가지로 구성이된다.

쉽게 말하자면 카카오톡 채팅 봇의 응답 의 형식으로 볼 수 있다.

예제 코드(기본형)

{
  "version": "2.0",
  "template": {
    ...
  },
  "context": {
    ...
  },
  "data": {
    ...
  }
}
  • 기본형은 다음과 같다.

SkillTemplate

  • SkillTemplate는 다음과 같이 2가지로 구성된다.
이름 타입 필수여부 제한
outputs Array y 1개 이상 3개 이하
quickReplies Array n 10개 이하

outputs(출력 그룹)

  • 출력 그룹은 여러 종류의 출력 요소를 포함한다. 출력요소들은 다음 표와 같다.
이름 설명 *캐로셀 가능 여부
simpleText 간단 텍스트 X
simpleImage 간단 이미지 X
basicCard 기본 카드 O
commerceCard 커머스 카드 O
listCard 리스트 카드 X
  • 캐로셀이란 여래 개의 출력 요소를 묶어서 제공한다. 사용할 때는 "carousel"이라고 적어서 사용한다.
simpleText
  • 이는 그냥 단순한 텍스트를 넘겨줄 때 사용한다. 기본 형과 출력 예제는 다음과 같다.

{
    "version": "2.0",
    "template": {
        "outputs": [
            {
                "simpleText": {
                    "text": "간단한 텍스트 요소입니다."
                }
            }
        ]
    }
}

나머지 값들은 카카오톡 오픈빌더 도움말을 참고 부탁드립니다.

flask 기본사용

  • 이제 Flask를 설정해보자 flask를 설정하기위해서 다음과 같은 명령어를 기본 ssh창에서 입력하자
  • mkdir 프로젝트이름vim server.py
  • cd 프로젝트이름
  • 이를 수행하여 server.py의 편집에 들어와서 다음과 같은 기본 코드를 작성해 보자.
  • vim을 사용할 때 편집은 i를 누르면 되고 끝내고 저장하고 편집을 나갈 때는 Esc버튼을 누른 이후 :wq를 입력하면 나갈 수 있다.
from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return "Hello, Flask"

if __name__ == 'main__':
    app.run(host='0.0.0.0', port=5000, debug=True)
  • Flask의 기본 형태이다. 이때 주의할 점으로는 app.run이 중요하다.
  • app.run에서 host0.0.0.0으로 되어있지 않으면 외부에서 접속을 할 수없고 local에서 만 사용이 가능하다.
  • 기본포트는 5000번 이지만 port를 5000이라고 적어두었다. 5000번 포트를 사용하기 때문에 Azure에서 반드시 인바운더리 규칙을 5000번으로 재설정 해두도록 하자(모르겠다면?)
  • debug는 오류가 났을 때 오류가 난 이유를 설명해주므로 켜두는 편이다.
  • 설정이 끝났으면 다음과 같은 명령어를 입력하여 파일을 실행해보자.
  • python3 server.py
  • 다음과 같은 주소로 들어가서 실행이 되는지 확인해보자.

http://가상머신 아이피주소:5000

'Python > Flask' 카테고리의 다른 글

[Python/Flask] 카카오톡 봇 만들기(3)  (0) 2021.07.08
[Python/Flask] 카카오톡 봇 만들기 (1)  (0) 2021.06.30

카카오톡 봇만들기

컴공과 재학중 방학 때 할 미니 프로젝트로 학교에 학식은 있는데 인기가 없고 이를 홍보할 수 있는 도구가 없어 친구들과 미니 프로젝트로 기획하였다.

1. 개발환경

  • 서버를 구축하기 위해서 pythonflask 를 사용해 구축한다,
  • 크롤링을 위해서 bs4 , selenium 을 사용할 것이다.
  • 서버로는 azure 를 사용할 것이다.

2. 카카오톡 비지니스 가입

  • 카카오톡 봇을 만들기 위해서는 우선 카카오톡 비지니스에서 카카오톡 봇을 만들고 카카오톡 오픈빌더 OBT 에 신청을 해야한다.

카카오톡 비지니스 / 카카오톡 오픈빌더

  • 카카오톡 로그인 후 새 채널 만들기로 새로운 채널을 생성한다.

  • 새로운 채널을 생성했으면 비지니스도구 → 챗봇으로 들어가서 오픈빌더 신청을 하면된다. 보통 기간은 2~3일 정도 승인까지 소요된다. 반려되는 경우가 많으니 자세하게 작성하는 것을 추천한다. 👍

3. Azure 서버 만들기

  • 필자는 학생이기 때문에 Azure 학생인증을 하여 무료 크레딧 100$를 사용하여 서버를 구축하였다. Azure은 카드등록을 미리 하지 않아서 과금걱정이 없어 사용하였다.
  • 프리티어로 구축하는 방법은 링크로 들어가서 체험 계정을 우선 만든다.
  • 체험 계정을 만들었으면 본격적으로 가상머신을 생성 해보도록 하자

  • 계정을 만들었으면 포털로 들어간다.

  • 리소스 만들기를 눌러 리소스를 생성한다.

  • 서버는 당연히 Ubuntu Server 20.04 LTS 를 사용한다.

  • 가상머신 이름은 프로젝트 이름으로 설정하자.
  • 지역은 한국 남부로 설정하였다.
  • 크기는 Standard_B1s로 설정하였다. 무료크레딧이 100$이므로 월 만원씩이면 얼추 1년 비스무리하게 사용할 수 있다.
  • 인증형식은 나중에 바꿀 수 있으므로 SSH 공개 키 혹은 암호로 설정하면 된다.

  • 디스크 크기는 새 디스크 만들기로 들어가 p6 성능 계층인 64GB 하나와 프리미엄 ssd를 선택하였다.
  • 나머지는 딱히 건들이지 않고 생성하면된다.

  • ssh에 접속하기 위해서 암호를 까먹었다면 암호 다시설정에서 암호 재설정으로 ssh에 들어갈 암호를 설정한다.
  • ssh 공개 키로 만들었다면 ssh 공개키를 사용하는 법은 많이 있기 때문에 검색하여 ssh로 접속을 하도록한다.

4. 가상머신 서버 접속

  • 가상머신 접속을 하기 위해서는 접속을 하기 위한 프로그램이 필요한데 putty 를 보통 사용한다.
  • 코드를 자주 편집하거나 할 때는 Visual Studio Code를 사용해서 Remote ssh 라는 확장 익스텐션을 설치하거나 또는, python으로 작업하기 때문에 Pycharm을 사용하여 ssh접속을 진행한다.
  • 필자는 일단 putty 로 진행하도록 하겠다 Putty 다운로드 링크
  • putty를 실행하고 가상머신의 아이피를 입력하여 접속하도록 한다.

  • 접속이 안된다면 Azure에서 네트워킹으로 가서 공용인바운더리 규칙을 추가하도록 한다.

  • 대상 포트 범위만 22 로 변경한 뒤 다시 접속하도록 한다.

  • 이름과 비빌번호를 Putty에서 입력해서 이런 창이 뜨면 성공이다.

'Python > Flask' 카테고리의 다른 글

[Python/Flask] 카카오톡 봇 만들기(3)  (0) 2021.07.08
[Python/Flask] 카카오톡 봇 만들기 (2)  (0) 2021.06.30

+ Recent posts