유일하게 하는 대외활동이 드디어 개발을 시작했다.
어떻게 하다 팀장을 맡게 되어서 어찌된게 문서 작업을 더 많이 하는 것 같지만 ㅠ_________ㅠ 피가되고 살이되겠죠 ,,
챗봇을 구축하고, 지하철 공공 데이터를 받아와 전달해주려고 한다.
우선 챗봇 레퍼런스를 확인해보자.
여기서 자세한 레퍼런스를 볼 수 있다 -> https://github.com/plusfriend/auto_reply
당장 필요한 경로는 /keyboard , /message 가 있다. 추가로 /delete도 있지만 일단 생략한다.
/keyboard 는 사용자가 플러스친구 채팅방을 처음 들어갔을 때 보이는 화면을 설정한다.
- Method : GET
- URL : http(s)://:your_server_url/keyboard
- Content-Type : application/json; charset=utf-8
- Response: Keyboard
필드명 | 타입 | 필수여부 | 설명 |
---|---|---|---|
type | String | Required | buttons: 객관식 응답의 목록을 구성할 수 있음 text: 주관식 응답을 입력받을 수 있음 |
buttons | Array[String] | Optional | 객관식 응답 내용의 목록 (최대 100개) |
{ "type" : "buttons", "buttons" : ["선택 1", "선택 2", "선택 3"] }
keyboard는 간단하다.
필드는 type, buttons로 구성되어있고 type은 buttons또는 text,
type이 buttons일 경우 그 버튼 리스트는 buttons 필드에 보관한다.
text로 설정하면 그냥 바로 채팅방화면이 뜨고, buttons를 선택하면 선택할 수 있는 버튼 리스트가 나온다.
나는 일단 간단히 구축만 한거니까 text로 해주었고 코드는 다음과 같다.
KeyboardVO.java
import lombok.Data; @Data public class KeyboardVO { private String type; private String[] buttons; }
* lombok이 없다면 알아서 getter, setter를 생성하도록한다. 스프링을 쓴다면 lombox을 강추하지만 ,,
Controller.java
@RequestMapping(value = "/keyboard", method = RequestMethod.GET, produces="application/json; charset=UTF-8") public KeyboardVO keyboard() { KeyboardVO keyboard=new KeyboardVO(); keyboard.setType("text"); return keyboard; }
이러면 첫 화면 세팅은 끝났다.
만약 버튼을 출력하고 싶다면
setType("buttons")를 하고,
setButtons(buttonList)를 하면 될 것이다.
다음 /message 는 사용자가 채팅방에 무언가를 보냈을 때 하는 반응을 설정한다.
- Method : POST
- URL : http(s)://:your_server_url/message
- Content-Type : application/json; charset=utf-8
- Parameters
필드명 | 타입 | 필수여부 | 설명 |
---|---|---|---|
user_key | String | Required | 메시지를 발송한 유저 식별 키 |
type | String | Required | text, photo |
content | String | Required | 자동응답 명령어의 메시지 텍스트 혹은 미디어 파일 uri |
type은 text아니면 Photo이다. 아직 사진을 처리하긴 무리가 있을 것 같아 여기 예외처리를 걸어줄 계획이다.
content는 말그대로 사용자가 보내는 내용이 된다. 역시나 사진 url이 들어올 일은 없을 것이다.
Response
필드명 | 타입 | 필수여부 | 설명 |
---|---|---|---|
message | Message | Required | 자동응답 명령어에 대한 응답 메시지의 내용. 6.2에서 상세 기술 |
keyboard | Keyboard | Optional | 키보드 영역에 표현될 명령어 버튼에 대한 정보. 생략시 text 타입(주관식 답변 키보드)이 선택된다. 6.1에서 상세 기술 |
Keyboard는 KeyboardVO가 될것이고, Message는 뭔가 살펴보니
필드명 | 타입 | 필수여부 | 설명 |
---|---|---|---|
text | String | Optional | 사용자에게 발송될 메시지 텍스트(최대 1000자) |
photo | Photo | Optional | 말풍선에 들어갈 이미지 정보. 1장 제한, JPEG/PNG 포맷. 6.3에서 상세 기술 |
message_button | MessageButton | Optional | 말풍선에 붙는 링크버튼 정보. 6.2.1에서 상세 기술 |
이거다.
세개다 optional이고, 여기서는 text만 쓸 것이니까 text만 만들어두겠다.
MessageVO.java
import lombok.Data; @Data public class MessageVO { //사용자에게 발송될 텍스트("최대 100자") private String text; }
RequstMessageVO.java
import lombok.Data; @Data public class RequestMessageVO { //메시지를 발송한 유저 식별 private String user_key; //text, photo private String type; //자동 응답 명령어의 메시지 또는 미디어 파일 url private String content; }
ResponseMessagVO.java
import lombok.Data; @Data public class ResponseMessageVO { private MessageVO message; private KeyboardVO keyboard; }
Controller.java
@RequestMapping(value = "/message", method = RequestMethod.POST, produces="application/json; charset=UTF-8") @ResponseBody public ResponseMessageVO message(@RequestBody RequestMessageVO vo) throws JsonParseException, JsonMappingException, IOException { ResponseMessageVO res_vo=new ResponseMessageVO(); MessageVO mes_vo=new MessageVO(); KeyboardVO keyboard=new KeyboardVO(); keyboard.setType("text"); res_vo.setKeyboard(keyboard); if(!vo.getType().equals("text")) { //텍스트 타입만 허용할 것이기 때문에 mes_vo.setText("텍스트 타입만 허용하고 있습니다"); res_vo.setMessage(mes_vo); return res_vo; mes_vo.setText(vo.getContent()); res_vo.setMessage(mes_vo); return res_vo;
이렇게 하면 간단한 에코 챗봇이 구현된다.
서버에 배포하고 해당 주소를 등록하면 정상적으로 서비스 될 것이다.
프로젝트를 좀 더 진행하고, 챗봇으 ㅣ다른 기능들을 만져봐야겠다.