[Node.js] 슬랙 봇을 만들어 특정 채널에 보내는 메세지 자동화 하기

흑수·2022년 6월 29일
2

Node.js

목록 보기
3/3

서비스를 유지하면서 매일 하루하루 유저의 변화를 확인해서 슬랙으로 팀원들에게 알려줘야 했습니다.

어느 순간 이 과정이 귀찮기도 했고, 자동으로 디비에서 확인해서 슬랙에 메세지를 보내는 봇을 만들기로 했습니다.


🤖 slack 봇 생성하기

우선 슬랙 api 홈페이지에서 앱을 생성해서 등록해야 합니다.

✔️ 앱 생성

https://api.slack.com/apps

해당 페이지에서 슬랙의 App을 생성할 수 있습니다.

Create New App 버튼을 누르면 아래 이미지가 나오게 됩니다.

여기서 위에 있는 From scratch를 클릭해줍니다.

다음으로 앱 이름과 해당하는 workspace를 선택하고 Create App을 클릭해서 생성합니다.

✔️ 권한 설정 및 토큰 발급

앱을 생성하고 왼쪽에 있는 사이드 메뉴를 살펴보면 OAuth & Permission을 확인할 수 있습니다.

결국 slack의 API를 호출해서 봇을 이용해 메세지를 날리려면 토큰이 필요합니다.
해당 토큰의 권한 설정을 우선적으로 해주고, 토큰을 발급 받아야 합니다.

아래쪽으로 스크롤을 내리면 Scope를 찾을 수 있는데 저희는 봇을 이용할거니 Bot Token Scopes에 저희가 이용하려는 서비스의 권한을 추가해주어야 합니다.

서비스의 권한 설정은 아래 페이지에서 참고할 수 있습니다.

https://api.slack.com/methods

저희는 메세지 전송을 위한 봇을 만들거기 때문에 chat.postMessage의 권한을 추가해야 합니다.

위의 사진을 보면 Bot tokens에는 chat:write가 꼭 필요하니 이것을 추가해줍니다.

Bot Token Scopes에서 Add an OAuth Scope를 클릭해 해당 옵션을 추가합니다.

권한 설정을 한 뒤, 스크롤을 다시 위로 올리면 이전에는 잠겨 있던 OAuth Tokens for Your Workspace가 활성화 됐을겁니다.

Install to Workspace를 클릭해줍니다.

해당 화면이 나오면 허용을 눌러줍니다.

그럼 Bot User OAuth Token을 발급 받을 수 있습니다.

✔️ 채널 ID 확인

특정 슬랙 채널에 메세지를 보내기 위해서는 채널 ID가 필요한데 슬랙 앱을 통해서 다음과 같이 확인할 수 있습니다.

메세지를 보내기 원하는 채널에 우클릭을 하고 링크 복사를 해준 뒤, 해당 복사 내용을 확인했을 때 마지막에 있는 것이 채널 ID입니다.

https:// ~ / XXXXXXXXXX

해당 ID를 잘 기억해둡시다.


슬랙 채널에 봇 추가

생성한 봇을 메세지를 보내고 싶은 채널에 추가해야 합니다.

왼쪽 사이드 메뉴를 내려서 앱 추가를 해줍니다.

본인이 만든 App을 확인해 추가해주면 다음과 같이 추가가 됩니다.

해당 App을 누르면 오른쪽과 같이 나오는데 이름 옆에 있는 것을 눌러줍니다.

이 앱을 채널에 추가 버튼을 눌러줍니다.

메세지를 보내고 싶은 채널을 선택해 추가합니다.

채널에 들어가보면 짜잔 제가 만든 App의 봇이 추가됐네요~!


서버에서 API 활용하기

토큰을 발급 받았으면 이제 API를 Node.js를 이용해 활용해봐야겠죠?

✔️ @slack/web-api

해당 깃헙 링크에서 더 자세한 내용 확인 가능합니다.

https://github.com/slackapi/node-slack-sdk

해당 라이브러리를 이용하면 slack의 api호출을 할 수 있습니다.
우선 라이브러리를 다운로드 받습니다.

npm i @slack/web-api

아까 권한을 볼 수 있는 탭에서 HTTP를 JavaScript로 바꾸면 다음과 같이 나옵니다.

이 라이브러리 안에 있는 WebClientapp.client를 대신하게 됩니다.

✔️ 구현

깃헙에 파일을 push 했기 때문에 토큰과 채널 ID를 숨기기 위해 .env파일에 저장을 해두었고 해당 내용을 process.env.~~ 를 통해 가져왔습니다.

  • slackBot.js
const { WebClient } = require('@slack/web-api')
const token = process.env.SLACK_TOKEN
const channel = process.env.SLACK_CHANNEL
const slackBot = new WebClient(token)

const sendTodayData = async () => {
	try {
    	/* 
       		처리하고 싶은 로직들을 작성해서 message작성을 합니다.
            
            저는 디비에서 유저수와 컨텐츠들을 긁어와서 갯수를 확인해서
            누적수를 카운트했고 당일 접속 인원수를 확인해
            메세지를 작성했습니다.
      
        */
        const message = '보내고 싶은 메세지는 여기에 작성하세요.'
        await slackBot.chat.postMessage({
            channel: channel,
            text: message
        })
    } catch (err) {
    	console.log(err.message)
    }
}
module.exports = sendTodayData

그럼 이제 slackBot.chat.postMessage를 통해 봇이 자동으로 해당 채널에 메세지를 보내게 됩니다.

✔️ 특정 시간에 메세지 보내기

여기서 특정 시간에 메세지를 전송하고 싶다?

[Node.js] node-schedule를 이용한 자동화 작업 (특정 시간에 콜백 함수 호출)

제가 작성한 글을 통해 확인할 수 있습니다.

저는 정각에 메세지를 보내는 함수를 만들었습니다.

  • schedule.js
const sendTodayData = require('./slackBot')
const schedule = require('node-schedule')
const slackJob = schedule.scheduleJob('0 0 0 * * *', () => {
    sendTodayData()
})

@slack/web-api, node-schedule 라이브러리와 슬랙 봇을 만들어 특정 채널에 메세지 보내는 것을 자동화 하는 방법에 대해 정리했습니다:)

profile
기록용

0개의 댓글