TIPS

[TIPS] 웹훅을 이용한 슬랙봇 만들기

Gray Park 2020. 8. 28. 16:41
728x90
반응형

 

슬랙봇을 만들기 위해 어제, 오늘 삽질을 좀 했다.

내가 만들고 싶은 슬랙봇은 특정 시간에 메시지를 전송하는 리마인더 슬랙봇이다.

주로 출퇴근, 점심/저녁 시간을 알려주는 데에 사용하고자 하였다.

 

슬랙봇에는 RTM ( Real Time Message ) 기능을 이용하는 봇과 Schedule 을 이용하여 특정 시간에 정해진 메시지를 전송하는 웹훅 ( WebHook ) 봇이 있다. 오늘 포스팅에서는 웹훅과 schedule 을 이용하여 원하는 시간에 특정 메시지를 전송하는 봇을 만들고,  heroku를 이용하여 별도의 서버 없이 계속해서 운용되는 봇을 만들어 보겠다.

 

Setup

웹훅을 활용하기 위해 기본적인 설정이 필요하다. 내가 참여하고 있는 슬랙의 Apps/로 이동한다. 슬랙 앱이나 웹에서 채널이름을 클릭하여 Administration - Manage apps를 통해 이동할 수 있다.

상단의 검색바에서 webhook 을 검색하자!

가장 상단에 나오는 Incoming WebHooks 를 선택한다. 

왼쪽의 Add to Slack 버튼을 눌러주고 다음 페이지에서, 적용할 채널을 선택한다.

테스트를 위해 general 채널을 선택하였다. Add Incoming WebHooks integration 버튼을 클릭하면 Set up 페이지로 이동한다.

스크롤을 내리다보면 Example이 있는데, 해당 내용을 복사한 뒤 

터미널에 붙여넣고 엔터를 친다. ( 아직 실행하지 마시오 )

그럼 예시와 같은 webhookbot이 메시지를 보낸 것을 확인할 수 있다

오... 귀요미....


주의 이 때 채널 이름을 잘못 지정하면 대참사가 난다

Examples에 기본으로 지정된 채널이 슬랙에서 가장 최상단의 채널이므로 그냥 엔터치면 아래와 같이 잘못된 어그로를 끌 수 있다.

채널 이름을 변경하여 general 정도로 변경한 뒤, 엔터를 치자.


그럼 이제 내가 원하는 이미지와 이름을 가지고 내가 원하는 메시지를 보내는 봇을 만들어보자!!

 

우선, 이미지와 이름은 간단히 설정할 수 있다

아까 Example 을 복사했던 페이지에서 스크롤을 내리면, 이름과 아이콘을 커스터마이징할 수 있는 곳이 있다.

내가 원하는 사진과 이름으로 변경해주자! 아래의 Preview 를 확인한 뒤, 마음에 들면 Save Settings 버튼을 눌러 세팅을 저장해준다!

Set up for Message

이제부터는 약간의 코딩이 필요하다. 먼저 슬랙봇을 만들 폴더를 생성해준 뒤, 필요한 패키지를 다운받자. 아래의 코드를 순서대로 터미널에 입력한다

mkdir slackBot // slackBot 이라는 폴더 생성
cd slackBot // slackBot 폴더로 이동
npm init // pakage.json 생성
npm install slack-node --save // slack-node 패키지 설치 및 저장
npm install node-schedule --save // node-schedule 패키지 설치 및 저장
touch myDeer.js // myDeer.js 파일 생성
code . // 현재 directory를 기준으로 vscode 실행

 

메시지를 보내기 위해서는 위의 설정 페이지에서 제법 상단에 위치한 Setup Instruction의 WebHooks URL 이 필요하다.

 

이 url을 복사하여 아래처럼 코드를 작성해준다

import Slack from 'slack-node';
import schedule from 'node-schedule';

// WebHooks url
const url =
	'https://hooks.slack.com/services/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gf';

const slack = new Slack();
slack.setWebhook(url);

// create function to send message
const send = async (text) => {
	slack.webhook(
		{
			// bot name
			username: '식사시간을 알려주는 Deer',
			text: text,
			// channel, it can be replaced as '\"[channel_name]\"'
			// you can check the channel code from url
			// example: https://[yourSlack].slack.com/client/TTY23TY019/C012J5JPKQT
			// the last part of whole url such as 'C012J5JPKQT' is the channel code
			channel: 'C012J5JPKQT',
		},
		// function to send error message
		function (error, response) {
			console.log(response);
		}
	);
};

// Make sure this bot works successfully.
send('Deeeeeeeeeeeeeeeeeeeeeeeer');

/* 
   Set a schedule you want
   schedule.scheduleJob([option sec], min, hours, days, months, period)
   * means everything
*/

// Set time to check now ( set time 16:32 pm )
schedule.scheduleJob('32 16 * * 1-5', function () {
	send('점심을 먹을 시간이디어');
});

Ctrl + S 로 저장한 뒤, pakage.json 파일로 이동하여 아래와 같이 "type": "module", 을 추가한다

터미널을 열어 node myDeer.js 를 입력하고 엔터를 친다. 아래와 같은 글이 나타나고, 신호 대기 상태가 된다.

그리고 설정해둔 채널로 이동해 확인해보면!!!!!

봇이 정상 작동하는 걸 확인할 수 있다.

이제, 코드 가장 아래의 시간설정 부분을 원하는 시간으로 맞춰주고 저장하면 봇 설정이 끝이 난다!

// Set time to have a lunch ( Set time 12:00 pm )
schedule.scheduleJob('00 12 * * 1-5', function () {
	send('점심을 먹을 시간이디어');
});
// Set time to have a dinner ( Set time 06:00 pm )
schedule.scheduleJob('00 18 * * 1-5', function () {
	send('저녁을 먹을 시간이디어');
});

 

이 봇을 활용하기 위해서는, 터미널을 이용해 이 봇을 실행시킨 상태로 유지해야 한다! 매일 점심 전에 봇을 실행시켜두는 짓은 귀찮으니까, heroku를 활용해서 계속 돌아가도록 만들어주자. 그리고 그 내용은 다음 이 시간에...

728x90
반응형