본문 바로가기

Programming Project/Node로 카톡-페메봇 만들기

Node.js로 카카오톡 플러스 친구 봇 만들기 03 (api 응답 서버 제작)


투명한 기부를 하고싶다면 이 링크로 와보세요! 🥰 (클릭!)

바이낸스(₿) 수수료 평생 20% 할인받는 링크로 가입하기! 🔥 (클릭!)

이 글은 


Node.js로 카카오톡 플러스 친구 봇 만들기 01 (https://wingnim.tistory.com/entry/Nodejs%EB%A1%9C-%EC%B9%B4%EC%B9%B4%EC%98%A4%ED%86%A1-%ED%94%8C%EB%9F%AC%EC%8A%A4-%EC%B9%9C%EA%B5%AC-%EB%B4%87-%EB%A7%8C%EB%93%A4%EA%B8%B0-01)


로 부터 읽으면 되고


Node.js로 카카오톡 플러스 친구 봇 만들기 02 (https://wingnim.tistory.com/entry/Nodejs%EB%A1%9C-%EC%B9%B4%EC%B9%B4%EC%98%A4%ED%86%A1-%ED%94%8C%EB%9F%AC%EC%8A%A4-%EC%B9%9C%EA%B5%AC-%EB%B4%87-%EB%A7%8C%EB%93%A4%EA%B8%B0-02?category=750003)


에서 이어진다.


지난번엔 keyboard로의 요청에 응답했다면


이번엔 사용자가 버튼을 클릭했을 때 답장을 하는 부분을 만들어 볼 것이다.


아래 글을 제대로 이해할 수 있을 사람이라면 이미 다른 고오오급스러운 글을 읽고 있겠지만


당신은 고오오급 프로그래머들이나 이해할 수 있게 쓰여진 글을 보며 그나마 따라할 수 있는 글이 이 글 밖에 없어 울며 겨자먹기로 이 글을 볼 수도 있기에,


아래 글을 이해하지 못해도 따라할 수 있도록 역시 글을 진행해 나가도록 하겠다.


그래도 한번 읽어나 보자.





그냥 사용자가 서버에게 무슨 말을 하면 (우리가 저번 글에서 만든 소스코드로 치면 2지선다 중 하나를 고르게 되면)


그에 대한 답을 보내주기 위해 /message 라는 url을 이용해야 하는 것 같다.




조금더 자세하게 이런 형식으로 보내면 된다는데, 


뭐 이해 안가더라도 너무 겁먹지 말고 그냥 따라해보도록 하자.



일단 저번글과 같이 message라는 url에 반응할 수 있도록 1번과 2번 주석 부분 소스를 추가했다.





그리고 message.js를 다음과 같이 추가했다.


우선 router.post라는 점이 달라졌는데, 그건 그냥 카카오에서 post 형식으로 받으라고 해서 따르는 것 뿐이다ㅠ


그냥 뭔지 몰라도 걍 하라니까 하나부다 하자.


카카오에서 보내준 정보는 우리 소스코드 중 req.body에 들어있다.


좀 더 자세한 디테일은 위의 소스 주석과 api documentation을 읽어보도록 하자.


그러면 사용자의 요청에 따라 답장을 어떻게 보내면 될까?


아래 소스를 따라 치면서 설명을 읽도록 하자....(엉엉 ㅠㅠㅠㅠㅠ)





1 - 카카오에서 보내준 정보를 object라는 곳에 담았다.

2 - 카카오 플러스친구는 우리가 답장을 보내주면서, 사용자에게 또 다시 어떤 선택지를 줄 것인지 결정할 수 있다.

쉽게 생각해서 우리가 답장 보내고 나서 다시 2지선다 질문지를 던져줄 포멧을 만들어 놓는 것이다.

3 - 카카오에서 보내준 정보를 object에 담았다면, 우리가 보낼 정보를 res_object에 담을 것이다 .

4 - 아무리 몰라도 이 글을 읽는다면 if문 정도는 알았으면 하는데...ㅠㅠ 여튼 대충 보면 알겠지만 사용자가 "노래 추천해줘." 라는 입력을 했더라면 

답장으로 "조지 - boat 어때?" 라고 보내줄 res_object를 저장한다. (이제 보니 어떄네...)

5 - 마찬가지로 네 노래로 추천해달라고 하면 Jinyo 수면증을 추천해준다.

참고로 난 jinyo라는 싱어송라이터 명으로 활동중이고 얼마전에 수면증이라는 노래를 발매했다


6 - 그리고 그 res_object를 답장으로 보내준다.


여기까지 짰으면




다시 아까 폴더로 가서 터미널 창을 열고 


npm install 


을 하자.


이거는 아까 오지게 생성된 코드의 의존성 패키지들을 다 인스톨 하는건데


몰라도 되는 설명이다. 그냥 무시하자




다 끝났다면 npm start 를 쳐보자 ^_^


다음과 같은 결과가 나오고 



지금 놀랍게도 당신의 컴퓨터에서 서버가 구동중이다 ㅋ_ㅋ



못 믿겠다면

http://localhost:3000 을 접속해보자.


이케 뜨는거면 지금 구동중이 맞는거다.

(만약 뭔 오류가 떴으면 아래에 소스 줄테니까 복붙해보고 다시 해보셈 ㅠ_ㅠ)


아 조금 실감이 안나나? ^0^7


그러면

http://localhost:3000/keyboard를 접속해보자


헤...헤헷...헤헷....


뭔가 만들었던 내용들이 쭉쭉 나오지 않음?


헤헷...헤헷....



안되는분들은 소스 복붙해줄테니까 함 다시 확인해보고


사실 내 컴퓨터를 서버로 쓰기엔


내 컴퓨터를 24시간 켜놓기 애매하지 않음?


그래서 다음 시간엔 호스팅 서버에 내 서버를 올려놓는 법에 대해서 알려주도록 하겠음.



app.js


var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var keyboardRouter = require('./routes/keyboard');
var messageRouter = require('./routes/message'); // 1

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/keyboard', keyboardRouter);
app.use('/message', messageRouter); // 2

// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};

// render the error page
res.status(err.status || 500);
res.render('error');
});

module.exports = app;


message.js


var express = require('express');
var router = express.Router();

/* 사용자의 답장이 들어왔을 때 */
router.post('/', function(req, res, next) {
const object = {// 1
user_key: req.body.user_key, // 메시지를 발송한 user을 식별할 수 있는 key
type: req.body.type, // user가 보낸 message의 형태. text , photo로 이루어짐
content: req.body.content // user가 보낸 메시지 내용.
};
const menu = { //2
type: 'buttons',
buttons: ["노래 추천해줘.", "네 노래로 추천해줘."]
};
var res_object; //3
if(object.type=="text")
{
if(object.content=="노래 추천해줘."){ //4
res_object = {
"message": {
"text": '조지 - boat 어때?'
},
"keyboard": menu
};
}
else if(object.content=="네 노래로 추천해줘."){ //5
res_object = {
"message": {
"text": 'Jinyo - 수면증 어때?'
},
"keyboard": menu
};
}
else{
res_object = {
"message": {
"text": object.content
},
"keyboard": menu
};
}
}
res.set({ //6
'content-type': 'application/json'
}).send(JSON.stringify(res_object));
});

module.exports = router;