카카오톡 플러스친구를 이용한 자동응답 봇을 Python3, Flask를 이용해서 만들어 보겠습니다.
사전 준비물
카카오톡 플러스친구
카카오톡 플러스친구 관리자 센터에 카카오톡 ID로 로그인 한 후 플러스친구를 등록해주세요.
외부에서 접근이 가능한 서버
데스크탑, aws 등 취향에 맞게 선택해주세요. 핵심은 외부에서 접근이 가능해야 하다는 겁니다.(공인 ip가 있어야 합니다. 이유는 후술) 저는 데스크탑 + 공유기 환경에서 개발을 진행하였습니다.
시작
카카오톡 플러스친구 친구 추가하기
원활한 테스트를 위해 카카오톡 플러스친구를 친구 추가해봅시다.
- 관리자 센터 왼쪽의 관리 탭을 눌러주세요.
- 플러스친구 정보에서 홈 URL을 복사하여 PC 카톡을 통해 나에게 보내주세요.
- 아래의 공개 설정에서 홈 공개를 ON 해주세요. (아직 서비스가 시작되기 전이니 검색 허용, 노출 허용은 키지 않는 것을 권장합니다.)
- 스마트폰의 카카오톡 어플을 이용해서 위에서 나에게 보낸 링크를 눌러 친구 추가를 해주세요.
- 플러스친구에게 1:1채팅을 걸어보세요. 아직은 아무것도 할 수 없습니다.
- 플러스친구 자동응답 API는 PC 카카오톡은 지원하지 않습니다.
카카오톡 플러스친구 자동응답 API 시작하기
- 관리자 센터 왼쪽의 탭에서 스마트 채팅을 누르시고 API형의 설정하기를 눌러주세요.
- 앱 이름, 앱 설명을 적고 전화번호 인증을 진행해주세요.
- 앱 URL은 앞으로 작성할 서버의 URL이 됩니다. 사전에 준비한 서버의 URL을 적어주세요. ex) https://:your_server_url/ API 테스트 버튼을 눌러봅시다. 그러면 아래와 같은 에러가 납니다.
카카오톡 플러스친구 API를 이용하기 위해서는 카카오톡에서 명세한 웹 서버 프로그램을 작성하여야 합니다. 위의 에러는 https://:your_server_url/keyboard 를 작성하지 않아서 일어나는 에러입니다.
서버 프로그램 작성하기
저는 python 3.5.2, virtualenv 15.1.0 로 개발을 진행하였습니다.
$ mkdir test; cd test
작업 디렉터리를 생성 후 이동해 줍시다.
$ virtualenv -p python3 venv
(권장) virtualenv를 통해 독립된 환경을 만들어주세요.
$ source venv/bin/activate
앞으로 서버를 작성, 실행할 때는 위의 명령어를 통해 가상환경에서 작업해주세요.
$ pip install flask
flask를 설치해줍니다.
$ vi app.py
서버 소스를 작성해 봅시다.
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route('/keyboard', methods=['GET'])
def keyboard():
return jsonify({'type': 'text'})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8081)
keyboard 함수를 위와 같이 작성함으로써 /keyboard Get request를 서버가 받을 수 있게 되었습니다. return은 JSON 형식이며 type은 이 API가 응답한 후 사용자의 그다음 행동을 강제해줍니다. type이 text이기 때문에 사용자는 처음에 대화 시작 시 텍스트를 입력할 수 있게 됩니다. type은 text 외에 buttons도 있습니다. 공식 API를 참고해주세요. host와 port는 서버의 설정에 따라 작성해주세요.
$ python app.py
서버를 실행하고 다시 API 테스트를 눌러봅시다. 위와 같이 나온다면 성공입니다. 위와 같이 나오지 않는다면 IP, 방화벽, 공유기(포트포워딩) 등 다양한 이슈가 있을 수 있습니다. 서버 설정을 다시 한번 살펴보시거나 주변에 친하고 만만한 개발자에게 연락을 취해 봅시다. 관리자센터 아래의 API형 저장하기 버튼을 눌러 설정 저장 후, API형 시작하기 버튼을 눌러주세요. 스마트폰 어플리케이션을 통해 1:1대화를 누르면 아까와 다르게 채팅창이 생긴 것을 보실 수 있습니다. 아무 글이나 입력한 후 전송해 주세요. 위와 같이 두 메시지가 왔나요? 맨 위의 메시지는 관리자에게 발송되는 메시지입니다. 아래는 실제 사용자에게 보이는 메시지입니다. 결론적으로 아까의 /keyboard와 같이 /message를 구현하지 않아서 생겨난 일입니다.
@app.route('/message', methods=['POST'])
def message():
content = request.json['content']
response = content
return jsonify(
{
'message': {
'text': response
},
'keyboard': {
'type': 'text'
}
})
아까와 달리 method를 GET이 아닌 POST로 지정한 것에 유의해주세요. request.json[‘content’]를 통해 입력받은 메시지를 받고 return 할 때 message.text를 통해 응답 메시지를 명시해줍니다. keyboard.type을 통해 /keyboard와 같이 사용자의 행동을 강제해 줍니다. 코드상에 나와있는 대로 이 프로그램은 입력받은 메시지를 그대로 response로 던져줍니다. 서버를 재시작한 후 다시 스마트폰을 통해 대화를 걸어 봅시다. 아래와 같이 나온다면 성공입니다. message의 함수를 어떻게 구현하느냐에 따라 다양한 일을 할 수 있습니다. 입력받은 메시지를 조건에 따라 분기하여 원하는 response를 내어주는 챗봇 프로그램을 작성해보세요. (저는 3초 정도 sleep 걸어서 메모장으로 활용하고 있습니다…)