[Node.js] TypeScript로 Slack 알림 Bot 구현해보기

지니·2021년 5월 9일
0
post-thumbnail

목적

  • 스터디에서 데일리 미션 인증 사진을 메시지의 댓글로 달아 관리
  • 데일리 미션 관리자는 매일 인증을 위한 메시지를 작성해야함
  • 가끔 까먹거나 늦게 올리는 일 발생 ...
  • 매일 자정마다 자동적을 메시지를 날려주면 문제점이 발생하지 않을것!
  • 자동화 = 슬랙 봇으로 구현해보자!

Slack Workspace 생성

  1. https://slack.com/intl/ko-kr/get-started#/landing 으로 접속하여 봇을 적용할 워크 스페이스 생성

  2. 워크 스페이스 이름 적기

  1. 생성될 워크스페이스에 처음 생길 채널 이름 적기

  1. 생성 완료!

Slcak Bot 생성

  1. http://{생성한-워크스페이스-이름}.slack.com/apps 접속

아까 생성한 워크스페이스로 접속되었는지 확인!

  1. https://my.slack.com/services/new/bot 접속
  1. 봇 이름 입력

  1. 입력 후, 스크롤 밑으로 쭉 내려서 "통합 저장" 클릭
  1. API 토큰 값 확인

API 토큰 값은 타인에게 공개 금지!!


6. 워크스페이스에서 봇 생성 확인

봇이 away 상태인지 확인



프로젝트 환경 설정

기술 스택

  • Node.js : v11.6.0
  • TypeScript : 4.2.4

사용 라이브러리

Node.js 기반이기 때문에 node.js는 필수로 설치되더 있어야 함

  • node-slack-sdk : Slack APi 사용
  • moment : 시간
    • 자바스크립트에서 날짜, 시간을 다루는 것은 항상 번거로움 + Date 메소드는 불편함
    • Moment 라이브러리의 API를 이용해서 편하게 날짜와 시간을 분석, 검증, 조작, 표시
  • node-schedule : 스케줄러 구현위해 사용
  • dotenv : 환경변수 관리를 위해 사용
    • env 파일을 불러와 설정값을 process.env 에 저장시켜 어디에서든 불러와 사용 가능
  • ts-node : 타입스트립트 파일 실행
  • typescript

프로젝트 생성

mkdir slack-bot
cd slack-bot
npm init --yes

프로젝트 환경설정

모두 프로젝트 루트에 생성!!!

.env

환경변수 파일 생성

 BOT_TOKEN=생성된-봇의-API토큰-값

package.json

 {
   "name": "daily-alarm",
   "main": "bot.ts",
   "version": "0.0.0",
   "private": true,
   "description": "",
   "scripts": {
     "start": "nodemon --exec ts-node bot.ts"
   },
   "dependencies": {
     "@slack/web-api": "^6.1.0",
     "dotenv": "^9.0.1",
     "moment": "^2.29.1",
     "node-schedule": "^2.0.0"
   },
   "devDependencies": {
     "@types/node-schedule": "^1.3.1",
     "ts-node": "^9.1.1",
     "typescript": "^4.2.4"
   }
 }

tsconfig.json

 {
   "compilerOptions": {
     "module": "commonjs",
     "target": "ES2017",
     "moduleResolution": "node",
     "sourceMap": false,
     "allowJs": true,
     "outDir": "dist",
     "baseUrl": ".",
     "paths": {
       "*": [
         "node_modules/*"
       ]
     }
   },
   "compileOnSave": true,
   "include": ["*.ts"],
   "exclude": [
     "node_modules",
   ]
 }

봇 생성

env.ts

필요할 때 마다 process.env로 환경변수를 직접 접근하기 보다는 따로 모듈화 시켜서 호출

import * as dotenv from "dotenv";
// .env 파일의 위치를 직접 지정 
dotenv.config({ path: `${__dirname}/.env` });

export const BOT_TOKEN = process.env.BOT_TOKEN;

bot.ts

const { WebClient } = require("@slack/web-api");
import { BOT_TOKEN } from "./env";
import * as schedule from "node-schedule";
import * as moment from "moment";

// 봇 접근
const web = new WebClient(BOT_TOKEN);
// 봇이 메세지를 보낼 채널 ID
const conversationId = "daily";

// 월요일부터 금요일까지 0시에 오늘 날짜 보내는 스케줄러 작성
const scheduler = schedule.scheduleJob("0 0 ? * MON-FRI *", async () => {
  const res = await web.chat.postMessage({
    channel: conversationId,
    text: moment().format("MM-DD"),
  });

  console.log("Message sent: ", res.ts);
});

테스트

1. 테스트를 위해 코드 수정...

const { WebClient } = require("@slack/web-api");
import { BOT_TOKEN } from "./env";
import * as schedule from "node-schedule";
import * as moment from "moment";

const web = new WebClient(BOT_TOKEN);
const conversationId = "daily";

// 1분마다 작동하도록 cron 표현식 수정
const scheduler = schedule.scheduleJob("0 */1 * * * *", async () => {
  const res = await web.chat.postMessage({
    channel: conversationId,
    text: moment().format("MM-DD"),
  });

  console.log("Message sent: ", res.ts);
});

2. 실행

npm start

3. 확인


앞으로 추가해보고 싶은 것

  1. EC2에 프로젝트 올려서 직접 활용해보기
  2. 프로젝트 배포할 때 AWS CodePipeline 활용해보기
  3. 명령어 입력하면 대답하는 로직 만들어보기
profile
코.빠.죄.아 (코딩에 빠진 게 죄는 아니잖아..!)

1개의 댓글

comment-user-thumbnail
2021년 11월 4일

요거 혹시 질문 좀 드려도 될까요~??

답글 달기