카카오톡 플러스친구 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
Posted by BinZIP