안녕하세요.
이번 포스팅에서는 카카오톡 자동응답API를 통하여
PHP언어로 챗봇을 만드는 방법에 대해 소개해드리겠습니다.
우선 챗봇과 그 원리에 대해 설명해드리겠습니다.
1. 챗봇이란?
챗봇은 ChatBot으로, 여러분들이 말로 사용하시는 시리 또는 빅스비를 채팅으로 질문하면
채팅으로 답변한다고 생각하시면 간단합니다.
현재 제가 운영하고있는 카카오톡 챗봇입니다.
이런식으로 급식이나 시간표, 날씨 등을 알려줍니다
2. 카카오톡 챗봇의 원리
카카오톡 챗봇의 경우,
카카오톡 자동응답API를 통하여 사용자가 입력한 input값에 대해 json으로 답변을 하는 원리입니다.
keyboard -> input -> message
버튼을 선택하면, 해당 버튼의 이름으로 값을 전송하고 message에서 input값을 읽어 행동을 취합니다.
그렇기에 우리는 처음 방에 접속하면 나오는 keyboard와 그 후 메시지를 처리할 message 두개만 구현하면 됩니다.
3. 플러스친구 가입하기
우선 카카오톡 플러스친구에 가입되어 있어야합니다.
아래의 사이트에서 카카오톡 아이디로 플러스친구에 가입합니다.
플러스친구 만들기를 클릭하여 카카오톡 아이디로 가입하실 수 있습니다.
가입후 로그인을 하시면 현재 내 플러스친구의 목록이 나오게 되는데,
이제 새 플러스 친구 만들기를 클릭하여 새로운 친구를 만듭니다.
아래 빈칸의 내용을 모두 입력후 확인 버튼을 클릭하면 개설이 완료됩니다.
이전에는 옐로우아이디로 이용을 해야했기에 시간이 몇일 걸린걸로 기억하는데,
이제는 바로 생성됩니다!
이런식으로 화면이 나오게 됩니다.
이제 좌측을 보시면 메뉴들이 있는데요.
좌측 메뉴에서 스마트채팅을 클릭합니다.
여기서 API형 아래에 있는 시작하기 옆에 있는 연필모양 아이콘을 클릭합니다.
이제 모든 준비는 끝났습니다.
본격적으로 코딩을 시작해봅시다.
4. keyboard 구현 - 방접속시 나오는 버튼들
위에서 설명한 것 처럼, 카카오톡 챗봇은 방에 들어가면 먼저 keyboard가 표시됩니다.
이때, keyboard가 나오는 조건은, 처음 또는 마지막 채팅 후 10분이 지나면
채팅 기록이 expire 처리가 되고 keyboard가 호출이 됩니다.
우선 방 접속시 [메뉴1] [메뉴2] [메뉴3] 버튼이 나오도록 구현을 해봅시다.
당연히 keyboard.php를 생성후 기본적인 php코드를 작성합니다.
1 2 3 | <?php ?> | cs |
먼저 type을 buttons로 지정해줍니다.
다양한 방식이 있겠지만, 저는 echo EOD가 아닌 그냥 echo를 이용하도록 하겠습니다.
1 2 3 4 5 6 | <?php echo ' { "type": "buttons" }'; ?> | cs |
type을 buttons로 지정하였으니, 이제 어떤 버튼들이 나올지 버튼을 추가해줍니다.
1 2 3 4 5 6 7 | <?php echo ' { "type": "buttons", "buttons": ["메뉴1", "메뉴2", "메뉴3"] }'; ?> | cs |
이렇게 되면, 방을 처음 접속하면 메뉴1, 메뉴2, 메뉴3이 보여질 것 입니다.
이제 해당 버튼을 누르면 어떠한 처리가 될지 message를 만들어줍시다.
5. message 구현 - 핵심 코드
이제 버튼도 구현되었으니, 선택시 나올 내용을 구현해봅시다
먼저 keyboard에서 입력받은 값을 받아와봅시다.
data변수에 input값을 받아온후 json_decode를 통해 풀어줍니다.
여기서 받아오는 값은 user_key, type, content입니다.
1 2 3 | <?php $data = json_decode(file_get_contents('php://input'), true); ?> | cs |
그리고 content변수에 받아온 data의 content값을 저장합니다.
이제 content변수에는 사용자가 입력 또는 선택한 버튼의 값이 저장됩니다.
1 2 3 4 | <?php $data = json_decode(file_get_contents('php://input'), true); $content = $data["content"]; ?> | cs |
content에 사용자가 입력한 값이 있다면 이제 남은일은 뻔하겠죠?
값에 따라 액션을 취해주기만 하면 끝입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php $data = json_decode(file_get_contents('php://input'), true); $content = $data["content"]; if($content == "메뉴1") echo ' { "message": { "text": "메뉴1을 선택하셨습니다." } }'; ?> | cs |
그러나 이렇게 하면 다시 보여줄 버튼들이 없기에 메뉴1을 선택하면 '메뉴1을 선택하셨습니다.' 가 나오고 버튼은 나오지 않습니다.
물론 버튼이 나오지않을 상황이라면 굳이 추가를 안하셔도 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php $data = json_decode(file_get_contents('php://input'), true); $content = $data["content"]; if($content == "메뉴1") echo ' { "message": { "text": "메뉴1을 선택하셨습니다." }, "keyboard": { "type": "buttons", "buttons": ["메뉴1", "메뉴2", "메뉴3"] } }'; ?> | cs |
이제 나머지 상황에 따라 행동을 추가해주시면 됩니다.
그런데 굳이 if문으로 번거롭게 해야할 필요가 없겠죠?
switch를 이용하여 나머지 값들도 처리해줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | <?php $data = json_decode(file_get_contents('php://input'), true); $content = $data["content"]; switch($content) { case "메뉴1": echo ' { "message": { "text": "메뉴1을 선택하셨습니다." }, "keyboard": { "type": "buttons", "buttons": ["메뉴1", "메뉴2", "메뉴3"] } }'; break; case "메뉴2": echo ' { "message": { "text": "메뉴2를 선택하셨습니다." }, "keyboard": { "type": "buttons", "buttons": ["메뉴1", "메뉴2", "메뉴3"] } }'; break; case "메뉴3": echo ' { "message": { "text": "메뉴3을 선택하셨습니다." }, "keyboard": { "type": "buttons", "buttons": ["메뉴1", "메뉴2", "메뉴3"] } }'; break; } ?> | cs |
지금은 버튼이 3개 밖에 없기에 문제가 없지만,
나중에 잘못된 값이 입력받아지는 경우를 대비하여
예외처리만 해주면 끝입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | <?php $data = json_decode(file_get_contents('php://input'), true); $content = $data["content"]; switch($content) { case "메뉴1": echo ' { "message": { "text": "메뉴1을 선택하셨습니다." }, "keyboard": { "type": "buttons", "buttons": ["메뉴1", "메뉴2", "메뉴3"] } }'; break; case "메뉴2": echo ' { "message": { "text": "메뉴2를 선택하셨습니다." }, "keyboard": { "type": "buttons", "buttons": ["메뉴1", "메뉴2", "메뉴3"] } }'; break; case "메뉴3": echo ' { "message": { "text": "메뉴3을 선택하셨습니다." }, "keyboard": { "type": "buttons", "buttons": ["메뉴1", "메뉴2", "메뉴3"] } }'; break; default: echo ' { "message": { "text": "잘못된 벨류입니다." }, "keyboard": { "type": "buttons", "buttons": ["메뉴1", "메뉴2", "메뉴3"] } }'; break; } ?> | cs |
이제 keyboard와 message 구현이 끝났습니다.
마지막으로 카카오톡 챗봇에서 보내지는 값을 서버에서 읽을 수 있도록 .htaccess파일을 수정해주어야 합니다.
6. .htaccess 구현 - 확장 구분 없애기
이것 때문에 제가 16년도에 챗봇 개발을 실패하고 1년동안 진척이 없게 되었습니다.
제가 정말 수백번 message.php와 keyboard.php를 지우고 만들고 지우고 만들고를 반복했었죠...
기본적으로 카카오톡 챗봇은 keyboard와 message를 호출하는데, 이때 .php 확장자 없이 호출을 합니다.
그러나 우리는 keyboard.php와 message.php로 파일을 만들었기에 당연히 카카오톡에서는 error가 발생하게 됩니다.
이를 해결하기위해 .htaccess를 이용하여 확장자 구분을 없애도록 처리를 해줍니다.
1 | Options +Multiviews | cs |
2018. 05. 25
위의 코드가 안되시는 분들이 계시더군요.
만약 http://도메인/챗봇 소스 경로/keyboard.php로 접속은 되지만,
keyboard로는 접속이 안되신다면 아래의 소스코드를 입력해보세요!
1 | RewriteEngine on
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ /$1.php [NC,L] | cs |
이제 모든 작업이 끝났습니다.
서버에 업로드만 하면 우리의 멋진 챗봇을 볼 수 있게 됩니다!
7. 서버 업로드
이제 여러분들한테는 총 3가지의 파일이 있습니다.
확장자 구분을 없애게 해줄 .htaccess,
방에 접속시 버튼을 보여주게할 keyboard.php,
사용자가 입력한 값에 따라 처리를 할 message.php
이제 위 3개의 파일을 한 디렉터리에 모두 넣으시면 됩니다.
이 부분은 굳이 스크린샷이 필요하지 않을 것이라 예상됩니다.
그냥 서버에 업로드만 하면 되니까요!
8. 플러스친구 연동
이제 아까 작업하던 플러스친구 관리자센터로 돌아옵니다.
그리고 아래의 빈칸을 모두 채워줍니다.
저는 그냥 HolyKnight으로 모두 채웠습니다.
그다음 API테스트를 클릭하면 저런식으로 자신이 추가한 keyboard.php의 내용이 json으로 보여지면 성공입니다.
만약 오류가 발생한다면 keyboard.php의 코드를 다시 한번 확인하시거나 .htaccess파일을 확인해보시면 됩니다.
정상적으로 되었다면 API형 저장하기를 클릭합니다.
이제 스마트채팅 홈에서 시작하기를 클릭하면
요로케 창이 뜨는데, 확인을 클릭해줍니다
자 이제 끝났습니다.
카카오톡에서 처음에 만들때 입력한 아이디를 검색해보세요
9. 결과
축하드립니다!
이제 여러분들은 여러분들만의 챗봇을 만드셨습니다!
한번 카카오톡에서 확인해볼까요?
저는 아예 테스트 개발전용으로 하나 만들었습니다
저기 나오는 발급 가능 쿠폰은 이전에 제가 만들어둔 거라 무시하시면 됩니다.
친구추가 후 1:1 채팅을 해보겠습니다.
와우, 멋진 메뉴들이 보이네요!
메뉴1을 클릭해보겠습니다
오 메뉴1을 선택했다고 안내 메시지가 나오는군요.
이제 메뉴3을 선택해보겠습니다.
메뉴 3을 선택했다고 잘나오네요.
이제 여러분들은 이러한 기능들을 이용하여 멋진 챗봇을 만드실 수 있습니다!
심리테스트를 모아 심리봇을 만드거나, 날씨봇, 급식봇 등 다양하게 개발하실 수 있습니다 :)
본 강좌를 따라하시면서 이해가 어려운 부분이나 오류 발생시 리플달아주시면 길게 1시간 ~ 이틀내로 답변해드리겠습니다.
또는 먼저 [리플]을 작성하시고 [카톡]으로 문의 주시면 도와드리도록 하겠습니다! ( 꼭 먼저 리플을 작성해주셔야 해요)
https://open.kakao.com/o/sJ6H1sD
좋은 내용이라 생각하시면 리플과 공감 부탁드리겠습니다.
읽어주셔서 감사합니다. :)
GitHub 소스코드
'강좌' 카테고리의 다른 글
넷플릭스에서도 사용하는 코틀린 멀티플랫폼에 대해 아시나요? (0) | 2023.03.20 |
---|
상상하는 것을 소프트웨어로 구현하는 것을 좋아하는 청년
게시글이 마음에 드시나요? [ 공감❤️ ] 눌러주시면 큰 힘이 됩니다!