n봇 개발 이야기 - [2일차:카카오 API 뜯어보기]
대한민국에서 가장 많은 사람들이 사용하는 메신저 플랫폼은 무엇일까요? 바로 카카오톡입니다. 요즘 세대에서는 페이스북 메신저를 선호하는 경향도 많이 보이지만, 페이스북을 하지 않는 사람이 존재하는 상황에서는 카카오톡이 국내에선 아직까지는 페이스북 메신저를 압도하고 있다고 할 수 있습니다.
n봇을 개발하면서 느낀 점은, 대화형 봇의 최대 장점인 추가적인 애플리케이션 설치가 필요하지 않다는 것을 최대한 살릴 수 있는 메신저 플랫폼을 선택하는 것이 봇의 보급에 가장 중요하다는 것입니다. 그러한 이유로 n봇의 메신저 플랫폼으로 카카오톡을 선정하게 되었고, 카카오톡에서 제공하는 옐로아이디 기능을 이용해서 봇을 만들었습니다.(2017년 5월 24일 옐로아이디와 플러스친구가 통합됨) 카카오가 제공하는 API에 대해서 정확히 일아야 구현할 수 있는 기능을 알고 동작 원리를 정하겠죠? 그래서 이번 시간에는 플러스친구 API에 대해서 자세히 알아보겠습니다.
플러스친구 API의 공식문서는 링크를 타고 들어가면 있습니다. 카카오톡의 자동응답 API는 Node.js의 http(s) restful api를 사용합니다.
*Restful API란?(추후 링크 올릴 예정)
첫 번째로 알아볼 API는 Home keyboard API입니다. Home keyboard API는 스마트응답 기능을 실행하기 위해 가장 먼저 필요한 기능입니다. 공식 문서에 따르면 "이용자가 최초로 채팅방에 들어올 때 기본으로 키보드 영역에 표시될 자동응답 명령어의 목록을 호출하는 API" 라고 합니다. 자세한 설명을 위해 공식 문서를 인용해 보겠습니다.
- Method : GET
- URL : http(s)://:your_server_url/keyboard
- Content-Type : application/json; charset=utf-8
- Response: 키보드 영역에 표현될 버튼에 대한 정보. 생략시 text 타입이 선택된다.
- 예제: { "type" : "buttons", "buttons" : ["선택 1", "선택 2", "선택 3"] }
그럼 이 조건을 만족시키는 서버를 만들려면 코드를 어떻게 작성해야 할까요? Node.js의 express 모듈을 이용해서 작성해 보겠습니다.
Express 모듈의 사용법에 대해서는 추후 포스팅을 할 예정이므로 지금 상태에서는 '저렇게 하면 응답을 제공할 수 있다'라는 정도로만 알아두시면 됩니다.
var express = require('express');
var http = require('http');
var path = require('path');
var bodyParser = require('body-parser');
var router = require('router');
var app = express();
app.use(bodyParser.json());
app.use(router());
app.get('/keyboard', function(req, res){
var menu = {type: 'buttons', buttons: ["시작하기"]};
res.set({'content-type': 'application/json'}).send(JSON.stringify(menu));
});
http.createServer(app).listen(포트번호, function(){
console.log('Express 서버가 ..번 포트에서 시작함');
});
res.set()을 이용해서 menu변수에 JSON 형식으로 저장한 변수를 응답으로 줍니다.
코드를 실행하고 봇과 1:1 채팅을 시작하면 다음과 같은 창을 볼 수 있습니다.
두 번째로 알아볼 API는 메시지 수신/응답 API입니다. 자세한 설명을 위해 다시 공식 문서를 인용해 보겠습니다.
- 사용자가 선택한 명령어를 파트너사 서버로 전달하는 API입니다.
- 자동응답 명령어에 대한 답변은 응답 메시지(Message)와 응답 메시지에 따른 키보드 영역의 답변 방식(Keyboard)의 조합으로 이루어집니다. 답변 방식은 주관식(text)과 객관식(buttons) 중 선택할 수 있습니다.
- 자동응답을 통해 친구에게 미디어 타입(사진/동영상/오디오)을 받고자 하는 경우 주관식 키보드(text)를 선택하세요. 메시지를 통해 <‘+’버튼을 눌러 미디어를 전송하세요>와 같이 안내하는 것이 필요 할 수 있습니다.
- 유저가 보낸 미디어 타입의 카카오 서버에서의 보존기간은 아래와 같습니다.
- 음성파일 : 20일
- 이미지파일 : 20일
- 비디오 : 20일
- 미디어 파일의 보존기간은 서버의 상황에 의하여 변동 될 수 있습니다.
공식 문서에 따르면 봇이 받을 수 있는 메시지의 종류는 음성파일, 이미지파일, 비디오, 텍스트의 4종류라고 합니다. 그러나 n봇의 특성상 미디어 파일을 수신할 필요가 없으므로 엿기서는 텍스트만 알아보도록 하겠습니다. 이용자가 보내는 메시지는 3가지 형태의 값으로 POST 방식을 이용해서 응답 서버 URL/message로 넘어오게 됩니다. 3가지 값은 각각 사용자를 구별하는 user_key, 메시지 타입을 결정하는 type, 메시지 내용이 넘어오는 contents입니다. 공식 문서의 예제를 보시죠.
curl -XPOST 'https://:your_server_url/message' -d '{
"user_key": "encryptedUserKey",
"type": "text",
"content": "차량번호등록"
}'
"user_key": "encryptedUserKey",
"type": "text",
"content": "차량번호등록"
}'
첫 번째 예제는 text의 형식으로 "차량번호등록"이라는 메시지가 전송된 경우입니다. 그러면 이런 메시지를 어떻게 받아서 분석할까요? 메시지를 받는 코드를 이전의 코드에 이어서 작성해 보겠습니다.
app.use(bodyParser.json()); //json형식을 받음
app.post('/message', function(req, res){
var _obj = {
user_key: req.body.user_key, //user_key
type: req.body.type, //메시지 타입
content: req.body.content //메시지 내용
};
});
굉장히 간단하죠? 이런 챗봇을 개발할 때는 메시지 데이터를 받아오거나 메시지를 보내는 부분은 어렵지 않습니다. 진짜 어려운 부분은 바로 메시지를 받아서 이용자에게 적절한 반응을 보이는 알고리즘을 작성하는 부분이죠. 그러면 일단 사용자에게 답변을 보내는 방식을 설명하겠습니다. Home Keyboard API를 작성할 때와 동일하게 JSON형식을 보내면 됩니다.
카카오톡은 message와 keyboard 값을 요구하는데, message 값에는 text, photo, message_button을 넣어 보낼 수 있고, keyboard 값에는 Home keyboard API와 동일한 형태를 보낼 수 있습니다. 예제를 보시죠.
{ "message":{ "text" : "귀하의 차량이 성공적으로 등록되었습니다. 축하합니다!" } }
위와 같이 keyboard 값을 생략한 경우는 기본 키보드가 보내집니다.
{
"message": {
"text": "귀하의 차량이 성공적으로 등록되었습니다. 축하합니다!",
"photo": { "url": "https://photo.src", "width": 640, "height": 480 },
"message_button": { "label": "주유 쿠폰받기", "url": "https://coupon/url" }
},
"keyboard": { "type": "buttons", "buttons": [ "처음으로", "다시 등록하기", "취소하기" ] }
}
}
message_button은 말풍선 밑에 표시되어 클릭할 수 있는 버튼을 만드는 것입니다.
그럼 메시지를 보내는 부분의 코드를 전의 코드에 이어서 작성해 보도록 하겠습니다. 이전 코드 app.post 안에 작성하시면 됩니다.
그럼 메시지를 보내는 부분의 코드를 전의 코드에 이어서 작성해 보도록 하겠습니다. 이전 코드 app.post 안에 작성하시면 됩니다.
이 외에도 친구 추가/차단 API, 채팅방 나가기 API등 다양한 API가 있지만 n봇에 필요한 기능은 이정도이므로 여기까지만 설명을 하도록 하겠습니다. 더 자세한 정보를 원하시면 공식 문서를 참고해 주세요.
다음 시간에는 n봇의 동작 원리와 응답에 대한 반응 구상에 관한 주제로 찾아오겠습니다. 질문이나 이해가 잘 안되는 부분이 있으면 댓글로 남겨주세요!



댓글
댓글 쓰기