파이썬과 슬랙API를 활용하여 슬랙 특정 채널에 구내식당 식단표(카카오톡 채널 프로필 사진 크롤링)를 평일 오전 10시마다 자동으로 업로드 해주는 봇을 만들어 보았습니다.
1. Slack app 생성
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 확인 가능)
- 메시지를 보낼 슬랙 채널 선택 -> 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 테스트
'python' 카테고리의 다른 글
[python] chatGPT와 beautifulsoup4를 활용한 증권 데이터 크롤링 (25) | 2024.09.06 |
---|---|
python? (6) | 2024.09.06 |