오봉이와 함께하는 개발 블로그

Naver A.I Platform - Chatbot 서비스(메세지 직접 입력) 본문

Naver A.I Platform

Naver A.I Platform - Chatbot 서비스(메세지 직접 입력)

오봉봉이 2022. 1. 26. 16:48
728x90

CLOVA Chatbot

  • 챗봇 제작 API 서비스
  • 사용자의 질문 의도를 이해하여 고객 대응 등 다양한 서비스에 활용할 수 있는 Chatbot 제작 지원
  • (1) 도메인 생성
    • Products & Services / CLOVA Chatbot
  • (2) 빌더 실행하기
  • (3) 대화 생성
  • (4) 챗봇 빌드
  • (5) 챗봇 테스트
  • (6) 우측 상단에서 [서비스 배포]
    • [Custom API Gateway와 End-point 연결이필요합니다] / [연동]
    • APIGW 연동 설정
      • [자동 연동] / [확인]
      • [주소 복사]
    • 메신저 연동 설정
      • Secret Key [생성] / [복사]
    • 연동 완료
  • (7) 스프링에서 작업

스프링에서 챗봇 서비스 구현 실습

  • (2) APIRestController 사용
    • 뷰 페이지 폼 입력란에서 질문 메시지 입력하고 응답 메시지 출력
@Service
public class ChatbotService {
//    public static String main(String voiceMessage) {
    public String main(String voiceMessage) {
        String secretKey = "";
        String apiURL = "";

        String chatbotMessage = ""; // 응답 메세지
        try {
            //String apiURL = "https://ex9av8bv0e.apigw.ntruss.com/custom_chatbot/prod/";

            URL url = new URL(apiURL);

            String message = getReqMessage(voiceMessage);
            System.out.println("##" + message);

            String encodeBase64String = makeSignature(message, secretKey);

            HttpURLConnection con = (HttpURLConnection)url.openConnection();
            con.setRequestMethod("POST");
            con.setRequestProperty("Content-Type", "application/json;UTF-8");
            con.setRequestProperty("X-NCP-CHATBOT_SIGNATURE", encodeBase64String);

            // post request
            con.setDoOutput(true);
            DataOutputStream wr = new DataOutputStream(con.getOutputStream());
            wr.write(message.getBytes("UTF-8"));
            wr.flush();
            wr.close();
            int responseCode = con.getResponseCode();

            BufferedReader br;

            if(responseCode==200) { // Normal call
                System.out.println(con.getResponseMessage());

                BufferedReader in = new BufferedReader(
                        new InputStreamReader(
                                con.getInputStream()));
                String decodedString;
                while ((decodedString = in.readLine()) != null) {
                    chatbotMessage = decodedString;
                }
                //chatbotMessage = decodedString;
                in.close();
                // 응답 메세지 출력
                System.out.println(chatbotMessage);
                chatbotMessage = jsonToString(chatbotMessage);
            } else {  // Error occurred
                chatbotMessage = con.getResponseMessage();
            }
        } catch (Exception e) {
            System.out.println(e);
        }
        return chatbotMessage;
    }

    public static String makeSignature(String message, String secretKey) {

        String encodeBase64String = "";

        try {
            byte[] secrete_key_bytes = secretKey.getBytes("UTF-8");

            SecretKeySpec signingKey = new SecretKeySpec(secrete_key_bytes, "HmacSHA256");
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(signingKey);

            byte[] rawHmac = mac.doFinal(message.getBytes("UTF-8"));
//            encodeBase64String = Base64.encodeToString(rawHmac, Base64.NO_WRAP);
            encodeBase64String = Base64.getEncoder().encodeToString(rawHmac);

            return encodeBase64String;

        } catch (Exception e){
            System.out.println(e);
        }

        return encodeBase64String;

    }

    public static String getReqMessage(String voiceMessage) {

        String requestBody = "";

        try {

            JSONObject obj = new JSONObject();

            long timestamp = new Date().getTime();

            System.out.println("##"+timestamp);

            obj.put("version", "v2");
            obj.put("userId", "U47b00b58c90f8e47428af8b7bddc1231heo2");
//=> userId is a unique code for each chat user, not a fixed value, recommend use UUID. use different id for each user could help you to split chat history for users.

            obj.put("timestamp", timestamp);

            JSONObject bubbles_obj = new JSONObject();

            bubbles_obj.put("type", "text");

            JSONObject data_obj = new JSONObject();
            data_obj.put("description", voiceMessage);

            bubbles_obj.put("type", "text");
            bubbles_obj.put("data", data_obj);

            JSONArray bubbles_array = new JSONArray();
            bubbles_array.put(bubbles_obj);

            obj.put("bubbles", bubbles_array);
            obj.put("event", "send");

            requestBody = obj.toString();

        } catch (Exception e){
            System.out.println("## Exception : " + e);
        }
        return requestBody;
    }
    public String jsonToString(String jsonResultStr) {
        String resultText = "";
        // API 호출 결과 받은 JSON 형태 문자열에서 텍스트 추출
        // JSONParser  사용하지 않음
        JSONObject jsonObj = new JSONObject(jsonResultStr);
        JSONArray chatArray = (JSONArray) jsonObj.get("bubbles");
        if(chatArray != null) {
            JSONObject tempObj = (JSONObject) chatArray.get(0);
            JSONObject dataObj = (JSONObject) tempObj.get("data");
            if(dataObj != null) {
//                tempObj = (JSONObject) dataObj.get("description");
                resultText += (String) dataObj.get("description");
            }
        } else {
            System.out.println("없음");
        }
        return resultText;
    }
}
@RequestMapping("/chatbotSend")
    public String chatbotSend(@RequestParam("inputText") String inputText) {
        String msg = "";
        msg = chatbotService.main(inputText);
        return msg;
    }
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
      <title>chatbotForm</title>
    <script src="https://code.jquery.com/jquery-3.6.0.js" integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk=" crossorigin="anonymous"></script>
    <script src="js/chatForm.js"></script>
  </head>
  <body>
    <!--  채팅 -->
    <h3>채팅 입력</h3>
    <form id="chatForm" enctype="multipart/form-data">
      내용 : <input type="text" id="inputText" name="inputText">
      <input type="submit" value="결과 확인">
    </form>
    <br><br>

    <!-- 결과 출력 (텍스트) -->
    <h3>응답 결과</h3>
    <div id="resultDiv"></div>
    <br><br>
  </body>
</html>
$(function () {
    // submit 했을 때 처리
    $('#chatForm').on('submit', function (event) {
        event.preventDefault();
        var formData = new FormData($('#chatForm')[0]);
        $.ajax({
            type : "post",
            enctype : "multipart/form-data",
            url : "chatbotSend",
            data : formData,
            processData : false, // 필수
            contentType : false, // 필수
            success:function (result) {
                $('#resultDiv').text(result);
            },
            error:function (e) {
                alert("오류 발생" + e);
            }
        });
    })
})
728x90
Comments