오봉이와 함께하는 개발 블로그
Naver A.I Platform - Chatbot 서비스(메세지 직접 입력) 본문
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
'Naver A.I Platform' 카테고리의 다른 글
Naver A.I Platform - Chatbot 서비스(음성 메세지 기능 추가) (0) | 2022.01.26 |
---|---|
Naver A.I Platform - Chatbot 서비스(채팅창 작성) (0) | 2022.01.26 |
Naver A.I Platform - Chatbot 서비스 (0) | 2022.01.26 |
Naver A.I Platform - Text To Speech(TTS) (0) | 2022.01.25 |
Naver A.I Platform - CLOVA Speech Recognition (CSR : 음성 인식) (0) | 2022.01.25 |
Comments