워드프레스 환경에서 카카오톡 플러스 친구 챗봇을 구현해 보겠습니다.
플러스친구 가입하고 개설하는 내용은 검색을 통해 쉽게 찾을 수 있는 관계로 아래에는 WordPress에서 카카오톡 플러스 친구 챗봇 API를 사용하는 방법을 설명하겠습니다.
목차
ㅇ 카카오톡 플러스 친구 API v. 2.0
ㅇ WordPress Custom Page 생성
ㅇ 전체 코드
ㅇ 테스트
ㅇ 참고사항
ㅇ 마치며
카카오톡 플러스 친구 API v. 2.0
카카오톡 플러스 친구 API 관련해서는 아래 사이트에서 가이드 문서를 제공합니다.
ㅇ 참고 사이트 : https://github.com/plusfriend/auto_reply
제공되는 API에는 다양한 내용이 있기 때문에 아래 내용을 기반으로 다양한 테스트를 해보는 것이 좋겠습니다.
API 가이드 문서 중 간단한 테스트를 위하여 필요한 항목과 내용은 아래와 같습니다.
5. API specifications
해당 API를 사용하기 위해서는 HTTP(S) 서버를 구축해야 합니다.
5.1. Home Keyboard
API 이용자가 최초로 채팅방에 들어올 때 기본으로 키보드 영역에 표시될 자동응답 명령어의 목록을 호출하는 API입니다.
ㅇ Method : GET
ㅇ URL : http(s)://your_server_url/keyboard
ㅇ Content-Type : application/json; charset=utf-8
ㅇ Response
ㅇ 예제
{ "type" : "buttons", "buttons" : ["선택 1", "선택 2", "선택 3"] }
5.2. 메시지 수신 및 자동응답 API
사용자가 선택한 명령어를 파트너사 서버로 전달하는 API입니다.
자동응답 명령어에 대한 답변은 응답 메시지(Message)와 응답 메시지에 따른 키보드 영역의 답변 방식(Keyboard)의 조합으로 이루어집니다. 답변 방식은 주관식(text)과 객관식(buttons) 중 선택할 수 있습니다.
ㅇ Method : POST
ㅇ URL : http(s)://your_server_url/message
ㅇ Content-Type : application/json; charset=utf-8
ㅇ Response
ㅇ 예제
{ "message":{ "text" : "귀하의 차량이 성공적으로 등록되었습니다. 축하합니다!" } }
위 API 가이드를 바탕으로 플러스 친구 대화창에 버튼(목록)을 만들고 버튼을 눌렀을 때 정해진 답변을 하는 챗봇을 구현하겠습니다.
WordPress Custom Page 생성
워드프레스를 사용해 보시면 알겠지만 워드프레스가 제공하는 기능과 틀이 있기 때문에 규칙을 준수하고 커스터마이징을 해야 하는 제약사항이 있습니다.
왜냐하면 워드프레스에는 Post 템플릿, page 템플릿 등이 어느 정도 정해져서 기능으로 제공하고 있기 때문에 API에서 요구하는 위 예제와 같은 결과를 일반적인 글쓰기 등으로는 구현할 수 없었습니다.
그래서 위 예제와 같은 기능만 하는 php 페이지를 별도로 만들기 위하여 custom page 템플릿를 만들었습니다.
[Custom Page 템플릿 생성 방법]
ㅇ 경로(WordPress) : /www/wp-content/themes/{사용중인 테마}/
해당 경로에 page.php가 이미 존재할 것입니다.
여기에 Custom Page 템플릿이 될 php 파일을 생성 합니다.
템플릿을 2개 생성하는 이유는 각 ~/keyboard, ~/mesage를 호출할 때 역할이 다르기 때문입니다.
Ex) page-custom-keyboard.php
<?php /* Template Name: kakao_keyboard */ ?>
Ex) page-custom-message.php
<?php /* Template Name: kakao_message */ ?>
위와 같이 Custom 템플릿을 만들면 워드프레스에서 페이지를 생성할 때 ‘페이지 속성’에서 내가 만들 템플릿을 선택할 수 있게 됩니다.

이제 위 템플릿을 이용하여 page를 각각 생성해 보겠습니다.
페이지를 생성할 때 아래 빨간색 표시 부분만 유의하면 되겠습니다.
고유주소를 ~/keyboard와 ~/message라고 만들어야 하고 템플릿을 우리가 만든 custom 템플릿으로 각각 선택해 주어야 합니다.
~/keyboard 페이지
~/message 페이지
위와 같이 Custom Page를 만들고 브라우저에서 사이트를 접속해 보면 정상 접속이 되는 것을 확인할 수 있습니다.
전체 코드
[page-custom-keyboard.php]
<?php /* Template Name: kakao_keyboard */ # "type" : "text", # "text" : ["'.iconv("EUC-KR", "UTF-8", "JackerLab 사이트").'", "'.iconv("EUC-KR", "UTF-8", "테스트").'"] echo ' { "type" : "buttons", "buttons" : ["'.iconv("EUC-KR", "UTF-8", "JackerLab 사이트").'", "'.iconv("EUC-KR", "UTF-8", "테스트").'"] }'; ?>
[page-custom-message.php]
<?php /* Template Name: kakao_message */ $data = json_decode(file_get_contents('php://input'), true); $content = $data["content"]; switch($content) { case iconv("EUC-KR", "UTF-8", "JackerLab 사이트"): echo ' { "message": { "text" : "https://jackerlab.com" }, "keyboard": { "type" : "buttons", "buttons" : ["'.iconv("EUC-KR", "UTF-8", "JackerLab 사이트").'", "'.iconv("EUC-KR", "UTF-8", "테스트").'"] } }'; break; case iconv("EUC-KR", "UTF-8", "테스트"): echo ' { "message": { "text" : "'.iconv("EUC-KR", "UTF-8", "개발 중입니다.").'" }, "keyboard": { "type" : "buttons", "buttons" : ["'.iconv("EUC-KR", "UTF-8", "JackerLab 사이트").'", "'.iconv("EUC-KR", "UTF-8", "테스트").'"] } }'; break; default: echo ' { "message": { "text" : "'.iconv("EUC-KR", "UTF-8", "정의되지 않았습니다.").'" }, "keyboard": { "type" : "buttons", "buttons" : ["'.iconv("EUC-KR", "UTF-8", "JackerLab 사이트").'", "'.iconv("EUC-KR", "UTF-8", "테스트").'"] } }'; break; } ?>
테스트
구현한 내용을 카카오톡에서 테스트 해 보겠습니다.
위와 같이 플러스친구에게 대화를 신청하면 대화창이 생기고 하단에 ‘챗봇으로 전환’이라는 버튼이 보입니다.
이 버튼을 클릭하면 아래와 같이 우리가 구현한 버튼을 확인할 수 있습니다.
버튼들을 하나씩 누르면 해당 버튼의 text가 출력 되면서 플러스친구에게 질문을 하고 질문에 따라 코딩된 답변을 자동적으로 출력하게 됩니다.
참고 사항
ㅇ iconv(“EUC-KR”, “UTF-8”, “JackerLab 사이트”) 와 같이 사용한 이유는?
카카오에서 제공하는 API 가이드와 google에서 샘플 코드를 바탕으로 테스트를 하였으나 이상하게도 WordPress의 환경 때문인지 ~/keyboard나 ~/message를 접속해 보면 한글이 깨지고 플러스친구 챗봇이 비정상 동작하는 것을 확인하였습니다.
그래서 hearder에 인코딩을 추가하는 방법도 해보았는데 <script>가 들어가도 챗봇이 비정상 동작하여 현재로서는 위와 같은 코딩을 하게 되었습니다.
ㅇ buttons 외에 구현 가능한 것은?
API 가이드에 보면 type을 buttons이 아닌 text로 하면 위 테스트와 같이 메뉴가 나오는 것이 아니라 챗봇 상태에서도 타이핑을 칠 수 있게 됩니다.
향후 자연어 처리를 구현할 경우 text로 해서 자연어를 이해하고 자연스럽게 질문에 답할 수 있는 챗봇을 구현할 수 있을 것이라고 생각합니다.
마치며
개발자가 아닌 관계로 시행착오도 많고 시간도 많이 소요되는 것 같습니다.
제가 가능한 범위에서 테스트한 내용으로 하나의 방법으로 이해하면 좋을 것 같고 더 좋은 아이디어 및 해결 방안은 알려주시면 개선할 수 있도록 하겠습니다.