서비스를 유지하면서 매일 하루하루 유저의 변화를 확인해서 슬랙으로 팀원들에게 알려줘야 했습니다.
어느 순간 이 과정이 귀찮기도 했고, 자동으로 디비에서 확인해서 슬랙에 메세지를 보내는 봇을 만들기로 했습니다.
우선 슬랙 api 홈페이지에서 앱을 생성해서 등록해야 합니다.
해당 페이지에서 슬랙의 App을 생성할 수 있습니다.
Create New App
버튼을 누르면 아래 이미지가 나오게 됩니다.
여기서 위에 있는 From scratch
를 클릭해줍니다.
다음으로 앱 이름과 해당하는 workspace를 선택하고 Create App을 클릭해서 생성합니다.
앱을 생성하고 왼쪽에 있는 사이드 메뉴를 살펴보면 OAuth & Permission을 확인할 수 있습니다.
결국 slack의 API를 호출해서 봇을 이용해 메세지를 날리려면 토큰이 필요합니다.
해당 토큰의 권한 설정을 우선적으로 해주고, 토큰을 발급 받아야 합니다.
아래쪽으로 스크롤을 내리면 Scope를 찾을 수 있는데 저희는 봇을 이용할거니 Bot Token Scopes에 저희가 이용하려는 서비스의 권한을 추가해주어야 합니다.
서비스의 권한 설정은 아래 페이지에서 참고할 수 있습니다.
저희는 메세지 전송을 위한 봇을 만들거기 때문에 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입니다.
https://
~ / XXXXXXXXXX
해당 ID를 잘 기억해둡시다.
생성한 봇을 메세지를 보내고 싶은 채널에 추가해야 합니다.
왼쪽 사이드 메뉴를 내려서 앱 추가를 해줍니다.
본인이 만든 App을 확인해 추가해주면 다음과 같이 추가가 됩니다.
해당 App을 누르면 오른쪽과 같이 나오는데 이름 옆에 있는 것을 눌러줍니다.
이 앱을 채널에 추가 버튼을 눌러줍니다.
메세지를 보내고 싶은 채널을 선택해 추가합니다.
채널에 들어가보면 짜잔 제가 만든 App의 봇이 추가됐네요~!
토큰을 발급 받았으면 이제 API를 Node.js를 이용해 활용해봐야겠죠?
해당 깃헙 링크에서 더 자세한 내용 확인 가능합니다.
https://github.com/slackapi/node-slack-sdk
해당 라이브러리를 이용하면 slack의 api호출을 할 수 있습니다.
우선 라이브러리를 다운로드 받습니다.
npm i @slack/web-api
아까 권한을 볼 수 있는 탭에서 HTTP를 JavaScript로 바꾸면 다음과 같이 나옵니다.
이 라이브러리 안에 있는 WebClient가 app.client를 대신하게 됩니다.
깃헙에 파일을 push 했기 때문에 토큰과 채널 ID를 숨기기 위해 .env파일에 저장을 해두었고 해당 내용을 process.env.~~ 를 통해 가져왔습니다.
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를 이용한 자동화 작업 (특정 시간에 콜백 함수 호출)
제가 작성한 글을 통해 확인할 수 있습니다.
저는 정각에 메세지를 보내는 함수를 만들었습니다.
const sendTodayData = require('./slackBot')
const schedule = require('node-schedule')
const slackJob = schedule.scheduleJob('0 0 0 * * *', () => {
sendTodayData()
})
@slack/web-api, node-schedule 라이브러리와 슬랙 봇을 만들어 특정 채널에 메세지 보내는 것을 자동화 하는 방법에 대해 정리했습니다:)