카카오톡 플러스친구를 이용한 자동응답 봇을 Python3, Flask를 이용해서 만들어 보겠습니다.

사전 준비물

카카오톡 플러스친구

카카오톡 플러스친구 관리자 센터에 카카오톡 ID로 로그인 한 후 플러스친구를 등록해주세요.

외부에서 접근이 가능한 서버

데스크탑, aws 등 취향에 맞게 선택해주세요. 핵심은 외부에서 접근이 가능해야 하다는 겁니다.(공인 ip가 있어야 합니다. 이유는 후술) 저는 데스크탑 + 공유기 환경에서 개발을 진행하였습니다.

시작

카카오톡 플러스친구 친구 추가하기

KakaoTalk_2017-12-07-21-27-21_Photo_7 원활한 테스트를 위해 카카오톡 플러스친구를 친구 추가해봅시다.

  1. 관리자 센터 왼쪽의 관리 탭을 눌러주세요.
  2. 플러스친구 정보에서 홈 URL을 복사하여 PC 카톡을 통해 나에게 보내주세요.
  3. 아래의 공개 설정에서 홈 공개를 ON 해주세요. (아직 서비스가 시작되기 전이니 검색 허용, 노출 허용은 키지 않는 것을 권장합니다.)
  4. 스마트폰의 카카오톡 어플을 이용해서 위에서 나에게 보낸 링크를 눌러 친구 추가를 해주세요.
  5. 플러스친구에게 1:1채팅을 걸어보세요. 아직은 아무것도 할 수 없습니다.
    • 플러스친구 자동응답 API는 PC 카카오톡은 지원하지 않습니다.

카카오톡 플러스친구 자동응답 API 시작하기

스크린샷 2017-12-07 오후 9.24.19.png

  1. 관리자 센터 왼쪽의 탭에서 스마트 채팅을 누르시고 API형의 설정하기를 눌러주세요.
  2. 앱 이름, 앱 설명을 적고 전화번호 인증을 진행해주세요.
  3. 앱 URL은 앞으로 작성할 서버의 URL이 됩니다.  사전에 준비한 서버의 URL을 적어주세요.  ex) https://:your_server_url/ API 테스트 버튼을 눌러봅시다. 그러면  아래와 같은 에러가 납니다.

스크린샷 2017-12-07 오후 6.14.57 카카오톡 플러스친구 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 테스트를 눌러봅시다. 스크린샷 2017-12-07 오후 6.52.10 위와 같이 나온다면 성공입니다. 위와 같이 나오지 않는다면 IP, 방화벽, 공유기(포트포워딩) 등 다양한 이슈가 있을 수 있습니다. 서버 설정을 다시 한번 살펴보시거나 주변에 친하고 만만한 개발자에게 연락을 취해 봅시다. 관리자센터 아래의 API형 저장하기 버튼을 눌러 설정 저장 후, API형 시작하기 버튼을 눌러주세요. 스마트폰 어플리케이션을 통해 1:1대화를 누르면 아까와 다르게 채팅창이 생긴 것을 보실 수 있습니다. 아무 글이나 입력한 후 전송해 주세요. KakaoTalk_Photo_2017-12-07-18-58-23.jpeg 위와 같이 두 메시지가 왔나요? 맨 위의 메시지는 관리자에게 발송되는 메시지입니다. 아래는 실제 사용자에게 보이는 메시지입니다. 결론적으로 아까의 /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로 던져줍니다. 서버를 재시작한 후 다시 스마트폰을 통해 대화를 걸어 봅시다. 아래와 같이 나온다면 성공입니다. KakaoTalk_2017-12-07-21-27-19_Photo_69 message의 함수를 어떻게 구현하느냐에 따라 다양한 일을 할 수 있습니다. 입력받은 메시지를 조건에 따라 분기하여 원하는 response를 내어주는 챗봇 프로그램을 작성해보세요. (저는 3초 정도 sleep 걸어서 메모장으로 활용하고 있습니다…)  

  • 카카오톡 플러스친구 API의 핵심은 카카오에서 요구하는 규격에 맞게 웹 서버 프로그램을 작성하는 것 입니다. Flask가 아니더라도 Django, Node.js 등 다양한 방법이 있을 수 있습니다.

  • Nginx, Gunicorn, 방화벽 등 다뤄야 할 이야기가 너무나 많으나 적지 않았습니다.