주뇽's 저장소

파이썬 슬랙봇 완벽 가이드 🚀 본문

자동화/슬랙봇

파이썬 슬랙봇 완벽 가이드 🚀

뎁쭌 2024. 11. 12. 18:03
728x90
반응형

파이썬 슬랙봇 완벽 가이드 🚀

목차

  1. 슬랙봇 소개와 필요성
  2. 개발 환경 설정
  3. 슬랙 앱 설정하기
  4. 기본 기능 구현하기
  5. 고급 기능 구현하기
  6. 배포 및 운영
  7. 문제 해결 가이드

1. 슬랙봇 소개와 필요성

슬랙봇이란?

슬랙봇은 슬랙 워크스페이스에서 자동화된 작업을 수행하는 프로그램이다. 단순한 메시지 응답부터 복잡한 업무 자동화까지 다양한 기능을 구현할 수 있다.

왜 슬랙봇이 필요한가?

  1. 업무 자동화

    • 반복적인 알림 자동화
    • 정기 보고서 생성 및 공유
    • 일정 관리 및 리마인더
  2. 개발 프로세스 개선

    • 코드 배포 알림
    • 빌드/테스트 결과 공유
    • 이슈 트래킹 연동
  3. 팀 커뮤니케이션 향상

    • 자동 응답 시스템
    • 팀 공지 자동화
    • FAQ 봇 구현
  4. 모니터링 및 알림

    • 서버 상태 모니터링
    • 에러 발생 시 즉시 알림
    • 성능 메트릭 추적

2. 개발 환경 설정

필요한 도구 설치

# Python 가상환경 생성
python -m venv slack-bot-env
source slack-bot-env/bin/activate  # Windows: slack-bot-env\Scripts\activate

# 필요한 패키지 설치
pip install slack-bolt python-dotenv schedule

프로젝트 구조 설정

slack-bot/
├── .env                  # 환경 변수 파일
├── requirements.txt      # 의존성 파일
├── main.py              # 메인 실행 파일
├── config/
│   └── settings.py      # 설정 파일
├── handlers/
│   ├── message.py       # 메시지 핸들러
│   ├── events.py        # 이벤트 핸들러
│   └── commands.py      # 명령어 핸들러
└── utils/
    ├── scheduler.py     # 스케줄러
    └── helpers.py       # 유틸리티 함수

3. 슬랙 앱 설정하기

3.1 앱 생성

  1. Slack API 웹사이트 접속
  2. "Create New App" 클릭
  3. "From scratch" 선택
  4. 앱 이름과 워크스페이스 선택

3.2 권한 설정 (OAuth & Permissions)

Bot Token Scopes

# 메시지 관련
- chat:write         # 메시지 전송
- im:write          # DM 전송
- im:history        # DM 내역 조회

# 채널 관련
- channels:read     # 채널 정보 읽기
- channels:history  # 채널 내역 조회
- groups:read      # 비공개 채널 읽기

# 이벤트 관련
- app_mentions:read # 멘션 감지
- reactions:write   # 이모지 반응
- files:write      # 파일 업로드

# 사용자 관련
- users:read       # 사용자 정보 읽기
- users:write      # 사용자 정보 수정

3.3 Event Subscriptions 설정

활성화할 이벤트

# 메시지 이벤트
- message.channels  # 채널 메시지
- message.groups   # 비공개 채널 메시지
- message.im       # DM 메시지

# 사용자 활동
- app_mention      # 봇 멘션
- reaction_added   # 이모지 반응 추가
- team_join       # 신규 멤버 참가

# 채널 이벤트
- channel_created  # 채널 생성
- channel_archive  # 채널 보관

3.4 Slash Commands 설정

/도움말   # 도움말 표시
/알림     # 알림 설정
/상태     # 시스템 상태

4. 기본 기능 구현하기

4.1 기본 설정 파일 (main.py)

import os
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
from dotenv import load_dotenv

# 환경 변수 로드
load_dotenv()

# 앱 초기화
app = App(token=os.environ.get("SLACK_BOT_TOKEN"))

# 기본 메시지 핸들러
@app.message("안녕")
def say_hello(message, say):
    say(f"안녕하세요! <@{message['user']}>님!")

# 앱 실행
if __name__ == "__main__":
    handler = SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"])
    handler.start()

4.2 메시지 핸들러 구현 (handlers/message.py)

from slack_bolt import Ack, Say
from typing import Dict

def register_message_handlers(app):
    @app.message("도움말")
    def handle_help(message: Dict, say: Say):
        say(
            blocks=[
                {
                    "type": "section",
                    "text": {
                        "type": "mrkdwn",
                        "text": "*사용 가능한 명령어*"
                    }
                },
                {
                    "type": "section",
                    "text": {
                        "type": "mrkdwn",
                        "text": "• `/도움말` - 도움말 보기\n• `/알림` - 알림 설정\n• `/상태` - 시스템 상태"
                    }
                }
            ]
        )

4.3 이벤트 핸들러 구현 (handlers/events.py)

def register_event_handlers(app):
    @app.event("app_mention")
    def handle_mentions(event, say):
        say(
            thread_ts=event["ts"],
            text="네, 무엇을 도와드릴까요?"
        )

    @app.event("team_join")
    def handle_team_join(event, say):
        user_id = event["user"]["id"]
        say(
            channel=user_id,
            text=f"안녕하세요! 환영합니다. 🎉\n필요한 도움이 있으시면 `@봇이름 도움말`을 입력해주세요."
        )

5. 고급 기능 구현하기

5.1 스케줄링 기능 (utils/scheduler.py)

import schedule
import time
from threading import Thread
from datetime import datetime

class BotScheduler:
    def __init__(self, app):
        self.app = app
        self.thread = None

    def send_daily_reminder(self):
        self.app.client.chat_postMessage(
            channel="일반",
            text="🌞 일일 스탠드업 시간입니다!"
        )

    def setup_schedules(self):
        schedule.every().day.at("10:00").do(self.send_daily_reminder)

    def run(self):
        while True:
            schedule.run_pending()
            time.sleep(60)

    def start(self):
        self.setup_schedules()
        self.thread = Thread(target=self.run, daemon=True)
        self.thread.start()

5.2 인터랙티브 기능 구현

@app.action("button_click")
def handle_button_click(ack, body, say):
    ack()
    user_id = body["user"]["id"]
    say(f"<@{user_id}>님이 버튼을 클릭하셨습니다!")

@app.view("modal_submit")
def handle_modal_submit(ack, body, client):
    ack()
    user_id = body["user"]["id"]
    client.chat_postMessage(
        channel=user_id,
        text="설정이 저장되었습니다!"
    )

5.3 파일 처리 기능

@app.command("/파일업로드")
def handle_file_upload(ack, command, say, client):
    ack()
    try:
        result = client.files_upload(
            channels=command["channel_id"],
            file="./reports/daily.pdf",
            initial_comment="일일 보고서가 업로드되었습니다."
        )
        say("파일 업로드 완료!")
    except Exception as e:
        say(f"파일 업로드 중 오류 발생: {str(e)}")

6. 배포 및 운영

6.1 도커라이즈

FROM python:3.9-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "main.py"]

6.2 환경 변수 설정 (.env)

SLACK_BOT_TOKEN=xoxb-your-bot-token
SLACK_APP_TOKEN=xapp-your-app-token
SLACK_SIGNING_SECRET=your-signing-secret

6.3 모니터링 설정

import logging

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('bot.log'),
        logging.StreamHandler()
    ]
)

logger = logging.getLogger(__name__)

7. 문제 해결 가이드

일반적인 문제들

  1. 권한 관련 에러

    • OAuth 스코프 확인
    • 봇 토큰 재발급
    • 채널 초대 여부 확인
  2. 메시지 전송 실패

    • 채널 ID 확인
    • 권한 설정 확인
    • 레이트 리밋 체크
  3. 이벤트 수신 문제

    • Event Subscriptions 활성화 확인
    • URL 검증 확인
    • 필요한 스코프 확인

문제 해결 예시 코드

def verify_slack_token():
    try:
        # 토큰 유효성 검증
        result = app.client.auth_test()
        logger.info(f"봇 인증 성공: {result['bot_id']}")
        return True
    except Exception as e:
        logger.error(f"봇 인증 실패: {str(e)}")
        return False

def check_channel_access(channel_id):
    try:
        # 채널 접근 권한 확인
        result = app.client.conversations_info(channel=channel_id)
        return True
    except Exception as e:
        logger.error(f"채널 접근 오류: {str(e)}")
        return False

마치며

슬랙봇은 팀의 생산성을 크게 향상시킬 수 있는 강력한 도구이다. 이 가이드를 통해 기본적인 봇 구현부터 고급 기능까지 구현할 수 있다. 팀의 필요에 맞게 커스터마이징하여 더욱 유용한 도구로 발전시킬 수 있다.

참고 자료

'자동화 > 슬랙봇' 카테고리의 다른 글

Slack API와 Slack SDK: 차이점과 활용 방법 💡  (0) 2024.12.10