티스토리 뷰

안녕하세요


이번 포스팅은 카카오 플러스친구 챗봇에 대한 마지막 강좌입니다



지난 강좌에서는 첫 채팅시 보여줄 버튼들을 제공하는 기능을 구현하였습니다.



이번 포스팅에서는 상대방이 어떤 데이터를 전송하면 이에 맞는 응답을 하도록 구현해보겠습니다!







[1. API 문서 확인]



접속 URL은


http://서버주소/message

입니다


방식은 지난번과 다르게 GET 방식이 아니라 POST 방식입니다.


아래 파라미터를 보시면 


user_key

type

content


3개의 데이터가 함께 전달된다고 합니다.


아래 예제와 같은 형식으로 서버에 전달됩니다.




전달받은 데이터를 가지고 적절하게 처리한 후 응답하는 형식에 대해서도 명시되어있습니다.


아래와 같은 형식으로 다시 응답하면 됩니다.






[2. POST 데이터를 위한 모듈 설치]



POST 방식으로 데이터를 전달받게되면 그냥 확인할 수 없습니다.


POST 데이터를 쉽게 읽고 사용할 수 있게하기위해 모듈을 하나 설치합시다.





프로젝트 폴더에 CMD를 열고


npm install body-parser --save


명령어를 입력하여 모듈을 설치합니다.




 설치가 완료되었으면 기존 코드에서 사용해봅시다.




7~8행, 13~15행의 코드를 입력해줍니다.


13~15행은 express 서버에서 body-parser 라는 미들웨어를 사용하겠다고 설정하는 코드입니다.







[3. POST 데이터를 받을 라우트 생성]


API 문서에서


http://서버주소/message


경로로 데이터가 전달된다고 명시되어있습니다.


서버에서 위 주소에 대한 라우팅처리를 해줍니다.



30번째 행을보면 app.get() 이 아닌 app.post() 입니다.


경로는 /message 로 설정해줍니다.


32행은


req: 요청 객체

body: POST 데이터는 body에 포함되어 전달됩니다

content: API 문서에 content는 사용자가 입력한 데이터라고 명시되어있습니다.


하나로 이어서 설명하면 요청객체에서 사용자가 입력한 데이터를 꺼내는 부분입니다.


데이터를 msg 변수에 저장하는 코드입니다.


37행의 switch 문은


사용자가 데이터를 전송했을 때 상황에 맞는 처리를하기위해 작성하였습니다.


case 에는 각각의 처리할 항목들을 나열했습니다.


63행에서는 알맞는 send 데이터를 다시 사용자에게 JSON 타입으로 전달하는 코드입니다.







API 문서를 참고하여 간단히 추가해보았습니다.


API 문서의 형식처럼만 구성하면 됩니다.



소스코드를 저장하고 서버를 다시 껐다가 켜주면 위의 기능이 바로 반영됩니다.




카카오톡으로 테스트해보도록 합시다.





과일을 선택하거나 입력했을때의 응답입니다.


코드로 작성한것과 동일하게 응답하는 모습입니다.




채소를 입력하거나 버튼으로 선택했을때의 모습입니다.


잘 작동하네요!




정보를 선택했을때입니다.


메시지뿐만 아니라 다시 새로운 버튼이 출력됩니다.


위와같이 코드를 작성하여 전달한 결과입니다.





테스트2를 선택한 모습입니다.


switch문에서 "테스트2"에 대한 case를 구현하지 않았으므로 알 수 없는 명령이라고 출력됩니다.



이러한 방법으로 나만의 챗봇을 만들 수 있습니다!






이상으로 카카오톡 플러스친구 챗봇 만들기에 대한 강좌를 마치도록 하겠습니다.



감사합니다





댓글
  • 프로필사진 김승현 앱 URL에 키보드 입력시 사용되었던 주소가 있는데 거기에 /message를 붙히면 되는건가요?
    2018.04.30 03:16
  • 프로필사진 BlogIcon 이근둥 앱 등록시에는 서버 주소와 포트만 필요합니다.


    /message는 서버 코드에서 구현하시면 됩니다.

    app.post('/message', function(...) { ... });

    /message 경로는 실제 카카오톡으로 챗봇에게 데이터를 보냈을 경우 카카오측에서 자동으로 데이터를 넘겨주는 경로이므로 기능만 구현하시면 됩니다
    2018.05.05 01:31 신고
  • 프로필사진 이현탁 머가 문제일까요..?

    var express = require('express');

    var http = require('http')

    var bodyParaser = require('body-parser');

    var app = express();

    app.use(bodyParaser.urlencoded({extended: false}));
    app.use(bodyParaser.json());

    app.get('/keyboard', function(req, res) {
    var data= {
    'type' : 'buttons',
    'buttons' : ['오늘 메뉴','내일 메뉴','모레 메뉴']
    };
    res.json(data);
    });
    http.createServer(app).listen(25565, function(){
    console.log('서버 실행중');
    });
    app.post('/message',function(req, res){
    var msg = req.body.content;
    console.log('전달받은 메시지:' + msg);
    var send = {};
    switch(msg) {
    case '오늘 급식':
    send = {
    'message':{
    'text': '몰라요'
    }
    }
    break;
    }
    res.json(send);

    });
    2018.10.04 06:40
  • 프로필사진 혀니 문의글 남겼었는데... 찾았습니다!!
    오타가 났네요...
    자동으로 엔터 눌러서 넘겼더니 다른 글씨가 찍혀있네요~^^;
    감사합니다~ 많은 것을 배웠습니다~^^
    2018.05.17 01:07
  • 프로필사진 BlogIcon 이근둥 잘 찾으셨다니 다행입니다~ 궁금하신것 있으시면 언제든지 물어보셔도 좋습니다~! 2018.05.17 17:20 신고
  • 프로필사진 박정재 안녕하세요..부천에서 공부하는 학생입니다. 챗봇 강좌 모두 잘봤습니다 그런데 마지막에 막히는게 있어서 그런데 질문하나 드려도 될까요?
    강좌 1~3까지 모두 잘 따라오긴 했는데 마지막에 자동 응답을 구현할때 코드를 짜잖아요? 근데 그 코드를 짜서 어떻게 적용시켜야하는지 모르겠습니다 .
    챗봇 서버를 만들때 짠 코드에 넣어보기도 하고 그냥 챗봇 서버 파일이 있는 폴더에 넣어보기도 하고 할 수 있는건 다 해봤는데 어떻게 할지 모르겠습니다ㅜ
    적용하는 방법이 뭔가요?
    2018.05.23 01:39
  • 프로필사진 BlogIcon 이근둥 처음부터 진행했던 코드에 추가로 작성하시면 됩니다!

    만약에 app.js 라는 이름으로 시작하셨다면 이 안에다가 기능을 추가하시면 됩니다!
    2018.05.24 16:27 신고
  • 프로필사진 조형일 제가 직접 챗봇을 만들게 되니 재밌고 신기하네요. 친절한 설명 감사합니다.
    저도 궁금한게 있는데 혹시 시간되시면 답변 부탁드립니다 .ㅠㅜ

    서버 콘솔에서는 사용자가 입력한 버튼이 뭔지 잘 뜹니다.
    그런데 사용자 대화화면에서는 답장이 없고 이전포스트(http://codevkr.tistory.com/31?category=719250)의 마지막 그림처럼
    "해당 프로필의 자동응답 시스템이 응답을 하지 않습니다"가 뜹니다.
    코드는 거의 유사하게 했는데 자바스크립트가 처음이어서 그런지 뭐가 문젠지 모르겠습니다.

    코드는

    var express = require('express');
    var http = require('http');

    var bodyParser = require('body-parser');
    var app = express();
    app.use(bodyParser.urlencoded({extended: false}));
    app.use(bodyParser.json());

    app.get('/keyboard', function(req,res) {
    var data ={
    'type': 'buttons',
    'buttons': ['서초구','송파구','종로구']
    };
    res.json(data);
    });

    app.post('/message',function(req,res) {
    var msg = req.body.content;
    console.log('전달받은 메시지: ' + msg);

    var send = {};
    switch(msg) {
    case '서초구':
    send = {
    'message': {
    'text': '서초구 미세먼지 상태는 나쁨입니다!\n 외출시 마스크를 잊지마세요'
    }
    }
    break;
    case '송파구':
    send = {
    'message': {
    'text': '송파구 미세먼지 상태는 매우나쁨입니다!\n 가급적 외출을 삼가주세요!!'
    }
    }
    break;
    case '종로구':
    send = {
    'message': {
    'text': '종로구 미세먼지 상태는 좋음입니다!'
    }
    }
    break;
    default:
    send = {
    'message': {
    'text': '알 수 없는 명령입니다!'
    }
    }
    break;
    }
    });
    http.createServer(app).listen(9090, function() { console.log('서버 실행 중...\n')});
    로 작성했습니다.
    2018.05.31 00:02
  • 프로필사진 BlogIcon 이근둥 switch문 끝나고 res.json(send)를 추가해주셔야합니다!

    switch 문에서는 사용자가 입력한 데이터에 알맞는 답장을 send 변수에 대입을 해주고 대입 후에는 res.json(send)로 send 변수 데이터를 유저들에게 전달해주는 구조입니다!
    2018.06.06 00:26 신고
  • 프로필사진 BlogIcon 이근둥 app.post('/message',function(req,res) {
    var msg = req.body.content;
    console.log('전달받은 메시지: ' + msg);

    var send = {};
    switch(msg) {
    ....
    }
    });
    res.json(send);
    });
    2018.06.06 00:28 신고
  • 프로필사진 임수현 안녕하세요 블로그보고 챗봇 만드는데 굉장히 흥미롭고 재밌네요! ㅎㅎ
    친절한 설명 감사합니다! 챗봇 만들다가 궁금한 점이 있는데 혹시 뒤로가기 같은 기능을 추가하려면 어떤 기능을 사용해야하나요?

    app.get('/keyboard',function(req,res){
    var data={
    'type':'buttons',
    'buttons':['a','b','c']
    };

    res.json(data);
    });

    app.post('/message', function(req,res){
    var msg = req.body.content;
    console.log('전달받은 메시지:'+msg);

    var send = {}; // 응답할 데이터

    switch(msg) {
    case '이전으로':
    send = {
    'message':{
    'text':'이전으로'
    },
    keyboard:{
    'type':'buttons',
    'buttons':['a','b','c']
    }
    }
    break;
    case 'a':
    send = {
    'message':{
    'text':'a'
    },
    keyboard:{
    'type':'buttons',
    'buttons':['A','B','C','처음으로']
    }
    }
    break;

    case 'b':
    send ={
    'message':{
    'text':'b'
    },
    keyboard:{
    'type':'buttons',
    'buttons':['A','B','C','처음으로']
    }
    }
    break;

    case 'c':
    send ={
    'message':{
    'text':'c'
    },
    keyboard:{
    'type':'buttons',
    'buttons':['A','B','C','처음으로']
    }
    }
    break;
    }
    res.json(send);
    });

    http.createServer(app).listen(9900, function() {
    console.log('서버 실행 중..')}
    );

    이렇게 하려고 했는데 안되더라구요ㅠ ㅠ 그리고 ABC에서 하위로 또 버튼을 추가하려면 keyboard를 한번 더 추가하면 되나요??
    2018.06.07 03:14
  • 프로필사진 BlogIcon 이근둥 버튼을 누르면(입력하면) 그에 대한 동작은 단 1번만 한다는것을 알고 계셔야합니다.
    A버튼을 눌렀을 때 다른 버튼을 또 보여주려면
    keyboard: {
    'type': 'buttons',
    'buttons': ['버튼1', '버튼2', '버튼3']
    }

    과 같이 전달할 데이터에 보여줄 버튼 리스트를 추가해주시면 됩니다.

    처음으로 돌아가는 기능을 구현하시려면 '처음으로' 버튼에 대응하는 case를 만들어주셔야합니다!

    case '처음으로':
    // 처음으로 돌아왔을 때 전송할 메시지, 또는 버튼
    2018.06.07 17:34 신고
  • 프로필사진 송종원 답변으로 음성을 보내려면 어떻게 해야할까요? 2018.06.20 01:27
  • 프로필사진 BlogIcon 이근둥 공식 문서의 API SPEC을 확인해보시면 TEXT로만 응답을 하면 유저 카카오톡에서 + 모양이 보입니다. 여기에서 유저가 사진 또는 음성 메시지를 전송하게 되면 요청 객체에(req.body.content) 해당 리소스 URI가 함께 전달된다고 하니 확인해보시면 될것같습니다! 2018.06.21 10:21 신고
  • 프로필사진 송종원 2번에서 예상 하지 못한 오류 팝업 창이 떠서 도저히 해결이 안되길래 3번으로 넘어와서 해봤는데 여전히 안되네요 ㅠㅠ

    논리나 코딩하는건 다 이해가 되는데 api가 등록이 안되니 많이 답답하네용 ㅠㅠㅠ

    어떻게 해결할 수 있을까요?
    2018.06.21 00:12
  • 프로필사진 BlogIcon 이근둥 서버 주소 작성할 때 /keyboards 또는 /message 부분 추가하셨나요? 아니면 서버측 코드에서 POST인지 GET인지 확인해보세요! 2018.06.21 10:23 신고
  • 프로필사진 자네 안녕하세요 1~3까지 쭉 따라하고 api 테스트후 실제 카톡에서 버튼을 눌러보니
    "해당 프로필의 자동응답 시스템이 응답하지 않습니다" 라고 나오는데 혹시
    어떤문제인지 알수있을까요?

    //express 모듈 불러온후 express 변수에 저장
    var express = require('express');

    //http 모듈 불러온 후 http 변수에 저장
    var http = require('http');

    // body-parser 모듈 불러온후 bodyparser 변수에 저장
    var bodyparser = require('body-parser');

    //express 객체를 app 변수에 저장
    var app = express();

    //body-parser 미들웨어 사용
    app.use(bodyparser.urlencoded({extended: false}));
    app.use(bodyparser.json());

    app.get('/keyboard', function(req,res) {
    var data ={
    'type': 'buttons',
    'buttons': [' 퀴즈이벤트']
    };
    res.json(data);
    });

    //http://서버주소/message
    app.post('/message', function(req, res){
    //유저가 입력한 데이터
    var msg = req.body.content;
    console. log('전달받은 메세지: '+msg);

    var send ={};

    switch(msg){
    case'퀴즈이벤트':
    send = {
    'message_button': {
    'label': '퀴즈 이벤트 참여하기',
    'text':'개인정보 수집 및 이용동의 경품배송을 위해 개인정보 수집 이용 및 위탁업무에 동의하시고, \n개인정보를 입력해주시면 이벤트 응모가 완료됩니다. \n은 귀하의 개인정보를 다음의 목적으로 수집 이용 및 위탁합니다. \n-수집하는 개인정보: 성명, 연락처\n -수집목적: 이벤트 참여자 식별, 서비스 제공 및 이벤트 경품 배송 및 안내 등 활용 \n-개인정보 보유 및 이용기간: 개인정보 제공일로부터 1년 이후 삭제 \n※개인정보 수집 및 업무내용 1) : 이벤트 업무 운영 대행 위와 같이 개인정보 제공 및 개인정보 위탁에 동의하십니까?\n (단, 동의하지 않으실 경우 참여가 취소됩니다)'
    },
    'keyboard': {
    'tyep' :'buttons',
    'buttons':['동의','동의안함']
    }
    }
    break;

    };

    //JSON 형식으로 응답
    res.json(send);
    });

    //8016포트로 서버 실행
    http.createServer(app).listen(8016,function() {
    console.log('서버 실행 중...')
    });
    2018.07.03 12:02
  • 프로필사진 BlogIcon 이근둥 사용자가 선택한 버튼 텍스트 데이터가 서버 콘솔창에 정상적으로 찍히나요? 2018.07.04 22:25 신고
  • 프로필사진 BlogIcon JinCode json?.. 파싱..? 이라고 해야 하나요...?

    ex ) 오늘의 날씨 알려줘 하면
    날씨를 인식하는 방법 입니다.

    혹시 알려주실 수 있을까요??
    2018.07.06 11:33 신고
  • 프로필사진 BlogIcon 이근둥 사용자가 입력한 메시지는 결국 문자열 변수에 담겨서 옵니다. 자바스크립트의 문자열 메소드를 확인해보시면 search 메소드가 있는데 이 메소드를 사용하시면 해당 문자열에 특정 문자열이 존재하는지 확인이 가능합니다!

    예를 들어 "날씨"라는 문자열이 있는지 확인하려 하고 확인할 문자열은 str 변수에 존재한다고 했을 때 아래와 같이 사용하실 수 있습니다!

    if (str.search("날씨") ! == -1) {
    console.log("날씨는 맑음")
    }

    str 문자열 변수에서 "날씨" 라는 문자열을 검색합니다. 만약 해당 문자열이 존재할 경우 문자열이 존재하는 인덱스 값을 반환하고, 존재하지 않다면 -1 을 반환합니다!

    문자열 검색 뿐만 아니라 정규표현식 검색도 가능합니다.

    참고링크: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/search
    2018.07.09 22:31 신고
  • 프로필사진 sunday 안녕하세요. 자세히 설명해주셔서 카카오 채팅봇을 만들어보고 있는데요. 제가 2탄까지는 크게 문제가 없었는데요.
    지금 본문따라 했는데 API테스시
    Required*

    keyboard Fail 415
    wrong keyboard initialization
    이런 글이 뜹니다.

    ㅠㅠ 약간 엄마 느낌의 챗봇을 만들고 싶은데

    아래는 코드인데요.

    var express = require('express');

    var http = require('http');

    var bodyParser = requ('body-parser');

    var app = express();

    app.use(bodyParser.urlencoded({extended: false}));
    app.use(bodyParser.json());

    app.post('/message',function(req,res) {
    var msg = req.body.content;
    console.log('전달받은 메시지: ' + msg);

    var send = {};

    switch(msg) {
    case '엄마':
    send = {
    'message': {
    'text': '왔니?'
    }
    }
    break;

    case '배고파':
    send = {
    'message': {
    'text': '조금만 기다리렴'
    }
    }
    break;

    case '사랑해':
    send = {
    'message': {
    'text': '나도 사랑한단다'
    },
    keyboard: {
    'type': 'buttons',
    'buttons': ['고마워요', '그리워요', '사랑해요']
    }
    }
    break;

    default:
    send = {
    'message': {
    'text': '무슨 말이니, 다시 말해주겠니?'
    }
    }
    break;
    }

    res.json(send);
    });

    http.createServer(app).listen(9090, function() {
    console.log('서버 실행 중..')}
    );

    문제가 있을까요,,?
    좋은 게시물 감사합니다 ㅠ_ㅠ
    2018.08.23 22:30
  • 프로필사진 BlogIcon 이근둥 안녕하세요! 남들과는 다른 컨셉의 챗봇을 만들고계시네요~

    코드를 한번 확인해보니 app.get('/keyboard', ...) 부분이 없습니다.
    이전 강좌에서 한 부분을 빼먹으신것같네요 ㅜㅜ 한번 다시 확인해주세요

    카카오톡 측에서는 본격적으로 우리가 개발한 API서버를 허용해주기 전에 정상적으로 데이터가 응답되는지 확인을 거칩니다. 그 부분이 API 테스트이구요.

    서버주소/keyboard 경로로 카카오톡측에서 접속하는데 아무런 데이터가 오지 않아서 그렇습니다.

    코드에 /keyboard 경로에 대한 라우팅과 적절한 데이터를 응답해주면 해결됩니다!
    2018.08.23 23:43 신고
  • 프로필사진 esquared 안녕하세요
    저는 클라이언트가 입력했을 경우
    1. 내용
    2. 제목

    이런식으로 개행을해서 보여주고 싶은데 어떻게 해야돼요??
    2018.08.27 22:08
  • 프로필사진 BlogIcon 이근둥 개행문자는 \n을 사용하면 됩니다!

    str = '1. 내용\n2. 제목'

    결과)
    1. 내용
    2. 제목
    2018.08.28 17:26 신고
  • 프로필사진 부산맨 좋은 글 감사합니다.
    궁금한 점 질문 드립니다.
    1. FAQ형과 API형을 선택해서 설치할 수 있는 탭이나 버튼을 만들고 합니다.
    아니면 따로 FAQ형 카카오톡 플러스 친구와 API형을 따로 만들어야 하는지요?
    2. 위에 분처럼 FAQ나 API타입이 아닌
    글자를 입력하는 것보다는 사전의 중요 명령어 버튼을 만들고자 하는데요.
    그 버튼을 만들려면 어떤 과정을 더 거쳐야하는 건지요?

    3. 라즈베리파이를 서버로 사용할려면 설정이나 세팅이 많은지요? 방법 좀 부탁 드립니다. 아니면 개인적으로라도 답을 받고 싶습니다.
    라즈베리파이의 많은 부분에서 문외한이라 여쭙니다.
    바쁘실텐데 답글 부탁드려도 실례가 안될런지요?
    환절기 감기 조심하셔요^^
    2018.09.02 01:10
  • 프로필사진 BlogIcon 이근둥 1번 질문이 잘 이해가 안가네요.. 죄송합니다. FAQ형 처럼 기본 항목을 보여주는 방법과 API 형의 입력받는 방식을 함께 사용하고 싶으시다는건가요..?

    제가 이해한 내용이 맞다면 API형을 선택해서 만드신 후 서버에서 직접 버튼 데이터를 추가하고 그 버튼에 대한 응답은 switch 문에서 생성해주시면 됩니다.


    2번 질문과 같은 경우에는 1번 문제와 동일한것같습니다.
    예를들어 카카오톡 챗봇과 대화를 처음 시작하면(방에 들어오면) "시작하기", "정보보기" 2개의 버튼이 보이고 시작하기 버튼을 누르면 직접 입력할 수 있도록 구현할수도 있고 계속 버튼으로 진행하게 구현할수도 있습니다.


    3번 문제는 현재 제가 라즈베리파이3로 카카오톡 챗봇을 5~6개월간 실제 서비스를 진행하고 있습니다. 학교에서 사용하는 챗봇이라 큰 부하가 없어서 잘 작동하더라구요.. 라즈베리파이에 리눅스를 설치하고 챗봇 코드를 그대로 옮겨서 실행만 시켜주면 됩니다. 크게 어려운 부분은 없었던것같아요
    2018.09.06 20:46 신고
  • 프로필사진 오류투성이~ 코드를 수정하고 저장했는데도 이전 코드가 실행되는건 어떻게 해야하나요? ㅠㅠ 그냥 저장하면 바로 카톡 들어가면 업데이트가 돼있나요? 2018.09.04 05:05
  • 프로필사진 BlogIcon 이근둥 코드를 저장한 후 서버를 한번 종료했다가 다시 실행하셔야 반영됩니다.

    또는 카카오톡 챗봇 채팅방을 나갔다가 다시 들어오시면 정상적으로 보이실겁니다!
    2018.09.06 20:47 신고
  • 프로필사진 익명 비밀댓글입니다 2018.09.11 00:25
  • 프로필사진 BlogIcon 이근둥 안녕하세요 따로 연락 드렸습니다.

    저는 아직 학생이기도 하고 공부도 함께 하고 있는지라 집중적으로 도움을 드릴수는없는 점 양해 부탁드립니다.

    제가 알고 부분에 대해서는 조금이나마 도움을 드리도록 하겠습니다.
    2018.09.13 13:22 신고
  • 프로필사진 챗봇 안녕하세요! 플러스친구가 아닌 챗봇어플에서 봇계정을 통해 챗봇을 이용하려 합니다. 아직 글을 보실진 모르겠지만..질문남깁니다 ㅠ
    조건 : '김주원'이란 사람이 '시작' > 모집을 시작 > 카톡방 사람들이 "10분 사람1", "10분 사람2"," 20분 사람3" 채팅을 통해 봇에게 신청을 하면 봇이
    [10] 사람1 사람2 [20] 사람 3 실시간으로 정리를 해주는 코딩을 하려합니다.

    var msgData = [];
    var i = 1;
    var admin = '김주원';
    function response(room, msg, sender, isGroupChat, replier, imageDB) {

    if (sender == admin && msg.indexOf("시작") != -1)
    {
    replier.reply("모집을시작합니다");
    var start;
    msg.indexOf("10") != -1;
    {
    if (i <= 10) {
    var msg2 = msg.replace("10", "");
    msgData.push(msg2);
    replier.reply("[10]\n" + msgData.join("\n"));
    }
    else if (i > 10) {
    replier.reply("[10] 마감 입니다.");
    }

    }

    if (i <= 10) {
    i++;
    return start;
    }


    }

    replier.reply(i);
    replier.reply("끝");
    }

    문제가 되는 점은 김주원이 "시작"을 입력하면 "모집을 시작합니다" 후에 다른사람들에게 시간을 받을 코드가 필요한데 도통 그걸 모르겠습니다..
    위 코딩대로 하면

    "모집을시작하겠습니다"
    "[10] 시작 시작"
    "3"
    "끝"

    이런식으로 끝나더군요..
    msg.indexOf("10")!=-1 ; << 대신에 무엇을 넣어야 신청을 받을 수 있을까요?
    2018.11.01 13:44
  • 프로필사진 BlogIcon 이근둥 모집을 시작하면 특정 변수의 값을 true로 두고 if (모집시작) 인 경우에만 i++와 return을 해주며 모집 인원을 카운트해주면 해결하실 수 있을 것 같아요

    모집 인원이 모두 할당되면 위에서 true로 지정한 값을 false로 변경한 후 결과를 출력해주면 될 것 같습니다.
    2018.11.02 15:30 신고
  • 프로필사진 초보 안녕하세요 글 정말 잘 봤습니다.
    덕분에 저도 카카오톡 챗봇을 한 번 만들어 보았는데요
    하나 궁금한 점이 있는데
    저는 사용자가 "멜론"이라는 단어를 입력하면
    실시간으로 멜론 홈페이지에 가서 파싱을 한후 그 데이터를 입력하도록 만들고 싶은데요
    다른 블로그를 참조하여 멜론차트를 파싱하는 코드는 작성해보았습니다.
    이것을 이용해서 챗봇이 답변해주도록 만들어 보고싶은데
    혹시 조금 도움을 주실 수 있으십니까?
    2018.11.15 17:54
  • 프로필사진 BlogIcon 이근둥 멜론 차트 파싱하는 코드가 완성되었다면, 챗봇 서버에서 메시지를 응답하기 전에 해당 데이터를 가져오고 전달할 메시지 부분에 추가해주면 될 것 같습니다.

    // 예) getMelonChart는 멜론 차트 데이터 가져오는 함수라고 가정
    var melon = getMelonChart()

    res.send({
    message: {
    text: '멜론 차트입니다.' + melon
    }
    })
    2018.11.26 11:48 신고
  • 프로필사진 익명 비밀댓글입니다 2019.02.17 23:51
  • 프로필사진 BlogIcon 이근둥 네 작성해도됩니다.

    서버 지속 방법은
    1. 서버를 계속 켜두거나
    2. 호스팅 업체를 통해 서버를 실행시켜두는 방법이 있습니다.

    1번의 경우 서버 컴퓨터를 계속 켜두고 직접 네트워크 설정도 해야 합니다
    2번의 경우 AWS나 구글클라우드 플랫폼 등의 서비스를 이용하면 되지만 사용료를 지불해야합니다.


    저의 경우 1번 방법으로 집에 라즈베리파이를 계속 켜둔 상태로 서버를 구동하고있습니다.

    적절한 방법을 찾아서 사용하시면 될 것 같습니다
    2019.02.18 08:32 신고
  • 프로필사진 버스API 안녕하세요. 저는 자동응답이 아닌 API를 사용해서 response를 json으로 받아오고있는데요
    받아오는 json에서 받는 message 에 \n 개행문자를 넣어도 먹히기지가 않아
    [{"방향":"삼정초교 방향","버스이름":"금호36","남은시간":"3분","남은정류장수":"2개"},{"방향":"삼정초교 방향","버스이름":"진월17","남은시간":"13분","남은정류장수":"9개"},
    이런식으로 한줄로 쭉 넘어옵니다.
    무슨방법을 다써봣지만 개행문자를 넣으면
    [{"방향":"삼정초교 방향\n","버스이름":"금호36\n","남은시간":"3분\n","남은정류장수":"2개\n"}
    이런식으로 텍스트로 그냥 인식해버리는데 어떻게 해야할까요???
    2019.07.16 17:33
  • 프로필사진 BlogIcon 이근둥 JSON 데이터 자체가 toString화 된 상태로 응답된 것 같습니다. 데이터를 JSON으로부터 뽑아온 후 문자열로 새로 생성하셔야 합니다. 2019.07.16 19:01 신고
  • 프로필사진 버스API 네네. 답변 정말 감사합니다.
    말씀해주신대로
    JSON 에서 파싱해서
    json_data 라는 오브젝트를 만들어서
    Answer 라는 객체배열에 push해서 넣었습니다.


    소스코드는

    // API 에 요청. rq_data에 원하는 정보가 담겨있음.
    request($api_url, function(rq_err,rq_res,rq_data){
    $ = cheerio.load(rq_data);

    obj = JSON.parse(rq_data);
    // 요청 URL에 DATA가 있다면 haveData 플래그를 true로 설정.
    if( obj.BUSSTOP_LIST.length > 0 ){
    haveData = true;
    }
    for( var i = 0; i < obj.BUSSTOP_LIST.length; i++){
    //console.log("버스 번호 : " + des_bus_id )
    //console.log('버스 이름 : ' + obj.BUSSTOP_LIST[i].LINE_NAME);
    //console.log('남은 시간 : ' + obj.BUSSTOP_LIST[i].REMAIN_MIN + '분');
    //console.log('남은 정류장 수 : ' + obj.BUSSTOP_LIST[i].REMAIN_STOP +'개' );
    //console.log("----------------------------------------------------");
    console.log('다음정류장 : ' + childData.NEXT_STATION);
    var json_data = {
    //버스번호 : des_bus_id,
    방향 : childData.NEXT_STATION ,
    버스이름 : obj.BUSSTOP_LIST[i].LINE_NAME,
    남은시간 : obj.BUSSTOP_LIST[i].REMAIN_MIN ,
    남은정류장수 : obj.BUSSTOP_LIST[i].REMAIN_STOP ,
    //곧도착 : obj.BUSSTOP_LIST[i].ARRIVE_FLAG == 1 ? '곧 도착 !! ' : '멀었네~',

    }

    Answer.push(json_data);
    }
    })
    }
    })

    })
    setTimeout(function(){ res.json( {success:haveData?'데이터 있음' : '데이터 없음', message:Answer }) } , 1300);

    이런식인데 어떻게 해도 개행이 안되는데 어떤식으로 해야할까요 ?ㅠㅠㅠ
    2019.07.17 17:37
  • 프로필사진 BlogIcon 이근둥 Answer 배열에 객체 형식으로 데이터를 넣고 있고, Answer 객체를 응답하고 있는 상황입니다. JSON.stringify(Answer)를 해보시면 아시겠지만 응답 데이터와 동일한것을 확인하실 수 있습니다.

    객체를 응답하지 말고 문자열로 텍스트를 생성한 후 응답하시면 해결 될 것 같습니다
    2019.07.17 19:06 신고
  • 프로필사진 버스API Answer를 String으로 반환하니까 개행문자가 먹히네요 ㅠㅠ감사합니다
    덕분에 해결했습니다.
    2019.07.18 15:31
  • 프로필사진 왕초보 샘플조차도 따라하기 힘든 초보입니다.
    localhost:9090/keyboard까지는 따라했는데 그다음 부터 막히네요.
    카카오i 오픈빌더의 스킬부분부터 설명부탁드려도 될까요.
    어떻게 다음을 진행해야할지.....영....
    2019.08.18 16:00
  • 프로필사진 BlogIcon 이근둥 오픈빌더의 경우 기존 플러스친구와 구현해야할 내용이 다르기 때문에 새로 강좌를 준비해 보도록 하겠습니다 ㅠㅠ 2019.08.18 21:22 신고
댓글쓰기 폼