[Nodejs] 간단한 알림 slack bot 만들기

슬랙에 익숙해지기위해 슬랙에서 친구들 몇 명이 모여 BOJ 문제를 풀고 매일 푼 것을 인증하는 스터디(?) 를 진행하고 있다. 제출 방식은 매일 그 날짜에 올린 스레드에 캡쳐 사진을 커맨트 남기는 방식이다. 문제는 누군가 날짜를 올려준 이후에만 제출이 가능하다는 것. 이런 반복적인 기능은 컴퓨터가 하도록 해야겠다- 싶어서 슬랙을 더 활용해 볼 겸 슬랙봇을 만들어봤다. 우연히 얼마전에 공부를 시작한 node.js로 만들면 호환이 좋다고 해 바로 찾는 법을 구글링했다.

일단 튜토리얼이 굉장히 많다. 슬랙 자체에서도 튜토리얼을 올려주는 것 같다. 자세한 외부 모듈과 그들의 동작 원리는 제대로 보지 않았다. 그리고 대화가 가능한 챗봇을 만드는 법도 굉장히 많이 있어서 한 번 해볼까 했지만 일단 목적에 맞는 알림봇부터 만드는게 먼저다 싶어서 계속 진행했다.

슬랙에서 이미 봇을 만드는 모듈을 다양하게 제공하고있다. 내가 사용한 것은 slack-node, node-schedule 이다. 슬랙봇을 만들기 위해서는 먼저 슬랙의 app 설정을 들어가야 한다.
https://api.slack.com/
또는 '워크벤치 이름'.slack,com/apps 에서 app build 를 선택하여 만들 수 있다.
앱의 이름을 설정하고 워크 스페이스를 지정하면 해당 워크 스페이스에 앱이 하나 만들어진다. 생성 후 가장 먼저 보게되는 페이지는 Basic Information 탭이다.
Feature를 bot 으로 설정 하면 authority scope를 설정하라고 한다. 용도에 맞게 설정하면 되겠다. 나는 매일 정해진 시간에 메세지만 보내면 되는 봇이기 때문에 아래와 같이 설정했다.

설정을 마치면 토큰이 생성된다. 이 토큰이 봇 소스 코드에 쓰이니 복사해두어야 한다.
앱 설정 화면에서는 봇의 프로필 사진, 디스플레이 될 이름을 설정 할 수 있다. 설정을 마치면 이제 코딩할 차례다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
const Slack = require('slack-node'); 
const schedule = require('node-schedule');
 
apiToken = process.env.SLACK_TOKEN||'아까 생성했던 토큰';
const slack = new Slack(apiToken);
 
const send = async(message) => {
  slack.api('chat.postMessage', {
      username: '슬랙에 표시될 봇이름',
      text: message,
      channel: '메세지가 전송될 채널'
      icon_emoji: '슬랙봇 프로필 사진' 
    }, function(err, response){
      console.log(response);
    });
}
 
var now = new Date();
var week = new Array('일''월''화''수''목''금''토');
var month = now.getMonth()+1;
var date = now.getDate()+1;
 
schedule.scheduleJob('00 20 * * 1-5'function(){
    send(now.getFullYear()+'/'+month+'/'+date+' ('+week[now.getDay()+1]+') PS 현황 제출해주세요 :slightly_smiling_face:');
});
 
cs

코드는 생각보다 간단하다. 생성했던 token을 이용해 Slack() 객체를 선언하고, 정해진 시간 규칙에 따라 메세지를 출력하는 것을 도와주는 node-schedule 모듈을 사용해 rule을 지정한다.
schedule.scheduleJob 룰 설정은 아래와 같다.

*    *    *    *    *    *
┬    ┬    ┬    ┬    ┬    ┬
│    │    │    │    │    │
│    │    │    │    │    └ day of week (0 - 7) (0 or 7 is Sun)
│    │    │    │    └───── month (1 - 12)
│    │    │    └────────── day of month (1 - 31)
│    │    └─────────────── hour (0 - 23)
│    └──────────────────── minute (0 - 59) 
└───────────────────────── second (0 - 59, OPTIONAL)


스케쥴 메서드 안에 메세지를 출력하는 send() 메서드를 넣어놓으면 정해진 시간이 될 때마다 봇이 슬랙에 메세지를 보내게 된다.

그리고 packages.json 파일을 조금 수정해야 한다.

"engines": {
    "node": "8.x"
  },
 
"scripts": {
    "start": "node index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
cs

engines와 scripts 다음과 같이 수정한다. engines의 node는 자신의 노드 버전을 명시해주는 것이다. scripts 의 start는 이전 헤로쿠 버전에서는 Procfile 파일을 설정 파일로 사용했는데 지금은 쓰지 않는 듯 하다. 아무리 찾아도 없어서 삽질만 하다 오류를 검색해보니 헤로쿠 사이트에서 더이상 저 파일이 필수가 아니라는 공지글을 보게되었다.
scripts.start 속성을 바꾸지 않으면 web 으로 만들어지는데 우리가 만드는 것은 bot 이기 때문에 꼭 바꿔줘야 봇이 제대로 작동한다. ㅠ
서버를 실행했을 때 오류가 출력된다면 오류를 참고하여 혹시라도 설치해야 되는 모듈이 있으면 npm install 명령어로 설치해야 한다.

봇 만들기는 끝났으니 이제 서버에 올려 봇이 계속 작동하도록 해야 한다. 토스트 클라우드 서버를 아직 가지고 있지만 간단한 봇에는 Heroku를 쓰는 것이 적당해 보여서 처음으로 Heroku를 사용해봤다.
Heroku는 node.js로 봇을 만드는 공식 튜토리얼도 제공하고 있었고 생각보다 쉬운 연결법을 제공하는 것 같다. 나는 헤로쿠를 처음 써봐서 많이 헤맸다 ..

많은 도움을 받았던 링크는 아래 첨부한다.
먼저 Heroku에 들어가 가입한다.
https://heroku.com
가입후 CLI도 설치하자. 그리고 cmd를 켜 프로젝트 루트 폴더로 이동해 git 레파지토리를 생성한다.
>git init
.git 폴더가 생긴다. 그리고 이번엔 heroku를 실행해야 한다. ( 헤로쿠를 처음 실행하면 로그인하라는 알림이 나온다. 아까 만든 계정으로 로그인 하면 된다.)
>heroku create
로그인된 계정에 앱이 생성된다. 이름은 랜덤으로 부여된다.
>git remote -v
명령어를 입력했을 때 위에 생성된 heroku url이 출력되면 잘 연결이 된 것이다.
>git add .
>git commit -m "slackbot"
>git push heroku master
마지막 명령어를 입력하면 엄청나게 많은 코드가 출력되면서 앱이 빌드 될 것이다. 여기서 옛날 버전 헤로쿠 앱 배포를 보면
> heroku ps:scale web=0 worker=1
이런 코드를 입력해야 한다고 하는데 worker는 없는 속성이라는 오류만 출력된다. 이전에 scripts.start 속성을 수정하지 않았다면 여기서 더 진행 할 수 있는 방법이 없는 것 같았다. 나는 헤로쿠를 새로 만들어서 속성을 바꾸고 다시 연결했는데 그렇게 하지 않아도 수정할 방안이 있는지는 모르겠다.

내일 아침 9시에 메세지가 도착 한다면 성공이다. 헤로쿠 서버는 미국시간을 기준으로 해 시차 떄문에 시간이 제대로 설정 되었는지 잘 모르겠다. 하지만 뭐 파일을 수정해도 헤로쿠는 git 기반이기 때문에 add, commit, push heroku 만 해주면 된다. 관리가 참 편한 것 같다.

다음엔 채팅봇도 만들어 볼 생각이다.

https://medium.com/greenroom/the-slack-bot-tutorial-i-wish-existed-d53133f03b13
https://devcenter.heroku.com/articles/getting-started-with-nodejs#introduction (공식 튜토리얼)
https://story.pxd.co.kr/1262

No comments:

Powered by Blogger.