엑셀 매크로(VBA) 보안 경고 끝! 파이썬으로 똑같은 작업 대체하기
"매일 아침 팀 채널에 일정을 자동으로 공유하고 싶다", "배치 작업이 실패했을 때 개발팀 채널에 즉시 알리고 싶다", "주간 매출 데이터를 슬랙으로 자동 리포트하고 싶다"…
슬랙은 팀 협업의 중심이 되는 만큼, 업무 알림을 슬랙으로 받으면 별도 앱을 확인할 필요가 없어 효율적입니다. 슬랙은 웹훅(Webhook) 기능을 기본으로 제공해 코드 몇 줄로 메시지를 자동 발송할 수 있습니다. 별도 봇 앱을 만들지 않아도 간단한 설정만으로 바로 시작할 수 있습니다.
슬랙 메시지를 자동 발송하려면 먼저 웹훅 URL을 발급받아야 합니다.
https://hooks.slack.com/services/... 형태)을 복사해 둡니다.⚠️ 주의: 웹훅 URL은 해당 채널에 메시지를 보낼 수 있는 비밀 키와 같습니다. 외부에 노출되면 누구나 그 채널에 메시지를 보낼 수 있으므로 코드를 공유할 때는 URL을 반드시 가리거나 환경 변수로 분리하세요.
터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:
pip install requests
슬랙 웹훅은 HTTP POST 요청 방식으로 동작하기 때문에 requests 라이브러리만 있으면 됩니다.
아래 코드를 그대로 복사해서 메모장에 붙여넣고, slack_msg.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.
import requests
import json
from datetime import datetime
# ① 설정
WEBHOOK_URL = "여기에_웹훅_URL_입력" # ← 1단계에서 발급받은 URL
# ② 일반 텍스트 메시지 발송 함수
def send_message(text):
payload = {"text": text}
res = requests.post(WEBHOOK_URL, data=json.dumps(payload),
headers={"Content-Type": "application/json"})
if res.status_code == 200:
print(f" ✔ 메시지 발송 완료")
else:
print(f" ✘ 발송 실패: {res.status_code} / {res.text}")
# ③ 서식이 있는 블록 메시지 발송 함수 (표 형태로 정리해서 보기 좋게)
def send_block_message(title, items, color="#2E5090"):
"""
title : 메시지 제목
items : {"항목명": "값", ...} 형태의 딕셔너리
"""
fields = [
{"type": "mrkdwn", "text": f"*{key}*\n{value}"}
for key, value in items.items()
]
payload = {
"blocks": [
{
"type": "header",
"text": {"type": "plain_text", "text": title, "emoji": True}
},
{
"type": "section",
"fields": fields
},
{
"type": "context",
"elements": [{
"type": "mrkdwn",
"text": f"⏰ {datetime.now().strftime('%Y-%m-%d %H:%M')}"
}]
}
]
}
res = requests.post(WEBHOOK_URL, data=json.dumps(payload),
headers={"Content-Type": "application/json"})
if res.status_code == 200:
print(f" ✔ 블록 메시지 발송 완료")
else:
print(f" ✘ 발송 실패: {res.status_code} / {res.text}")
# ④ 실행 예시
# 일반 메시지
send_message("📊 *오늘의 업무 자동화 완료 알림*\n\n✅ 데이터 수집 완료\n✅ 보고서 발송 완료")
# 서식 있는 블록 메시지
send_block_message(
title = "📈 일일 업무 자동화 리포트",
items = {
"주식 데이터 수집": "✅ 완료 (6종목)",
"보고서 차트 생성": "✅ 완료",
"이메일 발송": "✅ 완료 (3건)",
"전체 상태": "정상",
}
)
print("\n✅ 완료! 슬랙으로 메시지를 발송했습니다.")
WEBHOOK_URL에 발급받은 웹훅 URL을 입력합니다.python slack_msg.py
정상 실행 시 터미널에 이렇게 출력됩니다:
✔ 메시지 발송 완료 ✔ 블록 메시지 발송 완료 ✅ 완료! 슬랙으로 메시지를 발송했습니다.
웹훅을 설정할 때 선택한 슬랙 채널에 메시지가 도착합니다. 블록 메시지는 제목, 표 형태의 항목, 시간 정보가 깔끔하게 정리되어 표시됩니다.
오류 1: 404 Not Found 또는 invalid_token
웹훅 URL이 잘못 입력되었거나 만료된 경우입니다. 슬랙 앱 설정 페이지에서 "Incoming Webhooks"의 URL을 다시 확인하세요. URL 앞뒤에 공백이 없는지도 점검합니다.
오류 2: 메시지는 발송되는데 채널이 다름
웹훅은 발급 시 선택한 채널에 고정됩니다. 다른 채널로 보내려면 해당 채널용 웹훅을 별도로 발급받아야 합니다. "Add New Webhook to Workspace"를 다시 클릭해 새 채널을 선택하세요.
오류 3: 한글이 깨져서 출력됨
json.dumps() 사용 시 한글이 유니코드로 인코딩되어 전송되지만 슬랙에서는 정상적으로 표시됩니다. 만약 콘솔에서 깨진 것처럼 보인다면 실제 슬랙 채널을 확인하세요. 코드 저장 시 인코딩이 UTF-8인지도 확인합니다.
장시간 실행되는 자동화 스크립트에 슬랙 알림을 추가하면 오류 발생 시 즉시 확인할 수 있습니다.
from slack_msg import send_message
import traceback
try:
# 기존 자동화 코드
pass
except Exception as e:
error_msg = (f"🚨 *스크립트 오류 발생!*\n\n"
f"❌ 오류: `{str(e)}`\n"
f"```{traceback.format_exc()[:500]}```")
send_message(error_msg)
raise
💡 이전 게시글과 결합하면: 주식·환율 자동 수집 편이나 시스템 정보 자동 수집 편과 결합하면 팀 전체가 슬랙에서 데이터 현황을 실시간으로 확인할 수 있습니다. 스케줄러 편과 결합하면 매일 정해진 시간에 팀 채널로 자동 리포트가 발송됩니다.
이 코드를 응용하면 특정 조건(오류 발생, 임계값 초과)이 충족될 때만 알림을 보내는 조건부 발송이나, 여러 채널에 동시 발송하는 것도 가능합니다.