나만의 LINE 챗봇(Cloud LINE Bot) 서비스 구축하기

Chang Hwan Jang
NAVER CLOUD PLATFORM
20 min readApr 22, 2019

네이버 클라우드 플랫폼을 활용한 Cloud ChatBot Service 구축하기

네이버 클라우드 플랫폼에서 챗봇 서비스를 구축하세요.

2018년 가장 관심도가 높아지고 있는 IT 서비스 중에 하나는 바로 AI(Artificial Intelligence)를 활용한 챗봇(Chat Bot)서비스 구축일 것입니다. 이번 포스팅에서는 그 첫번째 주제로, LINE 메시지 개발 플랫폼과 네이버 클라우드 플랫폼의 상품(서비스)을 활용한 챗봇 서비스 구축 방법에 대해 설명을 드리고, 단계별로 실제 구축해 볼 수 있도록 내용을 구성해 보았습니다.

LINE@ 기능 소개 및 설명 (https://at.line.me/ko)

‘채팅봇’, ‘챗봇’이 무엇인가요?

챗봇’이란 쉽게 말해 ‘채팅하는 로봇’을 말합니다. 정해진 응답 규칙에 따라
사용자 질문에 응답할 수 있도록 만들어진 시스템입니다.

전자게시판이나 통신망에서 여러 사용자가 다양한 주제를 가지고 실시간
모니터링 화면을 통해 대화를 나누는 채팅과, 자동으로 사람이 하던 일을 수행하는 기계인 로봇에서 한 글자씩 따와 만든 용어입니다.

인공지능을 기반으로 사람과 자동으로 대화를 나누는 소프트웨어라고 보면 됩니다. (출처 : 네이버 캐스트 -채팅 봇)

나만의 챗봇 서비스, 구성이 어떻게 되나요?

네이버 클라우드 플랫폼을 활용해 LINE 챗봇 서비스를 구현하기 위해선 크게 다음과 같은 구성 요소가 필요합니다. 각 요소별 구체적인 구현 방법 및 단계는 좀 더 아래쪽에 이어서 설명 드리겠습니다.

네이버 클라우드 플랫폼 Compute 상품 (Server / ACG /Public IP / DNS)

네이버 클라우드 플랫폼 Compute 상품

LINE@, LINE Developer Center 계정 가입 및 등록

LINE@ 계정 등록

Let’s Encrypt Free 인증서 생성 및 등록

Let’s Encrypt 개발 사이트

Nginx HTTPS 설치 및 구성

Niginx 사이트

Bot API Server(Express 서버) 구현

Express 사이트

LINE Chat Bot 서비스 시작

LINE Chat Bot 서비스 실행 예제

나만의 챗봇 실제 서비스 구축 절차는 어떻게 되나요?

네이버 클라우드 플랫폼의 Iaas 상품 서비스를 활용하여 실제 LINE Bot 구현까지 단계별로 구축 및 설치/설정 방법에 대해 알아보고, 실제 구축된 챗봇 서비스를 바탕으로 LINE 메신저를 사용하여 네이버 클라우드 플랫폼의 사용자 가이드를 모바일에서 확인할 수 있는 서비스 구현 방법을 알아보겠습니다.

1. LINE@ 계정 만들기

LINE@ 사이트 접속 예제
  • [LINE@ 계정 만들기]를 클릭합니다. 업종을 선택 후 [계속]버튼을 클릭합니다.
LINE@ 정보 입력 예제
  • 입력한 내용을 확인하고, [제출] 버튼을 클릭합니다.
LINE@ 계정 생성 확인 예제
  • 간략한 절차를 통하여 계정을 생성할 수 있습니다.
LINE@ 계정 생성 확인 예제

2. LINE@ 계정 설정하기

  • 위의 최종단계에서 [Manager 로그인 하기]를 클릭하면, 생성한 Bot 계정의 관리화면이 실행됩니다.
LINE@ 계정 관리화면 예제
  • 좌측 메뉴에서 [계정설정] > [Message API 설정]을 클릭 후 [API 켜기]를 실행합니다.
LINE@ API 설정 화면
  • 아래와 같이 [Web Hook] 설정을 [허용]으로 선택 후 [LINE Developers]를 클릭합니다.
LINE@ API 설정 화면
  • 해당 정보 중 [Web Hook URL], [Channel Token] 정보를 확인할 수 있으며, 추후 Web Message 서비스 개발 후 사용할 정보입니다. (실제 서비스 개발 시 확인 방법에 대해서 한번 더 설명을 할 예정이며, 현재 단계에서는 어떤 정보가 있는지 확인만 하시면 됩니다.)
LINE@ Channel 설정 화면
  • LINE Bot 계정에 대한 추가 상세 정보는 아래의 URL을 참고하셔서 입력하실 수 있습니다. (LINE Bot 계정 입력 방법)
LINE@ Channel 관리 화면

3. 네이버 클라우드 플랫폼 Compute 상품을 이용하여 인프라 구축하기

  • 웹 서비스가 가능한 사양으로 서버를 생성합니다. (해당 글에서는 생성 단계에 대한 상세한 설명은 생략하고, 아래의 사용자 가이드로 설명을 참고하면 됩니다.

아래의 사용자 가이드를 참고하시면, 쉽게 서버를 생성하실 수 있습니다.
[ 사용자 가이드 ] http://docs.ncloud.com/ko/compute/compute-1-1-v2.html

네이버 클라우드 플랫폼 서버 생성 가이드
네이버 클라우드 플랫폼 Public IP 생성 가이드
네이버 클라우드 플랫폼 DNS 생성 가이드
  • 보유하고 있는 DNS가 없을 경우 무료 도메인 생성 후 등록하는 것을 권장합니다.
네이버 클라우드 플랫폼 DNS 사용 예제

4. Nginx서버에 SSL 인증서 설치하기

  • 무료 인증서 중 여러 스폰서가 참여하고, 지속적으로 HTTPS 보급을 위해 노력하고 있는 Let’s Encrypt를 사용하여 SSL 설치를 진행합니다.
Let’s Encrypt 사이트
  • Let’s Encrypt 설치 방법은 여러가지가 있으며, 여기서는 git clone으로 직접 설치하여, Nginx에 적용하는 방법을 설명하고자 합니다.
git clone https://github.com/letsencrypt/letsencrypt
  • 위와 같이 설치가 완료되면, 의존성을 확인해야 합니다.
./letsencrypt-auto --help
  • 아래와 같이 수동 옵션으로 SSL 설치를 진행합니다. Email Adress,
    Domain Name 등을 입력하여 설치를 진행합니다.
./letsencrypt-auto certonly --manual
  • 최종 단계에서 실제 Nginx Web 서버에 Key 파일을 설정 후 유효성을 확인하는 단계가 완료되어야 SSL 인증서 발급이 완료됩니다.
  • 아래와 같이 다른 기고문에서 발췌한 Let’s Encrypt 설치 완료 시 내용을
    확인할 수 있습니다.
Let’s Encrypt 설치 완료 (출처 : https://blog.outsider.ne.kr/1178)
  • 설치 완료 후 아래와 같이 두 가지 단계를 반드시 확인해야 합니다.
  • 아래의 명령어를 통해 파일을 생성합니다.
$NGINX_DOC_ROOT/.well-known/acme-challenge/{KEY_FILE_NAME}

예제에서는 “NV2J4iTEiZ6NJfi5cME3zOrClWlK-nOVMC0daAHcV84” 파일 이름으로 생성하였습니다.

Let’s Encrypt 설치 확인 #1

“NV2J4iTEiZ6NJfi5cME3zOrClWlK-nOVMC0daAHcV84” 파일의 내용에 해당 Key 내용을 복사하여 저장합니다.

cat NV2J4iTEiZ6NJfi5cME3zOrClWlK-nOVMC0daAHcV84
Let’s Encrypt 설치 확인 #2
  • 위의 인증 작업이 정상적으로 완료 되었다면, 아래와 같이 해당 도메인
    관련 파일이 생성됩니다.
Let’s Encrypt 인증서 설치 파일 확인
  • Nginx Config 파일에 아래의 몇 가지 항목을 위의 디렉터리와 파일의
    정보로 업데이트 하면 됩니다.
vi nginx.conf
ssl_certificate, ssl_certificate_key 항목 수정
...(중략)
ssl_certificate /etc/letsencrypt/live/bot.mycloud1.ga/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/bot.mycloud1.ga/privkey.pem;
...(후략)
  • “openssl dhparam -out dhparam.pem 2048” 명령어를 실행하여 생성한 파일을 아래와 같이 설정합니다.
penssl dhparam -out dhparam.pem 2048
openssl 명령어 수행
  • 마지막으로 위에서 발급받은 “chain.pem” 파일을 설정합니다.
chain.pem 파일 적용
  • 아래와 같이 Nginx 서버를 호출하면, HTTPS가 적용된 페이지를 실행하는 것을 확인할 수 있습니다.
SSL 적용된 Nginx 서버 실행

5. LINE Bot 연동을 위한 Node JS 서버 개발하기

아래와 같이 LINE Chat Bot 연동을 위해 SSL이 적용된 Express 서버와 LINE Messenger Reply를 위한 라이브러리 구현 모듈을 간략하게 설명합니다.
(전체 소스는 정리가 되는대로 github.com에 게시할 예정입니다.)

  • Node Module 설정, JSON Parser 설정, SSL 파일 설정을 구현합니다.
  • LINE Chat Bot Hooking Server를 생성합니다.
  • Return 객체에 대한 Model을 생성합니다.
  • LINE Chat Bot Hooking 서버를 생성합니다.
  • Return Message에 대한 Model 객체를 생성합니다.
  • LINE Messenger로 부터 전달된 Command를 분석 후 처리 모듈을
    작성합니다.
  • 443 포트로 HTTPS 서버를 실행합니다.
// Node Module
const https = require('https');
const express = require('express');
// JSON Parser
const bodyParser = require('body-parser');
const fs = require('fs');
// LINE Bot Message Reply Module
const reply = require('./reply');
// Create Express Server
var app = express();
// SSL File Settings
var https_options = {
ca: fs.readFileSync('/etc/letsencrypt/live/bot.mycloud1.ga/chain.pem', 'utf8'),
key: fs.readFileSync('/etc/letsencrypt/live/bot.mycloud1.ga/privkey.pem', 'utf8'), cert: fs.readFileSync('/etc/letsencrypt/live/bot.mycloud1.ga/fullchain.pem', 'utf8')
};
app.use(bodyParser.json());// BOT Hooking API Setting
app.get('/webhook', function (reqeust, response) {
response.writeHead(200, {'Content-Type' : 'text/html'});
response.end('<h1>Changhwan - mysm0722@gmail.com<h1>');
});
// @help message
var helpText =
"[ NCP Bot Help ] \n" +
"@ncp : call hello ncp \n" +
"@guide || @g : view NCP User Guide \n" +
"@portal || @p : view NCP Portal Site \n" +
"@help || @h : view action list of momo \n" +
"[ NCP Bot Help ]";
var helpArrayText = [{
"type": "text",
"text": helpText
}];
// @guide message
var guideUrlText =
"[ NCP User Guide ]\n" +
"NCP User Guide : http://docs.ncloud.com/ko/\n";
var guideUrlArrayText = [{ "type": "text",
"text": guideUrlText
}];
// @portal message
var portalUrlText =
"[ NCP Portal Site ]\n" +
"NCP Portal Site : http://www.ncloud.com/\n";
var portalUrlArrayText = [{ "type": "text",
"text": portalUrlText
}];
// @error message
var errorText =
"Hi~ This NCP LINE Bot.\nThis Command is not supported.\n";
var errorArrayText = [{
"type": "text",
"text": errorText
}];
// Send Bot Web Hooking Message
app.post('/webhook', function (request, response) {
var eventObj = request.body.events[0];
var source = eventObj.source;
var message = eventObj.message;
var CHANNEL_ACCESS_TOKEN = '{YOUR_CHANNEL_TOKEN}';
// request log
console.log('[request]', request.body);
console.log('[request source] ', eventObj.source);
console.log('[request message]', eventObj.message);
// Message Switcher
if(message.type = "text" && message.text.indexOf("@ncp") != -1){
reply.send(CHANNEL_ACCESS_TOKEN, eventObj.replyToken, errorArrayText );
} else {
var cmd = message.text.split('@')[1];
console.log('[command]', cmd);
if(typeof cmd !== "undefined" && cmd != ""){
if(cmd == "h" || cmd == "help"){
reply.send(CHANNEL_ACCESS_TOKEN, eventObj.replyToken, helpArrayText);
} else if(cmd == "guide" || cmd == "g"){
reply.send(CHANNEL_ACCESS_TOKEN, eventObj.replyToken, guideUrlArrayText);
} else if(cmd == "portal" || cmd == "p"){
reply.send(CHANNEL_ACCESS_TOKEN, eventObj.replyToken, portalUrlArrayText);
} else {
console.log('reply tok : ' + eventObj.replyToken);
console.log('ch tok : ' + CHANNEL_ACCESS_TOKEN);
reply.send(CHANNEL_ACCESS_TOKEN, eventObj.replyToken, errorArrayText);
}
}
response.sendStatus(200);});// Create NodeJS Server
https.createServer(https_options, app).listen(443, function(){
console.log("@NCP Support Bot Server is Running");
});
  • LINE Messenger 전송을 위한 Reply 라이브러리를 간략하게 설명합니다.
  • Express Server에서 전달된 내용을 LINE Messenger로 전달을 위해
    LINE Bot 서버 URL로 정해진 프로토콜에 의해 POST로 전달하는
    라이브러리를 작성합니다.
const requestSender = require('request');
module.exports.send = function (channelAccessToken, replyToken, messages) {
console.log('reply.channelAccessToken : ' + channelAccessToken);
console.log('reply.replyToken : ' + replyToken);
console.log('reply.messages : ' + messages);
var headers = {
'Content-type' : 'application/json',
'Authorization' : 'Bearer ' + channelAccessToken
};
// LINE Bot Reply Server URL
var options = {
url: 'https://api.line.me/v2/bot/message/reply',
method: 'POST',
headers: headers,
json: {
replyToken : replyToken,
messages : messages
}

};
// LINE Bot Reploy Request/Response
requestSender(options, function (error, response, body) {
console.log('req.Sender.options : ' + options);
console.log('req.Sender.body : ' + body);
console.log('response', response.statusCode);
if (!error && response.statusCode == 200) {
console.log(body)
} else {
console.log('requestSender', error);
}
})};

6. 네이버 클라우드 플랫폼 LINE Bot 실행하기

  • LINE@ Manager에서 계정 정보를 확인하면, 아래와 같이 LINE Bot QR Code를 확인할 수 있습니다.
My Chat Bot QR Code
  • 아래와 같이 LINE@ Manager에서 생성한 정보가 실제 LINE 메신저에서
    확인할 수 있습니다.
My Chat Bot Manager in LINE@
  • 메신저 친구로 추가하면, LINE 메신저에서 아래와 같이 추가된 정보를
    확인할 수 있습니다.
My Chat Bot 친구 추가 화면
  • 아래와 같이 NCP Support Bot API에 정의된 명령어가 전송되면 해당하는 정보를 전달해 줍니다.
My Chat Bot 실행 화면

네이버 클라우드 플랫폼 상품 및 서비스는 어떻게 사용할 수 있나요?

네이버 클라우드 플랫폼의 Compute 상품 및 서비스 플랫폼을 사용하기 위해서는 아래와 같이 네이버 클라우드 플랫폼 포털 사이트 및 사용자 가이드를 참고하시면 쉽게 사용하실 수 있습니다.

글을 마무리 하며..

네이버 클라우드 플랫폼의 Compute 상품을 활용하여, LINE 메시지에 적용이 가능한 챗봇 서비스를 구현해 보았습니다.

이번 LINE Bot 서비스 구축을 통해 서버 생성, DNS 생성 등의 기존에 복잡한 인프라 서비스 관련 설정을 사용자 가이드를 참고하여 쉽고 빠르게 적용이
가능하였습니다.

LINE Bot 서비스를 활용하여 직접 LINE Chat Bot을 구현하여, 메신저까지
연동 개발을 진행하면서 네이버 클라우드 플랫폼에서도 사용자 및 개발자가 바로 활용해 볼 수 있는 우수 사례가 많이 제시될 것으로 기대하면서 이 글을 마칠까 합니다.

다른 포스팅에서도 네이버 클라우드 플랫폼 기반의 안정적인 서비스를
구축할 수 있는 사례들을 소개하고, 설명을 드리겠습니다.

끝까지 읽어 주셔서 감사합니다.

--

--