카카오 오픈빌더에서 제공하는 플랫폼을 활용해 

카카오톡에서 사용자가 발화를 입력하면, 해당 내용이 웹서버로 전달되고 발화내용에 따른 로직처리를 한 후

응답내용을 사용자게에 전달 할 수 있습니다.

'스킬' 이라는 기능을 활용해서 구현이 가능합니다.

 

로컬 웹서버 생성


스프링부트로 아래와 같이 파라미터를 전달 받을 수 있는 컨트롤러를 하나 만들어 줍니다.

저의 경우 아래 url을 통해 카카오톡에서 전달된 발화내용을 받아 처리하도록 하겠습니다.

 

http://localhost:8380/kkoChat/v1

@RestController
public class KKORestAPI {

    //카카오톡 오픈빌더로 리턴할 스킬 API
    @RequestMapping(value = "/kkoChat/v1" , method= {RequestMethod.POST , RequestMethod.GET },headers = {"Accept=application/json"})
    public String callAPI(@RequestBody Map<String, Object> params, HttpServletRequest request, HttpServletResponse response) {

        try{
            ObjectMapper mapper = new ObjectMapper();
            String jsonInString = mapper.writeValueAsString(params);
            System.out.println(jsonInString);
            int x = 0;
        }catch (Exception e){

        }
        return "index";
    }

}

스프링부트 초기셋팅이 필요하신 경우 아래 링크를 확인해주세요.

https://vmpo.tistory.com/7

 

intellij SpringBoot(인텔리제이 스프링부트) 시작하기 - hello world 브라우저에 출력하기(gradle)

intellij SpringBoot(스프링부트) hello world 출력하기 @intellij 기준으로 진행하겠습니다 @Gradle 프로젝트로 진행하는 이유는 빌드 속도도 maven보다 빠르고 import 라이브러리도 한눈에 볼 수 있어 개발시에..

vmpo.tistory.com

 

 

스킬등록


카카오 오픈빌더 관리자 페이지에 접속합니다.

스킬 탭으로 이동합니다. 스킬을 하나 새로 등록해줍니다.

방금 생성했던 URL을 URL탭에 등록해줍니다.

그리고 설명 및 이름을 설정해주고 저장을 해줍니다.

 

폴백블록 등록


폴백블록은 카카오 오픈빌더 챗봇에 설정되지 않은 발화내용이 전달 되었을때 처리하는 블록입니다.

아무것도 등록을 하지 않았다면 모든 발화내용이 폴백등록으로 넘어오게 됩니다.

 다른 블록들을 많이 설정하지 않았기 때문에 저의 경우 폴백블록을 통해서 발화를 받도록 설정하겠습니다.

아래와 같이 아까 설정한 스킬이름을 선택해주고, 봇응답또한 스킬데이터 사용으로 설정해줍니다.

(저의 로컬 웹서버로 요청을 받고 응답을 전달하도록 하기 위함입니다.)

 

 

카카오톡에서 호출테스트 / 요청 규격확인하기


카카오 오픈빌더 관리자페이지에서 봇테스트를 할 수 있습니다.

봇테스트를 눌러 아무 내용이나 입력해봅니다. 

 

아직 응답 설정을 했기때문에 아무내용도 응답하지 않을 것입니다.

그럼 저의 로컬 웹서버에서 어떤 요청이 왔는지 로그를 확인해보겠습니다.

소스에서 요청 내용을 jsonstring으로 변환해 콘솔에 찍었습니다.

아래와 같은 응답이 전달되었네요.

정렬해서 확인해보겠습니다.

발화를 하나 입력했을때 아래와 같은 JSON요청이 오는 것을 확인 할 수 있습니다.

저는 봇테스트에서 "ㅇㅇ"을 입력했었는데요.

아래 요청 json을 보시면, userRequset -> utterance 키에 value로 넘어 오는 것을 알 수 있습니다.

저 utterance를 확인해 특정 로직을 처리하여 응답을 전달할 수 있겠습니다.

{
  "intent":{
    "id":"5d9f410e8192ac00011571d3",
    "name":"폴백 블록",
    "extra":{
      "reason":{
        "code":1,
        "message":"OK"
      }
    }
  },
  "userRequest":{
    "timezone":"Asia/Seoul",
    "params":{
      "surface":"BuilderBotTest",
      "ignoreMe":"true"
    },
    "block":{
      "id":"5d9f410e8192ac00011571d3",
      "name":"폴백 블록"
    },
    "utterance":"ㅇㅇ\n",
    "lang":"kr",
    "user":{
      "id":"8c6bfac588eb225d1f6c4f2b25d4d315c0dc1ce3d15f37175bd688140e29cfdf55",
      "type":"botUserKey",
      "properties":{
        "botUserKey":"8c6bfac588eb225d1f6c4f2b25d4d315c0dc1ce3d15f37175bd688140e29cfdf55"
      }
    }
  },
  "contexts":[
  ],
  "bot":{
    "id":"5d9f410e8192ac00011571cf!",
    "name":"코딩인텐션"
  },
  "action":{
    "name":"스킬테스트",
    "clientExtra":null,
    "params":{
    },
    "id":"5dc167e7ffa7480001d85f47",
    "detailParams":{
    }
  }
}

 

응답 규격 만들기


자 이제 응답을 어떤식으로 해야 될지만 알면 요청 발화를 받아 응답을 처리 할 수 있습니다.

응답샘플은 카카오 오픈빌더 도움말에서 확인 할 수 있는데요.

 

가이드를 확인해보면 아래와같이 json string을 만들어 리턴하면 챗봇 응답을 할 수 있는 것을 알 수 있습니다.

그럼 동일한 규격으로 json string을 만들어 보겠습니다.

 

리턴값 파싱을 위해 아래와 같이 List와 HashMap을 활용해 json규격을 만들었습니다.

RestController의 경우 리턴타입을 HashMap으로 설정하면 응답시에 자동으로 json으로 파싱처리해줍니다.

해당 규격에 맞는 Class를 생성해 해당 클래스 타입으로 리턴을 해도 json으로 자동 파싱이 됩니다.

json규격을 만드는 법은 너무도 다양하니 원하는 방법을 사용하시면 됩니다.

@RestController
public class KKORestAPI {

    //카카오톡 오픈빌더로 리턴할 스킬 API
    @RequestMapping(value = "/kkoChat/v1" , method= {RequestMethod.POST , RequestMethod.GET },headers = {"Accept=application/json"})
    public HashMap<String,Object> callAPI(@RequestBody Map<String, Object> params, HttpServletRequest request, HttpServletResponse response) {

        HashMap<String, Object> resultJson = new HashMap<>();

        try{

            ObjectMapper mapper = new ObjectMapper();
            String jsonInString = mapper.writeValueAsString(params);
            System.out.println(jsonInString);

            List<HashMap<String,Object>> outputs = new ArrayList<>();
            HashMap<String,Object> template = new HashMap<>();
            HashMap<String, Object> simpleText = new HashMap<>();
            HashMap<String, Object> text = new HashMap<>();

            text.put("text","코딩32 발화리턴입니다.");
            simpleText.put("simpleText",text);
            outputs.add(simpleText);

            template.put("outputs",outputs);

            resultJson.put("version","2.0");
            resultJson.put("template",template);

        }catch (Exception e){

        }

        return resultJson;
    }

}

 

 

그럼 빌드를 새로 하고, 봇테스트에서 아무 발화나 입력해보겠습니다.

현재, 특정 발화에 대한 로직처리는 되어있지 않기 때문에 아무 발화에도 응답이 "코딩32 발화리턴입니다"로 전달될 것입니다.

 

아래와 같이 리턴이 응답이 전달되는 것을 확인 할 수 있습니다.

응답규격과 동일하게 리턴하셔야 봇테스트에서 확인이 가능하십니다.

 

특정 발화에 대한 특정 로직 처리하기


자 그럼 이제 특정 발화를 하드코딩해서 특정 발화가 입력했을때 특정 응답을 리턴해보도록 하겠습니다.

 

발화내용을 case문으로 하드코딩해서 응답을 매핑해주었습니다.

뭐야, ㅋㅋ가 들어올때 아래와 같이 응답을 설정해줍니다.

@RestController
public class KKORestAPI {

    //카카오톡 오픈빌더로 리턴할 스킬 API
    @RequestMapping(value = "/kkoChat/v1" , method= {RequestMethod.POST , RequestMethod.GET },headers = {"Accept=application/json"})
    public HashMap<String,Object> callAPI(@RequestBody Map<String, Object> params, HttpServletRequest request, HttpServletResponse response) {

        HashMap<String, Object> resultJson = new HashMap<>();

        try{

            ObjectMapper mapper = new ObjectMapper();
            String jsonInString = mapper.writeValueAsString(params);
            System.out.println(jsonInString);

            /* 발화 처리 부분 * */
            HashMap<String,Object> userRequest =  (HashMap<String,Object>)params.get("userRequest");
            String utter = userRequest.get("utterance").toString().replace("\n","");

            String rtnStr = "";
            switch (utter){
                case "뭐야" : rtnStr = "코딩32 챗봇입니다.";
                    break;
                case "ㅋㅋ" : rtnStr = "저도 기분이 좋네요";
                    break;
                default: rtnStr = "안녕하세요 코딩 32 챗봇입니다.";
            }
            /* 발화 처리 끝*/

            List<HashMap<String,Object>> outputs = new ArrayList<>();
            HashMap<String,Object> template = new HashMap<>();
            HashMap<String, Object> simpleText = new HashMap<>();
            HashMap<String, Object> text = new HashMap<>();

            text.put("text",rtnStr);
            simpleText.put("simpleText",text);
            outputs.add(simpleText);

            template.put("outputs",outputs);

            resultJson.put("version","2.0");
            resultJson.put("template",template);

        }catch (Exception e){

        }

        return resultJson;
    }

}

 

봇테스트에서도 확인을 해봅니다.

응답이 정상적으로 리턴되는 것을 알 수 있습니다.

 

카카오톡에서 테스트해보기


여기까지 일단 해보고 배포를 한 번 해줍니다.

 

실제 카카오톡에서도 아래와 같이 발화별로 응답이 되는 것을 알 수 있습니다.

 

지금까지 단순 발화를 서버에서 요청받고 응답하는 기능을 구현해 보았습니다.

다음 포스팅에서는 순서대로 아래와 같이 다양한 응답을 리턴해보겠습니다.

 

LIST
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기