주뇽's 저장소
파이썬 슬랙봇 완벽 가이드 🚀 본문
728x90
반응형
파이썬 슬랙봇 완벽 가이드 🚀
목차
1. 슬랙봇 소개와 필요성
슬랙봇이란?
슬랙봇은 슬랙 워크스페이스에서 자동화된 작업을 수행하는 프로그램이다. 단순한 메시지 응답부터 복잡한 업무 자동화까지 다양한 기능을 구현할 수 있다.
왜 슬랙봇이 필요한가?
업무 자동화
- 반복적인 알림 자동화
- 정기 보고서 생성 및 공유
- 일정 관리 및 리마인더
개발 프로세스 개선
- 코드 배포 알림
- 빌드/테스트 결과 공유
- 이슈 트래킹 연동
팀 커뮤니케이션 향상
- 자동 응답 시스템
- 팀 공지 자동화
- FAQ 봇 구현
모니터링 및 알림
- 서버 상태 모니터링
- 에러 발생 시 즉시 알림
- 성능 메트릭 추적
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 앱 생성
- Slack API 웹사이트 접속
- "Create New App" 클릭
- "From scratch" 선택
- 앱 이름과 워크스페이스 선택
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. 문제 해결 가이드
일반적인 문제들
권한 관련 에러
- OAuth 스코프 확인
- 봇 토큰 재발급
- 채널 초대 여부 확인
메시지 전송 실패
- 채널 ID 확인
- 권한 설정 확인
- 레이트 리밋 체크
이벤트 수신 문제
- 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 |
---|