미숑이의 블로그
블로그 홈소개

© 2025 Ryu Mi Sung. All rights reserved.

목차

들어가기 전에
디스코드 웹훅 (Discord Webhook)란?
디스코드에 자동으로 할 일 알림 보내는 기본 웹훅 구현
1) 웹 후크 URL 가져오기
2) 코드 작업
파이썬 파일 실행 방법
자동 메시지 포맷 수정하기
미리 보는 코드 전문
1) @멘션 커스텀하기
2) 특정 날짜에 자동 메시지 보내기
프로필 이미지와 이름 변경하기
구현 화면
마치며
참고
스노로즈자동화

[자동화] Discord Webhook으로 '회의 알림 메시지 발송' 자동화하기

류미성
2025년 7월 11일

들어가기 전에

스노로즈 프론트엔드 회의는 격주로 한 번씩 진행되다 보니, 바쁘면 회의 일정을 깜빡할 때도 있고, 회의록에 이번 스프린트 내용을 급하게 정리해야 하는 순간도 있었어요. 🥲

이런 상황을 줄이기 위해, 미리 회의록을 작성할 수 있도록 스노로즈 소통 채널인 Discord에 알림을 보내주는 Webhook을 만들어 보기로 했습니다.


디스코드 웹훅 (Discord Webhook)란?

Discord에 내장되어 있는 웹훅 기능은 자동 메시지들과 업데이트된 데이터를 당신의 서버에 있는 텍스트 채널로 아주 쉽게 받을 수 있도록 합니다.웹훅의 종착점을 당신의 서버로 설정하면 해당 웹훅의 URL이 만들어집니다. 이 URL로 다른 여러 서비스들을 엮을 수 있는 것이지요.

즉, 디스코드 채널에 자동으로 글을 작성해주는 봇과 같은 역할을 하는 URL이예요.

디스코드에 자동으로 할 일 알림 보내는 기본 웹훅 구현

1) 웹 후크 URL 가져오기

  1. 채널의 [설정] 페이지로 이동 → 사이드 메뉴 [연동] → ‘웹후크 만들기’ 클릭

    웹후크 만들기

  2. ’웹 후크 URL 복사’ 클릭

    웹 후크 URL 복사

2) 코드 작업

  • 기본 코드 작성으로 Discord와의 연결을 먼저 시도해 보았어요.

    import schedule
      import time
      import requests
     
      WEBHOOK_URL = "https://discord.com/api/webhooks/..."
     
      def send():
          requests.post(WEBHOOK_URL, json={"content": "📢 웹훅 연결 테스트 중입니다."})
     
      # 테스트를 위해 10초에 한 번씩 발송
      schedule.every(10).seconds.do(send)
     
      while True:
          schedule.run_pending()
          time.sleep(1)

    웹훅 연결 테스트

파이썬 파일 실행 방법

  • 명령어 입력 시에만 한 번 실행하고 싶을 때 (수동 트리거 방식) 👈 테스트할 경우

    python3 send_to_discord.py
  • 백그라운드에서 안정적으로 실행하고 싶을 때 (자동 트리거 방식) 👈 실행할 경우

    nohup venv/bin/python send_to_discord.py &
    # 또는
    nohup python send_to_discord.py &
    • nohup: VSCode 등 터미널을 닫아도 실행이 중단되지 않음
    • &: 백그라운드 실행
  • 백그라운드에서 실행 중인 Python 스크립트를 확인

    ps aux | grep pytho
  • 프로세스 한번에 중지

    pkill -f send_to_discord.py

자동 메시지 포맷 수정하기

Discord와 연동한 후, 메시지에 회의 일정과 회의록 링크 등을 포함하도록 내용을 수정했어요.

이때 회의 일정 계산과 발송 시점, 그리고 역할 멘션을 통해 해당 역할의 사람에게 알림이 가도록 했습니다.

미리 보는 코드 전문

import schedule
import time
import requests
from datetime import datetime, timedelta
 
WEBHOOK_URL = "https://discord.com/api/webhooks/..."
NOTION_LINK = "https://www.notion.so/..."
USER_ID = "1234567890987654321"
 
# 첫 회의 날짜 (격주 금요일)
FIRST_MEETING_DATE = datetime(2025, 7, 11)
 
# 내일이 회의가 있는 금요일인지 확인
def is_alert_day(today):
    tomorrow = today + timedelta(days=1)
    meeting_day = FIRST_MEETING_DATE
    while meeting_day <= tomorrow:
        if meeting_day.date() == tomorrow.date():
            return True
        meeting_day += timedelta(weeks=2)
    return False
 
def send():
    today = datetime.today()
    meeting_date = today + timedelta(days=1)
    date_str = f"{meeting_date.year}년 {meeting_date.month}월 {meeting_date.day}일 (금)"
 
    message = (
        f"📅 프론트엔드 회의 알림 📅\n"
        f"<@{USER_ID}> 내일 오후 9시에 회의가 있습니다.\n"
        f"스프린트 작업 내용을 미리 작성해주세요!\n"
        f"- 날짜: {date_str}\n"
        f"- 회의록: [노션 링크]({NOTION_LINK})\n"
    )
 
    requests.post(WEBHOOK_URL, json={"content": message})
    print("✅ 메시지 전송 완료:", date_str)
 
# 매일 정오에 실행 → 목요일 + 조건 만족 시 전송
schedule.every().day.at("12:00").do(send)
 
while True:
    schedule.run_pending()
    time.sleep(1)

1) @멘션 커스텀하기

메시지 내용에 단순히 @Captain Hook을 넣으면 멘션으로 인식되지 않고 텍스트로만 출력됩니다. 그래서 개발자 모드에서 확인한 사용자 ID를 활용하면 멘션이 가능해요.

message = (
  f"📅 프론트엔드 회의 알림 📅\n"
  "@Captain Hook 이번 스프린트 작업 내용을 회의 전에 미리 작성해주세요.\n"
  f"- 날짜: {date_str}\n"
  f"- 회의록: [노션 링크]({NOTION_LINK})\n"
)

알림

  • 설정 방법
    1. [설정] → [고급] → 개발자 모드 활성화 개발자 모드 활성화

    2. 멘션하고 싶은 사용자의 프로필 사진을 우클릭하여, [사용자 ID 복사]를 클릭 사용자 ID 복사

    3. 복사한 사용자 ID를 아래와 같은 형태로 메시지에 삽입 (코드 일부 발췌)

      message = (
         f"📅 프론트엔드 회의 알림 📅\n"
         "<@123456767987654321> 이번 스프린트 작업 내용을 회의 전에 미리 작성해주세요.\n"
         f"- 날짜: {date_str}\n"
         f"- 회의록: [노션 링크]({NOTION_LINK})\n"
       )
    4. 메시지 전송 시, <@사용자ID>가 실제로 멘션되는지 확인 멘션 확인

      📍 참고

      • 역할은 <@&역할ID>, 채널은 <#채널ID> 형식으로 입력하면, 디스코드에서 각각 역할명과 채널명이 링크 형태로 자동 표시됩니다.

2) 특정 날짜에 자동 메시지 보내기

금요일 오후 9시 회의를 위해, 24시간 전인 목요일 오후 9시에 자동 메시지를 보내도록 함수를 수정했어요. (코드 일부 발췌)

# 첫 회의 날짜 (격주 금요일)
FIRST_MEETING_DATE = datetime(2025, 7, 11)
 
# 내일이 회의가 있는 금요일인지 확인
def is_alert_day(today):
    tomorrow = today + timedelta(days=1)
    meeting_day = FIRST_MEETING_DATE
    while meeting_day <= tomorrow:
        if meeting_day.date() == tomorrow.date():
            return True
        meeting_day += timedelta(weeks=2)
    return False
 
def send():
    today = datetime.today()
    meeting_date = today + timedelta(days=1)
    date_str = f"{meeting_date.year}년 {meeting_date.month}월 {meeting_date.day}일 (금)"

프로필 이미지와 이름 변경하기

  1. [서버설정] → 사이드바 [연동] → ‘웹후크’ 클릭 연동
  2. 이미지와 이름 변경 후, 화면 하단의 ‘변경사항 저장하기’ 클릭 변경 사항 저장

구현 화면

구현 화면


마치며

메시지가 백그라운드에서 자동 발송되도록 설정했지만, 노트북이 꺼지는 등의 상황이 발생하면 백그라운드 실행도 함께 종료되는 문제가 있어요. 그래서 이런 상황에도 중단 없이 동작할 수 있는 방법을 찾는 것이 다음 미션이 될 것 같습니다 :)

참고

  • [디스코드] 웹훅을 소개합니다
  • [블로그] @ 디스코드에서 멤버 멘션, 역할 멘션, 채널 멘션을 해봅시다