카카오톡 플러스친구 API를 활용해 자동응답 봇을 만들어보았다. 또한, 우리 학과 홈페이지의 공지사항 중 14일 이내에 게시된 글의 주소를 가져와 응답할 수 있도록 했다. 데이터 파싱에는 PHP Snoopy Class를 활용했다.
웹 어플리케이션 구현에 PHP를 사용했다.
웹서버 설정에서 .php 없이 실행하도록 etc/apache2/apache2.conf(Ubuntu server 기준)의 설정을 다음과 같이 변경해준다.
소스코드: https://github.com/BinZlP/KakaoPlusBot
#Keyboard.php
<?php
echo <<< EOD
{
"type" : "buttons",
"buttons" : ["공지사항 확인", "도움말", "직접 소통하기"]
}
EOD;
?>
keyboard.php는 채팅방에 사용자가 처음 들어왔을 때 보여질 입력 옵션을 json data로 반환해야 한다. 간단하게 echo로 위와 같이 구현할 수 있다. 단, EOD 전후에 공백을 포함한 어떤 문자도 들어가서는 안된다.
#Message.php
<?php
include_once 'Snoopy.class.php';
function rtn_message(){
$snoopy = new snoopy;
$snoopy->fetch("http://cs.kw.ac.kr/department_office/lecture.php");
$txt = $snoopy->results;
$cs_link = "http://cs.kw.ac.kr";
$rex = "/^site_type=3\"\>.+\<\/a\>$/i";
$rex_a = "|<a[^>]+>(.*)</a>|U";
$rex_sbj = "/\<td class=\"subject\"\>(.*)\<\/td\>/i";
$rex_tr = "/\<tr\>(.*)\<\/tr\>/i";
$rex_date = "/[0-9]{4}\-[0-9]{2}\-[0-9]{2}/";
$exp_tr = explode("<tr>",$txt);
$now_date = date("Y-m-d",strtotime("+9 hours"));
$n_date = date_create(date("Y-m-d"));
$message = "";
for($i = 5;$i<11;$i++){
$date = "";
$url_a_tag = explode("\"",$exp_tr[$i]);
$whole_url = $cs_link . $url_a_tag[5];
$slice_a = $url_a_tag[6];
$title_str = substr($url_a_tag[6],3,strlen($url_a_tag[6])-19);
preg_match_all($rex_date,$exp_tr[$i],$date);
$t_date = date_create($date[0][0]);
$interval = date_diff($n_date,$t_date);
if($interval->days<=14){
// print($date[0][0]);
$message = $message."게시일: ".$date[0][0]."\\n";
$message = $message.$whole_url."\\n";
$message = $message."\\n";
}
}
if($message==""){
$message="최근 14일간 올라온 공지사항이 없습니다.";
}
return $message;
}
$data = json_decode(file_get_contents('php://input'));
if($data->content == "공지사항 확인"){
$message = rtn_message();
echo <<< EOD
{
"message":{
"text": "$message"
},
"keyboard":{
"type": "buttons",
"buttons" : ["알림 시작하기", "도움말", "직접 소통하기"]
}
}
EOD;
}
if($data->content == "도움말"){
echo <<< EOD
{
"message":{
"text": "소프트웨어학부 제2대 학생회 [프리]입니다. \\n프리의 플러스친구는 소프트웨어학부의 최근 14일간 공지사항을 버튼 하나로 자동으로 알려주는 기능을 하고 있습니다. \\n또한, 학생회에 질문하거나 전달하고 싶으신 말씀이 있으면 여기에 남겨주세요.",
"photo":{
"url": "http://server_url/kakao_auto/pree1.jpg",
"width": 600,
"height": 600
},
"message_button":{
"label": "소프트 학생회 페이스북",
"url": "http://www.facebook.com/softwarekw/"
}
},
"keyboard":{
"type": "buttons",
"buttons" : ["알림 시작하기", "도움말", "직접 소통하기"]
}
}
EOD;
}
if($data->content == "직접 소통하기"){
echo <<< EOD
{
"message":{
"text": "소프트웨어학부 제2대 학생회 [프리]입니다. \\n전달하고자 하시는 말씀이 있으시면 여기에 메세지를 남겨주세요. 최대한 빠르게 확인하여 답변 드리도록 하겠습니다."
},
"keyboard":{
"type": "text"
}
}
EOD;
}
?>
message.php는 특정 입력이 들어왔을 때 응답할 내용과 응답 후 사용자의 키보드를 어떻게 출력할 것인지에 대한 코드가 들어가야 한다. 파싱해온 내용을 message.php에 담아서 보내는 코드이다. 단, 메시지의 내용은 1000자 이하가 되어야 하고, 1000자 이상이 되었을 때는 결과가 사용자에게 출력되지 않으니 주의해야 한다.
사용자에게 한 번의 요청이 왔으면 응답은 단 한 번만 할 수 있다. 적어도 플러스친구 기본 제공 API에서는 그런 것 같다.
사용자에게 요청이 오지 않은 상태에서 사용자에게 메시지를 보내기 위해서는 카카오톡의 프로토콜을 모방해야 할 필요가 있어 보인다. 옛날에 LOCO 프로토콜을 사용해 통신할 때는 ID, PW, Device UUID, X-VC Value만 있으면 로그인 패킷, 메시지 전송 패킷을 흉내내어 개인적으로 메시지를 보내는 봇을 구현할 수 있었는데, 2016년쯤에 한 번 프로토콜을 엎었던 걸로 기억한다.
'Programming > Web Programming' 카테고리의 다른 글
JavaScript Basic #7 (0) | 2017.07.22 |
---|---|
JavaScript Basic #6 (0) | 2017.07.21 |
JavaScript Basic #5 (0) | 2017.07.18 |
JavaScript Basic #4 (0) | 2017.07.18 |
JavaScript Basic #3 (0) | 2017.07.16 |