윤준현

Merge branch 'useMessage'

...@@ -27,7 +27,7 @@ app.get('/keyboard', function(req,res){ ...@@ -27,7 +27,7 @@ app.get('/keyboard', function(req,res){
27 27
28 }); 28 });
29 29
30 -//8080포트로 서버 접속 30 +//9000포트로 서버 접속
31 http.createServer(app).listen(9000, () => { 31 http.createServer(app).listen(9000, () => {
32 console.log('Server running..'); 32 console.log('Server running..');
33 }); 33 });
...@@ -118,7 +118,7 @@ app.post('/message', function(req,res){ ...@@ -118,7 +118,7 @@ app.post('/message', function(req,res){
118 case '일본': 118 case '일본':
119 send = { 119 send = {
120 'message': { 120 'message': {
121 - 'text': '등록된 가수 목록입니다.' 121 + 't ext': '등록된 가수 목록입니다.'
122 }, 122 },
123 keyboard: { 123 keyboard: {
124 'type': 'buttons', 124 'type': 'buttons',
......
...@@ -66,5 +66,4 @@ function crawl(callback){ ...@@ -66,5 +66,4 @@ function crawl(callback){
66 } 66 }
67 } 67 }
68 68
69 -
70 exports.crawl_guckkasten = crawl_guckkasten; 69 exports.crawl_guckkasten = crawl_guckkasten;
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -28,8 +28,10 @@ function crawl_Reol(url,callback){ ...@@ -28,8 +28,10 @@ function crawl_Reol(url,callback){
28 if (track != '1' && track != '곡명' && track[4] != '년'){ 28 if (track != '1' && track != '곡명' && track[4] != '년'){
29 if(track[track.length-1] == 'M') 29 if(track[track.length-1] == 'M')
30 track = track.substr(0,track.length-1); 30 track = track.substr(0,track.length-1);
31 - if(track[track.length-1] == ']') 31 + if(track[track.length-3] == '[')
32 - track = track.substr(0,track.length-2); 32 + track = track.substr(0,track.length-3);
33 + if(track[track.length-4] == '[')
34 + track = track.substr(0,track.length-4);
33 track_num++; 35 track_num++;
34 album_track += track_num+'. '+track + '\n'; 36 album_track += track_num+'. '+track + '\n';
35 } 37 }
...@@ -43,8 +45,10 @@ function crawl_Reol(url,callback){ ...@@ -43,8 +45,10 @@ function crawl_Reol(url,callback){
43 if (track != '1' && track != '곡명' && track[4] != '년'){ 45 if (track != '1' && track != '곡명' && track[4] != '년'){
44 if(track[track.length-1] == 'M') 46 if(track[track.length-1] == 'M')
45 track = track.substr(0,track.length-1); 47 track = track.substr(0,track.length-1);
46 - if(track[track.length-1] == ']') 48 + if(track[track.length-3] == '[')
47 - track = track.substr(0,track.length-2); 49 + track = track.substr(0,track.length-3);
50 + if(track[track.length-4] == '[')
51 + track = track.substr(0,track.length-4);
48 track_num++; 52 track_num++;
49 album_track += track_num+'. '+track + '\n'; 53 album_track += track_num+'. '+track + '\n';
50 } 54 }
......
...@@ -10,7 +10,6 @@ function crawl_yorusika(url, callback){ ...@@ -10,7 +10,6 @@ function crawl_yorusika(url, callback){
10 const $ = cheerio.load(body); 10 const $ = cheerio.load(body);
11 var index; 11 var index;
12 var album_num = 0; 12 var album_num = 0;
13 - console.log($('.discography_contents').length);
14 for (var i = $('.discography_contents').length; i >=1; i--) { 13 for (var i = $('.discography_contents').length; i >=1; i--) {
15 year = $('body > article > section > div > div:nth-child('+i+') > div.discography_text > div.discography_date').text(); 14 year = $('body > article > section > div > div:nth-child('+i+') > div.discography_text > div.discography_date').text();
16 year = year.substr(0,year.length-7); 15 year = year.substr(0,year.length-7);
...@@ -48,4 +47,5 @@ function crawl_yorusika(url, callback){ ...@@ -48,4 +47,5 @@ function crawl_yorusika(url, callback){
48 }); 47 });
49 } 48 }
50 49
50 +
51 exports.crawl_yorusika = crawl_yorusika; 51 exports.crawl_yorusika = crawl_yorusika;
...\ No newline at end of file ...\ No newline at end of file
......
No preview for this file type
1 +안녕하세요.
2 +카카오 챗봇 api를 활용한 음악 앨범 봇이라는 주제로 오픈소스 프로젝트를 발표하게 된 윤준현입니다.
3 +발표 순서는 간략한 소개, 그리고 만든 동기, 구조, 마지막으로 음악 앨범 봇 시연 순서로 진행하겠습니다.
4 +
5 +
6 +처음으로 음악 앨범 봇의 소개입니다.
7 +음악앨범 봇이란 등록된 가수들의 간략한 프로필과 앨범정보를 사용자가 메시지로 요청시 메시지로 답변하는 챗봇입니다.
8 +왼쪽의 사진이 제가 만든 챗봇입니다. 친구 검색에 신곡알림을 입력하시면 이 플러스 친구가 나옵니다. 이름을 수정하고 싶어도 수정이 안되서 현재 챗봇 이름은 저런상태입니다.
9 +다음과 같이 플러스 친구에서 API형 스마트 채팅을 활용하면 누구나 쉽게 자신만의 챗봇을 만들 수 있었습니다.
10 +그런데 2018년 11월 말 기준으로 api형 챗봇은 더 이상 생성할 수 없고 카카오는 2019년 12월자로 서비스를 중단한다고 발표하였습니다. 대신에 카카오는 카카오 i 오픈 빌더를 통하여 챗봇을 만들 것을 권하고 있습니다. 제가 직접 만들어보지는 않았지만 api형 챗봇 보다 아마 만들기 더 쉽지 않을까 생각합니다.
11 +
12 +두 번째로 만든 동기에 관하여 발표하겠습니다.
13 +개인적으로 가수들의 프로필과 discography를 검색하는데 포털 사이트 검색 -> 공식 사이트 -> 디스코그래피 찾기의 절차로 꽤 많은 단계가 필요하여 불 - 편 했습니다.
14 +그래서 이 검색 단계를 최소화하고 또한 음악 앨범 정리를 깔끔하게 하기 위하여 음악 앨범 봇을 구상하게 되었습니다. 저는 개인적으로 음악앨범 봇을 통해 앨범 정보를 얻는 것이 편 - 안 했습니다.
15 +음악 앨범 봇은 웹 크롤링을 통하여 가수들의 프로필과 앨범 정보들을 얻는데 그 출처는 공식사이트와 나무위키입니다. 흔히들 꺼무위키라 불리며 잘못된 정보 또한 많은 이곳에서 정보를 얻는 이유는 공식 사이트 등이 없는 가수들이 있기 때문이고 앨범 정보 같은 것은 틀릴 가능성이 0에 가깝기 때문입니다. 이 사이트들을 통하여 크롤링을 하면 우선 정보의 지속적인 업데이트가 보장되기 때문에 유용하다고 생각하였습니다.
16 +
17 +
18 +세 번째로 구조에 관하여 발표하겠습니다.
19 +음악 앨범 봇에 사용된 것은 크게 3가지로 node js, 아마존 aws ec2 그리고 카카오 스마트채팅 api입니다.
20 +
21 +노드 js에서 사용하는 기능은 다음과 같습니다.
22 +노드 js에는 cheerio와 request라는 모듈이 있는데 request 모듈을 통하여 웹 페이지의 html 정보를 받아온 뒤 cheerio모듈을 통하여 그 정보를 읽어들여 가수 및 앨범 정보를 크롤링합니다. 크롤링을 하면 다음과 같이 정보를 얻을 수 있습니다.
23 +그리고 노드 js의 express와 http 모듈을 사용하여 서버를 개방하여 이를 카카오 API서버로 등록하였습니다.
24 +자바스크립트 코드를 통하여 챗봇이 동작하는 방식을 구현하였습니다.
25 +
26 +아마존 EC2에서는 수업에서 배웠듯 서버를 유지하는데 사용하였습니다. localhost로 서버를 유지한다면 많은 제약이 있을 것 같아 ec2를 이용하여 음악앨범 봇이 ec2 서버가 문제 없는 이상 항상 작동하도록 만들었습니다. 이 서버를 통하여 카카오 api 서버와 파트너 서버간의 메시지를 주고 받습니다. 여기서 파트너 서버란 카카오가 챗봇을 동작하게 만들어 주도록 해주는 서버라고 말할 수 있습니다.
27 +
28 +카카오 스마트 챗봇 api에서는 자체 restful api를 이용하여 아마존 ec2로 개방한 카카오 api서버를 통해 파트너 서버를 호출하여 챗봇이 작동하도록 합니다.
29 +
30 +저의 음악 앨범 봇의 대략적인 작동 방식은 다음과 같습니다.
31 +처음에 사용자가 메시지를 요청하면 사용자의 메시지를 받아들인 파트너 서버에서 카카오 api서버로 메시지를 전달합니다. 이후 카카오 api 서버에서 node js로 메시지를 requset하여 해당하는 메시지를 검색 후, 찾은 메시지를 respond하여 다시 카카오 api서버로 메시지를 보냅니다. 카카오 api 서버는 파트너 서버로 메시지를 보내고 파트너 서버는 사용자에게 요청했던 메시지를 보냅니다. 이는 대부분의 카카오 챗봇의 작동 방식과 유사할 것입니다.
32 +
33 +마지막으로 음악앨범 봇을 시연하는 것으로 마치겠습니다.
34 +직접 해보고 싶은 분은 화면에 보이는 링크를 입력하거나 친구 검색에 "신곡알림"이라고 입력하시면 제가 만든 챗봇이 나올 것입니다.
35 +사이트마다 http 코드가 달라 크롤링하는 코드 또한 달라져서 아직 가수를 많이 등록하지 못하였습니다.
36 +
37 +이상으로 발표를 마치겠습니다. 감사합니다.
...\ No newline at end of file ...\ No newline at end of file