[Node.js] node를 이용한 slack 알림봇 구현하기

Sean park·2020년 4월 20일
2
post-custom-banner

요즘 회사 또는 기타 단체에서 커뮤니케이션을 위한 툴로 Slack을 많이 사용하고 있습니다. 제가 공부하고 있는 부트캠프에서도 slack을 사용하고 있습니다. 온라인으로 진행하는 부트캠프 특성상 출퇴근하는 앱을 이용해서 출석을 확인합니다.
하지만, 실제로 출석은 했지만 까먹고 앱에서 출근 처리를 하지 않으면 출석 반영이 되지 않기때문에 앱으로 출근 처리를 꼭 해줘야 하는데요. 이를 방지하기 위해 단체 슬랙방에 아침, 저녁으로 슬랙방에 알림을 해주는 bot을 만들어 보았습니다.

먼저 슬랙봇을 만들기 전에 필요한 라이브러리를 설치해줍니다. (node.js 관련 설치는 생략하겠습니다)

npm 명령어를 통해 slack 모듈을 설치해줍니다.

$npm install slack-node --save

slack 모듈 설치를 완료했다면 우리는 일정한 시간이 되면 알림을 해주는 봇을 만들기 때문에
node-scheduler를 사용할 것입니다.

$npm install node-schedule --save

자 이제 슬랙봇을 만들기 위한 모듈을 모두 설치하였으니 슬랙봇을 만들어보겠습니다.

const Slack = require('slack-node'); 
const schedule = require('node-schedule');

apiToken = process.env.SLACK_TOKEN||'Your Token';
const slack = new Slack(apiToken);
const send = async(message) => {
  slack.api('chat.postMessage', {
      username: 'slack bot',  // 슬랙에 표시될 봇이름
      text: message,
      channel: 'general',  // 메시지가 전송될 채널
      icon_emoji: 'slack'   // 슬랙봇 프로필 이미지
    }, function(err, response){
      console.log(response);
    });
}

send('슬랙에 메시지를 전송합니다.');

schedule.scheduleJob('50 8 * * 1-5', function(){
    send('출근!');
});
schedule.scheduleJob('5 9 * * 1-5', function(){
    send('퇴근!');
});

제가 만든 슬랙 봇 코드입니다.

코드의 시작부분에서 require를 통해 좀전에 설치한 모듈들을 불러왔습니다.
그리고 슬랙에서 api token을 발급받아 (토큰 발급 과정은 생략하겠습니다) send 부분에 위의 코드와 같이 자신의 슬랙 정보를 입력해 줍니다. 그리고 send에 메시지를 넣어 실행하면 슬랙방에 메시지가 전송됩니다.

슬랙 봇의 스케줄링 관련 코드를 한번 살펴보겠습니다.

schedule.scheduleJob('50 8 * * 1-5', function(){
    send('출근!');
});
schedule.scheduleJob('5 9 * * 1-5', function(){
    send('퇴근!');
});

위의 코드는 일정 주기로 알림을 보내는 부분을 설정해놓은 코드입니다.
제가 작성한 스케줄에 들어가는 시간 설정은 cron 표현식으로

sec(option) / min / hour / day / month / day of week

다음과 같이 작성합니다.
저는 매주 평일 아침 8시 50분과 저녁 6시 5분에 알림이 가도록 설정해 놓았습니다.
요일을 표시하는 부분에는 1-5라고 설정해 놓았는데요. 0과 7은 일요일이고 1부터 월요일이 시작됩니다.
요일은 숫자대신 mon,tue... 와 같이 문자로 설정할수도 있습니다.

Issue

슬랙봇의 스케줄링을 위와 같이 설정하였는데 새벽에 알림이 오고 저녁에 출근 메시지가 와서 알아보니 제가 호스팅한 서비스의 서버 위치가 미국에 있어 한국과 시차가 발생하는 이슈가 있었습니다. 그래서 다음과 같이 코드를 변경해 주었습니다

schedule.scheduleJob('50 23 * * sun,mon,tue,wed,thu', function(){
    send('출근!');
});
schedule.scheduleJob('5 9 * * 1-5', function(){
    send('퇴근!');
});
profile
제 코드가 세상에 보탬이 되면 좋겠습니다.
post-custom-banner

0개의 댓글