Application/Python

[Python] 19. 파이썬 알림 봇 만들기 - 슬랙과 카카오톡으로 실시간 알림 받기

devsalix 2026. 7. 31. 10:02
728x90

파이썬 알림 봇 만들기 - 슬랙과 카카오톡으로 실시간 알림 받기

메일함 열어봤더니 안 읽은 메일이 200개 넘게 쌓여 있는 거, 다들 한 번쯤 겪어보셨죠. 중요한 알림이 그 사이에 파묻혀서 며칠 지나서야 발견하고 아차 싶었던 적, 저도 많거든요.

근데 슬랙이나 카카오톡으로 메시지가 오면 얘기가 다르잖아요. 딩동 소리 나면 거의 반사적으로 바로 확인하게 되죠.

그래서 오늘은 파이썬으로 슬랙이랑 카카오톡에 알림을 자동으로 쏘는 방법을 해볼 거예요. 지난 18편에서 검색하고 크롤링해서 정보를 모으는 걸 배웠잖아요. 그렇게 모은 결과를 엑셀에 저장하는 것도 좋지만, 이번엔 아예 슬랙으로 바로 받아보는 거죠. 훨씬 실감 나거든요.


웹훅(Webhook)이 뭐예요?

먼저 "웹훅"이라는 단어부터 짚고 갈게요. 이름은 거창한데 사실 별거 없어요.

웹훅은 채널로 바로 연결된 전용 우편 투입구라고 생각하시면 돼요. 슬랙이 특정 채널에 연결된 투입구(URL) 하나를 미리 만들어서 열어두거든요. 우리는 그 주소만 알면 거기에 편지(메시지)를 쏙 넣으면 되는 거예요. 넣는 즉시 그 채널에 배달됩니다.

여기서 중요한 게 있어요. 이 투입구는 문을 두드리거나 신분증을 보여줄 필요가 없어요. 로그인이나 복잡한 인증 과정이 아예 없거든요. 주소만 알면 그냥 넣으면 끝이에요.

그래서 편해요. 파이썬에서 그 URL로 요청 한 번 보내는 게 전부니까요. 대신 약점도 있는데, 그건 조금 이따 얘기할게요.


슬랙 봇 만들기: 웹훅 URL 하나로 끝

슬랙 알림 봇을 만드는 가장 쉬운 방법이 바로 이 웹훅(Incoming Webhook)이에요. 순서대로 따라와 보세요.

혹시 회사 슬랙밖에 없어서 부담되신다면, 무료 워크스페이스를 하나 새로 만드셔도 돼요. 오히려 연습용으로는 그게 더 편해요. "나만의 개인 알림함"처럼 쓰는 거죠.

  1. 슬랙 앱 관리 페이지(api.slack.com/apps)에 접속해요.
  2. "Incoming Webhooks"를 찾아서 추가하고, 활성화(Activate)로 켜줍니다.
  3. 알림을 받을 채널을 골라요. #알림 같은 채널을 새로 만들어도 되고, 본인 DM으로 받아도 돼요.
  4. 그러면 이렇게 생긴 URL이 하나 발급돼요. https://hooks.slack.com/services/T.../B.../xxxx

이 URL 하나가 아까 말한 "그 채널로 연결된 전용 투입구"예요. 이거 복사해두시면 준비 끝입니다.


슬랙으로 메시지 보내기, 진짜 이게 전부예요

이제 파이썬 차례인데요. 놀라지 마세요. 정말 두 줄이면 돼요.

import requests  # 인터넷으로 요청을 보내는 도구예요

webhook_url = "https://hooks.slack.com/services/..."  # 아까 발급받은 URL을 넣어요
requests.post(webhook_url, json={"text": "안녕하세요! 첫 알림입니다."})  # 이 한 줄이 메시지를 보냅니다

# 실행 결과:
# 슬랙 채널에 "안녕하세요! 첫 알림입니다." 라고 딱 뜹니다

 

이게 다예요. requests.post로 URL에 요청을 보내는데, json={"text": "메시지"} 이 부분에 보내고 싶은 내용을 넣는 거죠.

여기서 딱 하나만 기억하세요. json= 이라고 써야 하고, 안에는 {"text": ...} 형태로 넣어야 해요. 이 두 가지가 핵심입니다.


서식 넣어서 예쁘게 보내기

밋밋한 텍스트만 오면 좀 심심하잖아요. 슬랙은 자체 서식을 지원해서 굵게, 이모지, 줄바꿈 같은 걸 넣을 수 있어요.

import requests

webhook_url = "https://hooks.slack.com/services/..."  # 발급받은 URL

# *별표 하나*로 감싸면 굵게, :이모지이름: 으로 이모지, \n 으로 줄바꿈이에요
message = "*작업 완료* :white_check_mark:\n오늘 수집한 뉴스 *5건*이 도착했어요."
requests.post(webhook_url, json={"text": message})  # 서식이 살아있는 채로 배달됩니다

# 실행 결과 (슬랙 화면):
# 작업 완료 ✅
# 오늘 수집한 뉴스 5건이 도착했어요.

 

슬랙은 굵게를 별표 두 개가 아니라 별표 하나로 해요. 이거 헷갈리기 쉬운 부분이에요. 이모지는 :tada: :warning: 처럼 콜론 사이에 이름을 넣으면 되고요. 줄바꿈은 \n을 넣으면 그 자리에서 줄이 바뀝니다.

더 예쁘게, 버튼이나 카드 형태로 꾸미는 방법(Block Kit)도 있긴 한데요. 처음엔 text 하나로 충분해요. 나중에 욕심나실 때 찾아보시면 됩니다.


Webhook URL은 비밀번호나 마찬가지예요

아까 미뤄뒀던 약점, 이제 얘기할게요. 이거 진짜 중요하니까 꼭 기억하세요.

이 Webhook URL은 아는 사람이면 누구나 그 채널에 메시지를 보낼 수 있어요. 신분증 검사가 없다는 게 편하기도 하지만, 뒤집어 보면 URL이 새어나가는 순간 아무나 내 채널에 스팸을 쏠 수 있다는 뜻이거든요.

그래서 이 URL을 코드에 그대로 박아놓고 깃허브 같은 데 올리면 안 돼요. 실무에서 이거 유출돼서 사고 나는 경우가 진짜 많아요.

지난 편들에서 배운 .env 파일 기억나시죠? 여기다 URL을 숨겨두면 됩니다.

import os
import requests
from dotenv import load_dotenv  # .env 파일을 읽어주는 도구예요

load_dotenv()  # .env 파일 내용을 불러옵니다
webhook_url = os.getenv("SLACK_WEBHOOK_URL")  # .env에 저장해둔 URL을 꺼내와요

requests.post(webhook_url, json={"text": "URL을 코드에서 숨겼어요."})  # URL이 코드에 안 보이죠

# 실행 결과:
# 채널에 "URL을 코드에서 숨겼어요." 가 뜹니다

 

.env 파일 안에는 이렇게 한 줄만 적어두면 돼요.

SLACK_WEBHOOK_URL=https://hooks.slack.com/services/...

 

이렇게 하면 코드에는 URL이 전혀 안 보이니까, 코드를 공유해도 안전해요.


실전: 지난 편에서 모은 결과를 슬랙으로 쏘기

자, 이제 진짜 써먹을 차례예요. 지난 18편에서 검색하고 수집한 결과 기억나시죠. 그걸 엑셀에 저장하는 대신, 이번엔 슬랙으로 바로 받아볼게요.

import requests

webhook_url = "https://hooks.slack.com/services/..."  # 발급받은 URL

# 지난 편에서 수집한 결과라고 가정할게요 (리스트에 담겨 있어요)
results = ["파이썬 3.13 출시 - example.com/1", "requests 신버전 소식 - example.com/2"]

# 결과 리스트를 슬랙 메시지 한 덩어리로 예쁘게 정리해요
text = "*오늘의 검색 결과*\n" + "\n".join(f"• {r}" for r in results)  # 앞에 • 붙여서 목록처럼

requests.post(webhook_url, json={"text": text})  # 정리한 내용을 통째로 보냅니다

# 실행 결과 (슬랙 화면):
# 오늘의 검색 결과
# • 파이썬 3.13 출시 - example.com/1
# • requests 신버전 소식 - example.com/2

 

"\n".join(...) 이 부분이 조금 낯설 수 있는데요. 리스트 항목들을 줄바꿈으로 이어붙여서 한 덩어리 문자열로 만드는 거예요. 앞에 를 붙여주니까 목록처럼 보이죠.

이제 이 코드를 검색 코드 뒤에 붙이기만 하면, 정보를 모으자마자 슬랙으로 딩동 하고 알림이 오는 거예요. 작업 완료 알림이나 에러 발생 알림에도 똑같이 써먹을 수 있고요.


카카오톡 알림, 나에게 보내기

여기서 잠깐 카카오톡도 궁금하실 것 같아서 짚고 갈게요. 솔직하게 먼저 말씀드릴게요. 카카오는 슬랙보다 훨씬 번거로워요.

슬랙은 URL 하나로 끝났잖아요. 근데 카카오는 카카오 개발자 사이트(developers.kakao.com)에서 앱을 등록하고, REST API 키를 받고, 메시지 권한에 동의하고, 액세스 토큰을 발급받는 과정을 거쳐야 해요. 이 절차만으로도 글 하나가 나올 정도라, 자세한 발급 과정은 카카오 공식 문서를 따라가시는 걸 추천해요.

그리고 하나 더. 남에게 보내는 건 친구 권한이니 앱 심사니 제약이 엄청 많아요. 그래서 이 글에서는 "나에게 보내기" 딱 하나만 다룰게요. 내 카카오톡의 "나와의 채팅방"으로 알림이 오는 거예요. 개인 알림용으로는 이거면 충분하거든요.

토큰까지 발급받으셨다면, 코드는 이렇게 생겼어요.

import requests
import json

access_token = "발급받은_토큰"  # 카카오에서 받은 액세스 토큰이에요
headers = {"Authorization": f"Bearer {access_token}"}  # 토큰을 헤더에 실어 보냅니다

# 보낼 메시지를 정해진 형식(template_object)에 맞춰 담아요
data = {"template_object": json.dumps({
    "object_type": "text",                    # 텍스트 메시지라는 뜻
    "text": "나에게 보내는 알림입니다.",        # 실제 보낼 내용
    "link": {"web_url": "https://www.google.com"}  # 눌렀을 때 이동할 주소 (필수예요)
})}

# 카카오 '나에게 보내기' 주소로 요청을 보냅니다
requests.post("https://kapi.kakao.com/v2/api/talk/memo/default/send",
              headers=headers, data=data)

# 실행 결과:
# 내 카카오톡 '나와의 채팅방'에 알림이 도착합니다

 

카카오는 슬랙이랑 달리 data=로 보내고, 메시지를 template_object라는 정해진 틀에 맞춰 넣어야 해요. 맛보기니까 "아, 이런 식이구나" 정도만 느끼시면 충분합니다.


자주 만나는 에러

처음 하시면 여기서 한 번씩 막히시더라고요. 미리 알려드릴게요.

슬랙에서 no_service나 404가 떠요. URL에 오타가 있거나, URL이 만료됐거나 삭제된 경우예요. 슬랙 앱 설정에서 URL을 다시 확인하거나 재발급받으세요. 참고로 응답이 ok라고 오면 성공한 거예요.

메시지가 안 뜨고 invalid_payload가 떠요. 이건 대부분 json= 대신 data=로 보냈거나, {"text": ...} 딕셔너리가 아니라 그냥 문자열을 보낸 경우예요. 슬랙은 꼭 json={"text": "..."} 형태여야 해요.

카카오에서 401 Unauthorized가 떠요. 토큰이 만료됐을 가능성이 커요. 카카오 액세스 토큰은 유효기간이 있어서 시간이 지나면 다시 받아야 하거든요. "어제는 됐는데 오늘 안 돼요" 하는 상황, 대부분 이거예요. 당황하지 마시고 토큰을 재발급받으면 됩니다.


오늘 직접 해볼 과제

머리로만 알면 금방 잊어버리잖아요. 딱 하나만 해보세요.

무료 슬랙 워크스페이스를 하나 만들고, Incoming Webhook을 발급받아서 본인 채널로 "오늘 파이썬 공부 완료!"라는 알림을 보내보는 거예요. 위의 두 줄짜리 코드에 URL만 바꿔 넣으면 돼요.

여유가 되시면 여기에 이모지랑 줄바꿈까지 넣어보세요. *굵게*:tada: 이모지, \n 줄바꿈을 섞어서요. 딩동 하고 알림 오는 순간, 은근히 뿌듯하실 거예요.

혹시 URL을 넣었는데 안 뜬다면, 위 에러 부분을 다시 보시거나 댓글로 남겨주세요.

여기까지 하면 정보를 "모으는 것"과 "받아보는 것"을 둘 다 손에 넣으신 거예요. 다음 편에서는 이 둘을 하나로 합쳐볼 거예요. 매일 아침 알아서 뉴스를 검색하고, 요약해서, 메일로 딱 받아보는 미니 프로젝트를 만들어볼 거거든요. 지금까지 배운 조각들이 하나로 맞춰지는 순간이라 꽤 재미있을 거예요.


 


제 글이 도움이 되셨다면 댓글 & 공감 부탁드려요 😀

 

 
728x90