python

Slack 봇 만들기

Dev.Congsik 2025. 5. 28. 11:40
728x90

파이썬과 슬랙API를 활용하여 슬랙 특정 채널에 구내식당 식단표(카카오톡 채널 프로필 사진 크롤링)를 평일 오전 10시마다 자동으로 업로드 해주는 봇을 만들어 보았습니다.

 

1. Slack app 생성

https://api.slack.com/apps

 

Slack API: Applications | Slack

Your Apps Don't see an app you're looking for? Sign in to another workspace.

api.slack.com

- 슬랙에 앱을 신규 등록한 후, 그 앱에 봇 사용자를 추가하는 방식으로 진행하였습니다.

 

 

 

- from scratch를 선택합니다.

 

- 생성할 앱의 이름과 앱을 등록하여 실행될 워크스페이스를 설정합니다.

- 생성 후 basic information 화면

 

 

2. Bot 권한 추가

- 왼쪽 메뉴에서 OAuth & Permissions 클릭 -> Bot Token Scopes 섹션 이동

-> chat:write (메시지 전송용), files:write (이미지 파일 직접 업로드), incoming-webhook은 선택

 

3. 앱 워크스페이스에 설치 (Install App)

- Install App to Workspace (Install 후 Token 확인 가능)

이미 설치한 경우 Reinstall로 표시됨

- 메시지를 보낼 슬랙 채널 선택 -> Allow

-> 이후 Slack 앱이 워크스페이스에 설치되며, 봇 사용자 생성

-> 봇 사용자가 없을 경우 생성해야함 (봇 사용자가 공개 채널에 소속되어야 함, 비공개 채널은 권한 범위 부족으로 안될 가능성 존재)

-> 저의 경우 lunchmenubot 이라는 봇 사용자를 추가하였습니다.

 

 

4. 파이썬 코드 작성

import requests
from bs4 import BeautifulSoup
from datetime import datetime
import schedule
import time
import holidays
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError

# 🔒 슬랙 설정 - 실제 값으로 교체 필요
SLACK_BOT_TOKEN = "[토큰 값]"
CHANNEL_ID = "[채널 id]"

# 📌 카카오 채널 URL
KAKAO_CHANNEL_URL = "[카카오톡 채널 url]"

# Slack 클라이언트 초기화
slack_client = WebClient(token=SLACK_BOT_TOKEN)

# 🇰🇷 한국 공휴일 정보
kr_holidays = holidays.KR()

def is_korean_holiday():
    today = datetime.now().date()
    return today in kr_holidays

def get_profile_image_url(channel_url):
    headers = {"User-Agent": "Mozilla/5.0"}
    res = requests.get(channel_url, headers=headers)
    if res.status_code != 200:
        print(f"[실패] 카카오 채널 요청 실패: {res.status_code}")
        return None

    soup = BeautifulSoup(res.text, "html.parser")
    og_image = soup.find("meta", property="og:image")
    if og_image and og_image.get("content"):
        return og_image["content"]
    else:
        print("⚠️ og:image 태그를 찾을 수 없습니다.")
        return None

def upload_image_to_slack(image_url):
    try:
        img_data = requests.get(image_url).content
    except Exception as e:
        print(f"⚠️ 이미지 다운로드 실패: {e}")
        return

    filename = f"durban_{datetime.now().strftime('%Y%m%d')}.jpg"
    try:
        response = slack_client.files_upload_v2(
            channel=CHANNEL_ID,
            file=img_data,
            filename=filename,
            title="오늘의 식단",
            initial_comment=f"🍱 {datetime.now().strftime('%Y-%m-%d')} [구내식당] 식단입니다!",
        )
        if response["ok"]:
            print("✅ Slack 업로드 성공")
        else:
            print("❌ Slack 응답 실패:", response)
    except SlackApiError as e:
        print(f"❌ Slack API 오류: {e.response['error']}")

def run_job():
    print(f"\n⏰ {datetime.now()} - 작업 시작")

    if is_korean_holiday():
        print("🚫 오늘은 공휴일입니다. Slack 업로드를 건너뜁니다.")
        return

    img_url = get_profile_image_url(KAKAO_CHANNEL_URL)
    if img_url:
        print(f"📷 프로필 이미지 URL: {img_url}")
        upload_image_to_slack(img_url)
    else:
        print("⚠️ 이미지 URL을 가져오지 못했습니다.")

run_job();

->  평일 오전 10시마다 특정 카카오톡 채널(구내식당)의 프로필 사진(식단표 매일 오전에 업데이트됨)을 크롤링하여 슬랙에 업로드하는 방식이며, 공휴일에는 업로드하지 않도록 하였습니다.

 

 

5. crontab 추가

- 평일 오전 10시에 자동으로 업로드를 하기 위해 사내 리눅스 서버 crontab에 추가하였습니다.

#crontab 추가
crontab -e

0 10 * * 1-5 /usr/bin/python3 /home/lunchmenubot.py >> /home/lunchmenubot.log 2>&1

#저장 후 확인
crontab -l

#평일 오전 10시, 공휴일 알림제외
0 10 * * 1-5 /usr/bin/python3 /home/lunchmenubot.py >> /home/lunchmenubot.log 2>&1

 

 

6. 실행 권한 부여

chmod +x /home/lunchmenubot.py

 

 

7. 테스트

- run_job() 실행 테스트 1회 시행

 

- 정상 업로드 확인, cron 테스트

정상적으로 오전 10시에 등록 확인
정상 로그 확인

728x90

'python' 카테고리의 다른 글

[python] chatGPT와 beautifulsoup4를 활용한 증권 데이터 크롤링  (25) 2024.09.06
python?  (6) 2024.09.06