슬랙 API 를 이용하여, 슬랙 Bot 만들기
배경
회사에서 슬랙봇을 만들어야하는 상황이 발생했다.
요구사항은 간단하다.
구현해놓은 봇에게 특정 명령어를 입력하면 굳이 관리자페이지까지 접속할 필요없이 바로바로 즉각적으로 정보를 확인하는 기능만 있으면 됐다.
실제로 구현하면서 특정 IP 대에서만 가능하게 처리를 진행하고 봇 내부에 데이터베이스도 붙이면서 다양한 작업을 진행했지만 아무래도 회사에서 쓰려고 만든거기 떄문에 해당 코드를 공개할 순 없으므로 간단한 말따라하는 봇을 만들어볼까한다.
이정도 예제라면 충분히 이후에도 응용하여 다양한 봇들을 생산하는데 큰 이슈는 없을것으로 보인다.
파이썬으로도 구현해봤지만, 라이브러리 안정성은 Node js 쪽이 더 좋은 것 같아, Node JS 용으로만 작성을 진행했다.
요구사항
- /따라해 {문자열} 이라고 입력하면 {문자열}을 그대로 출력해준다.
Slack API 설정
- https://api.slack.com/ 에 접속하여 Your Apps에서 [Create New App]를 눌러준다.
- From scratch 클릭
- App Name과 사용할 슬랙 workspace 를 지정해준다
- Bots 클릭
- Review Scopes to Add 클릭
- 아래 살짝 내려가면 Scopes 추가 부분이 있다.
Add an OAuth Scope 를 클릭하여 사진과 같이 im:history와 chat:write 정도만 추가해주자.
- Socket Mode 를 활성화 해준다. 인트라넷과 같이 내부망 사용하는 경우에 사용하는거라고 적혀있던것 같다 .
- Socket 모드를 활성화하면 토큰 이름을 적으라하는데 중요한건 아니니 대충 아무거나 짓자.
- 생성이 완료되면 App 토큰이 발행되는데, App 토큰이 있구나 정도만 기억하면 된다. 나중에 쓰인다는것만 알고 있자.
- 사이드 메뉴에 Event Subscriptions 를 클릭하여 Enable Events를 켜주자.
추가적으로 Subscribe to bot Events 라해서 봇에게 이벤트를 구독해주어야하는데 사진과 같이 message.im, mpim 정도만 넣자.
- 특정 명령어를 만들기 위해 Slash Commands 를 만들자.
- 사이드 메뉴 App Home 내에 App Display Name을 수정해준다.
내 경우에는 신규 앱 생성시 종종 이름이 들어가지 않아 install 이 안된적이 있어서 이후에는 항상 한번 수정해주고 있다.
- Messages Tab 도 활성화해주고 아래 Allow Users to send Slash Commands and Message from the messages tab 을 활성화해주면 메세지를 보낼 수 있는 환경으로 설정된다.
- Install App 메뉴 내 Install to Workspace 버튼을 눌러 슬랙 워크스페이스에 설치해준다.
- 슬랙을 켜서 앱을 눌러 본인이 만든 커스텀 봇을 찾아본다.
- 확인이 끝났다면, 다시 설정페이지로 돌아와서 Basic Information 내에 Signing Secret 코드를 복사해둔다.
- 아까 확인했던 Bot Token도 복사해둔다.
- App Token도 다시 확인하여 복사해둔다.
- 토큰 및 키값을 다 어디에다가 복사해두었다면, 이번엔 특정 폴더를 하나 만들고 그 폴더을 터미널 (혹은 cmd)로 들어간 후
아래의 명령어를 통해 Node.js 환경을 잡아준다.
npm init
# 이후 엔터 계속 막 누루면 package.json 파일이 생성된다.
npm install --save @slack/bolt
- main.js 파일을 하나 생성 후 아래 소스코드를 복사 붙여넣기 진행한다.
소스코드 내 token/appToken/signingSecret 코드가 비어져있는 이 부분에 아까 복사해둔 코드들을 넣어준다.
const { App } = require("@slack/bolt");
const app = new App({
token: "####SLACK_BOT_TOKEN 삽입 부분####", //SLACK_BOT_TOKEN,
socketMode: true,
appToken: "####SLACK_APP_TOKEN 삽입 부분####", //SLACK_APP_TOKEN,
signingSecret: "####SIGNING_SECRET 삽입 부분####", // 슬랙 앱 설정에서 확인 가능
});
app.command("/따라해", async ({ command, ack, say }) => {
try {
// 커맨드 요청 확인 응답
await ack();
const { user_name, text } = command;
await say(text);
} catch (error) {
console.error("에러 발생:", error);
}
});
(async () => {
// 봇 실행
await app.start(process.env.PORT || 3000);
console.log("봇이 실행되었습니다!");
})();
- 아래 명령어를 통해 Node.js 파일을 실행해본다.
봇이 실행되었다고 Now connected to Slack 이라고 뜬다면 이상없이 슬랙 봇이 실행된 것이다.
node main.js
=====================================================================================
god-logger Slack_Node % node test.js
[INFO] socket-mode:SocketModeClient:0 Going to establish a new connection to Slack ...
봇이 실행되었습니다!
[INFO] socket-mode:SocketModeClient:0 Now connected to Slack
- 슬랙 앱을 키고 TestBot에 DM으로 아래와 같이 입력해보자.
- 만약 굳이 슬래시 명령어가 아니라 DM 을 보낼때 똑같이 따라하는걸 하고 싶다면 아래와 같은 코드를 추가하면 된다.
21~22번째 줄 쯤에 넣자.
// 또는 다이렉트 메시지 이벤트 핸들링
app.message(async ({ message, say }) => {
// 다이렉트 메시지인지 확인
const { text, channel_type } = message;
if (channel_type === "im") {
try {
// 메시지 확인
await say(text);
} catch (error) {
console.error("메시지 전송 에러:", error);
}
}
});
- 테스트 해보자. 그냥 /따라해 를 하지 않고 입력해보자
반응형
'자바스크립트 > Node JS' 카테고리의 다른 글
NPM 프로젝트 라이브러리 자동 최신버전 반영 방법 (0) | 2023.05.05 |
---|---|
sharp 설치 실패 해결 방안 (0) | 2023.05.04 |
n을 활용한 다양한 Node.js 버전 관리 (0) | 2023.04.26 |