중복 파일 삭제 스크립트를 돌렸다가 식은땀 흘린 날

이미지
중복 파일 삭제 스크립트를 돌렸다가 식은땀 흘린 날 이 블로그의 중복 파일 자동 삭제 편 과 파일명 일괄 변경 편 을 보면 공통적으로 "DRY_RUN"이라는 안전장치가 들어 있습니다. 실제 삭제나 변경 전에 미리보기부터 하도록 만든 이 습관은, 사실 처음부터 있던 게 아니라 한 번의 아찔한 경험 뒤에 생긴 것입니다. 당시 상황은 이랬습니다. 다운로드 폴더가 오래 방치되어 있어 용량을 확인해보니 중복 파일이 상당히 많았고, "파일 해시값을 비교해서 중복이면 자동으로 지우는" 스크립트를 처음 짜서 바로 실행했습니다. 사건 발생 — 실행 버튼을 누른 직후 처음 짠 코드는 대략 이런 형태였습니다. import hashlib from pathlib import Path from collections import defaultdict folder = Path(r"C:\Users\내이름\Downloads") hash_map = defaultdict(list) def get_hash(filepath): h = hashlib.md5() with open(filepath, "rb") as f: h.update(f.read()) return h.hexdigest() for file in folder.rglob("*"): if file.is_file(): hash_map[get_hash(file)].append(file) # 중복이면 첫 번째만 남기고 나머지 삭제 for files in hash_map.values(): if len(files) > 1: for f in files[1:]: f.unlink() # ← 바로 삭제 실행 print(f"삭제: {f.name}") 실행하자마자 터미널에 "삭제: ......

팀 알림 자동화! 파이썬으로 슬랙(Slack) 메시지 자동 발송하기

팀 알림 자동화! 파이썬으로 슬랙(Slack) 메시지 자동 발송하기 (완성 코드 공개)

파이썬으로 슬랙 메시지를 자동으로 발송하는 모습


"매일 아침 팀 채널에 일정을 자동으로 공유하고 싶다", "배치 작업이 실패했을 때 개발팀 채널에 즉시 알리고 싶다", "주간 매출 데이터를 슬랙으로 자동 리포트하고 싶다"…

슬랙은 팀 협업의 중심이 되는 만큼, 업무 알림을 슬랙으로 받으면 별도 앱을 확인할 필요가 없어 효율적입니다. 슬랙은 웹훅(Webhook) 기능을 기본으로 제공해 코드 몇 줄로 메시지를 자동 발송할 수 있습니다. 별도 봇 앱을 만들지 않아도 간단한 설정만으로 바로 시작할 수 있습니다.


1단계: 슬랙 웹훅 URL 발급 (최초 1회만)

슬랙 메시지를 자동 발송하려면 먼저 웹훅 URL을 발급받아야 합니다.

  1. api.slack.com/apps에 접속해 슬랙 계정으로 로그인합니다.
  2. "Create New App""From scratch" 선택 → 앱 이름(예: "업무알림봇") 입력 → 워크스페이스 선택 후 생성합니다.
  3. 왼쪽 메뉴 "Incoming Webhooks"를 클릭합니다.
  4. 상단 토글을 "On"으로 활성화합니다.
  5. 하단 "Add New Webhook to Workspace" 클릭 → 메시지를 받을 채널을 선택하고 "허용"을 클릭합니다.
  6. 생성된 Webhook URL(https://hooks.slack.com/services/... 형태)을 복사해 둡니다.
⚠️ 주의: 웹훅 URL은 해당 채널에 메시지를 보낼 수 있는 비밀 키와 같습니다. 외부에 노출되면 누구나 그 채널에 메시지를 보낼 수 있으므로 코드를 공유할 때는 URL을 반드시 가리거나 환경 변수로 분리하세요.

2단계: 준비물 설치

터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:

pip install requests

슬랙 웹훅은 HTTP POST 요청 방식으로 동작하기 때문에 requests 라이브러리만 있으면 됩니다.


3단계: 완성 코드

아래 코드를 그대로 복사해서 메모장에 붙여넣고, 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✅ 완료! 슬랙으로 메시지를 발송했습니다.")

4단계: 실행 방법

  1. 코드 ① 설정의 WEBHOOK_URL에 발급받은 웹훅 URL을 입력합니다.
  2. 코드 ④ 실행의 메시지 내용을 원하는 내용으로 수정합니다.
  3. 터미널에서 아래 명령어로 실행합니다:
python slack_msg.py

정상 실행 시 터미널에 이렇게 출력됩니다:

  ✔ 메시지 발송 완료
  ✔ 블록 메시지 발송 완료

✅ 완료! 슬랙으로 메시지를 발송했습니다.

웹훅을 설정할 때 선택한 슬랙 채널에 메시지가 도착합니다. 블록 메시지는 제목, 표 형태의 항목, 시간 정보가 깔끔하게 정리되어 표시됩니다.


5단계: 자주 발생하는 오류와 해결법

오류 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
💡 이전 게시글과 결합하면: 주식·환율 자동 수집 편이나 시스템 정보 자동 수집 편과 결합하면 팀 전체가 슬랙에서 데이터 현황을 실시간으로 확인할 수 있습니다. 스케줄러 편과 결합하면 매일 정해진 시간에 팀 채널로 자동 리포트가 발송됩니다.

핵심 요약

  • 준비물: 슬랙 웹훅 URL 발급(최초 1회) + pip install requests
  • 설정: WEBHOOK_URL 입력 후 메시지 내용 수정
  • 실행: 터미널에서 python slack_msg.py 입력
  • 결과: 일반 텍스트 또는 서식 있는 블록 메시지로 슬랙 채널에 자동 발송

이 코드를 응용하면 특정 조건(오류 발생, 임계값 초과)이 충족될 때만 알림을 보내는 조건부 발송이나, 여러 채널에 동시 발송하는 것도 가능합니다.

이 블로그의 인기 게시물

느려진 구글 크롬 속도 2배 빨라지는 3가지 설정 방법 (2026년 최신 가이드)

카카오톡 용량 줄이기! 대화방 파일 삭제로 스마트폰 용량 확보법 (1분 해결)

업무 속도 3배 빨라지는 윈도우 기본 캡처 도구 단축키 및 200% 활용 꿀팁