DB 없이 chatbot 간단하게 만들기
chatbot.php 이름으로 파일 만들기
<?php
// 브라우저나 클라이언트에게 "지금부터 JSON을 UTF-8로 보낼 거야"라고 알려주는 헤더 설정
header('Content-Type: application/json; charset=utf-8');
// 1) JSON 입력 받기
// php://input 은 HTTP 요청의 raw body를 그대로 읽어오는 스트림
// file_get_contents('php://input') 로 body를 읽고, json_decode 로 PHP 배열로 변환
$input = json_decode(file_get_contents('php://input'), true);
// 입력이 없거나(message 필드가 없으면) => 에러 응답
if (!$input || !isset($input['message'])) {
// HTTP 상태 코드 400 (Bad Request)로 설정
http_response_code(400);
// 에러 내용을 JSON으로 반환
echo json_encode(['error' => '잘못된 요청']);
// 여기서 스크립트 종료 (더 이상 아래 코드 실행 안 함)
exit;
}
// 클라이언트가 보낸 message 값을 꺼내서 앞뒤 공백 제거
$userMsg = trim($input['message']);
// 2) 의도 감지 함수
// 사용자가 보낸 텍스트에서 "의도(intent)"를 추측하는 함수
function detect_intent($text) {
// mb_strtolower: 멀티바이트 문자열(한글 포함)을 모두 소문자로 변환
$t = mb_strtolower($text, 'UTF-8');
// '안녕' 이라는 단어가 들어있으면 인사 의도로 판단
if (strpos($t, '안녕') !== false) return 'greeting';
// '고마워' 또는 '감사'가 들어있으면 감사 의도
if (strpos($t, '고마워') !== false || strpos($t, '감사') !== false) return 'thanks';
// '불안' 또는 '스트레스'가 들어있으면 스트레스 관련 의도
if (strpos($t, '불안') !== false || strpos($t, '스트레스') !== false) return 'stress';
// '끝' 또는 '잘 있어' 가 들어있으면 인사 종료(이별) 의도
if (strpos($t, '끝') !== false || strpos($t, '잘 있어') !== false) return 'bye';
// 위에 해당 안 되면 일반적인 대화로 처리
return 'general';
}
// 위에서 만든 함수로 사용자 메시지의 의도를 판별
$intent = detect_intent($userMsg);
// 3) 의도별 답변 생성
// 의도(intent)에 따라 어떤 답변을 줄지 결정하는 함수
function respond($intent) {
// switch문으로 의도 값에 따라 다른 문장 반환
switch ($intent) {
// 인사 의도일 때
case 'greeting':
return "안녕하세요 🙂 지금 어떤 감정이 드나요?";
// 감사 의도일 때
case 'thanks':
return "저도 고마워요. 마음이 조금은 편해졌으면 좋겠어요.";
// 스트레스/불안 관련 의도일 때
case 'stress':
return "스트레스를 느끼고 있군요. 잠깐 천천히 숨을 들이쉬고 내쉬어보는 건 어떨까요?";
// 대화를 끝내려는 의도일 때
case 'bye':
return "좋아요. 여기서 잠시 쉬어가도 괜찮아요.";
// 어떤 의도에도 딱 안 맞을 때 (기본 응답)
default:
return "지금 마음속에서 가장 먼저 떠오르는 생각을 말해줄래요?";
}
}
// 위에서 판별한 intent를 가지고 실제 답변 문장을 얻음
$reply = respond($intent);
// 4) JSON 응답 반환
// 클라이언트에게 reply(답변)와 intent(감지된 의도)를 JSON으로 돌려줌
echo json_encode([
'reply' => $reply, // 챗봇의 답변 문장
'intent' => $intent // 감지된 의도 값 (greeting, thanks, stress, bye, general)
], JSON_UNESCAPED_UNICODE); // 한글이 \uXXXX로 깨지지 않도록 그대로 출력 옵션
?>
chatbot_main.php 파일 만들기
<!doctype html>
<html lang="ko">
<head>
<meta charset="utf-8">
<title>상담 챗봇</title>
</head>
<body>
<h1>상담 챗봇</h1>
<div id="log"></div>
<input id="msg" placeholder="메시지를 입력하세요" />
<button id="send">보내기</button>
<script>
const log = document.getElementById('log');
const msg = document.getElementById('msg');
document.getElementById('send').onclick = async () => {
const text = msg.value.trim();
if (!text) return;
log.innerHTML += `<p><b>나:</b> ${text}</p>`;
const res = await fetch('chatbot.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ message: text })
});
const data = await res.json();
log.innerHTML += `<p><b>봇:</b> ${data.reply}</p>`;
msg.value = '';
};
</script>
</body>
</html>
'PHP Tip' 카테고리의 다른 글
| MySQL Host, User, Password, DB 정보에 오류가 있습니다. (0) | 2025.12.27 |
|---|---|
| 외부사이트 가져오기 curl 기본 설명 파싱(parsing) (0) | 2025.12.20 |
| 릴 게임 · Lucky Reels source (0) | 2025.12.19 |
| /* 페이징 스타일 복원 + 반응형 */ (0) | 2025.12.18 |
| 오버레이가 있는 반응형 이미지 갤러리(그누보드) (0) | 2025.12.17 |