카카오톡/텔레그램으로 알림 자동 발송하는 방법

서버가 다운되거나, 폼에 신규 문의가 들어오거나, 크롤링한 데이터에 이상치가 발견됐을 때 즉시 알림을 받고 싶다면 어떻게 해야 할까요? 이메일은 확인이 늦고, 매번 화면을 들여다보는 것도 비효율적입니다. 이럴 때 가장 실용적인 해법이 바로 텔레그램 봇 알림입니다. 오늘은 텔레그램과 카카오톡 각각으로 자동 알림을 보내는 방법을 정리해보겠습니다.

왜 텔레그램부터 시작해야 할까

카카오톡도 알림톡이나 비즈메시지를 통해 자동 발송이 가능하지만, 사업자 등록과 템플릿 사전 승인이 필요해 개인 프로젝트나 빠른 테스트에는 진입 장벽이 높습니다. 반면 텔레그램은 봇을 만드는 데 몇 분이면 충분하고, API도 무료로 제한 없이 사용할 수 있어 개발자들이 알림 시스템의 첫 선택지로 가장 많이 활용합니다.

텔레그램 봇 만들기

텔레그램에서 @BotFather를 검색해 대화를 시작하고 /newbot 명령어를 입력하면 몇 초 만에 봇이 생성되고, 이후 API 요청에 사용할 토큰을 받게 됩니다. 이 토큰만 있으면 별도의 서버 인증 없이 바로 메시지를 보낼 수 있습니다.

봇을 만든 뒤에는 내 채팅 ID를 알아야 합니다. 봇과 대화를 한 번 시작한 뒤 아래 주소에 접속하면 chat_id 값을 확인할 수 있습니다.

https://api.telegram.org/bot<발급받은_토큰>/getUpdates

파이썬으로 메시지 발송하기

토큰과 채팅 ID만 있으면 파이썬으로 몇 줄만에 메시지를 보낼 수 있습니다.

import requests

TOKEN = "발급받은_봇_토큰"
CHAT_ID = "내_채팅_ID"

def send_telegram_message(text: str):
    url = f"https://api.telegram.org/bot{TOKEN}/sendMessage"
    payload = {"chat_id": CHAT_ID, "text": text}
    response = requests.post(url, data=payload, timeout=10)
    return response.json()

if __name__ == "__main__":
    send_telegram_message("서버 상태 점검 완료: 정상 작동 중입니다.")
텔레그램 봇 API의 401과 404 실제 응답 비교
실제 호출 결과입니다. 401은 토큰이 틀린 것이고 404는 토큰 자리가 비었거나 URL 형식이 틀린 것입니다. 둘을 구분하면 원인을 바로 찾습니다.

이 함수를 기존 스크립트 어디에든 넣기만 하면, 특정 조건이 충족될 때마다 자동으로 알림이 발송됩니다. 예를 들어 스크래핑한 네이버 순위가 하락했을 때, 혹은 예약된 배치 작업이 완료됐을 때 호출하면 됩니다.

카카오톡으로도 보내고 싶다면

카카오톡은 두 가지 방식이 있습니다. 사업자라면 카카오 비즈니스 채널을 통해 알림톡 API를 신청해 정식으로 발송할 수 있고, 개인 용도라면 카카오톡 나에게 보내기 API를 활용해 본인 계정으로 메시지를 보낼 수도 있습니다. 후자는 카카오 디벨로퍼스에서 앱을 등록하고 REST API 키와 액세스 토큰을 발급받은 뒤, 아래처럼 호출하면 됩니다.

import json
import requests

def send_kakao_to_me(access_token: str, text: str):
    url = "https://kapi.kakao.com/v2/api/talk/memo/default/send"
    headers = {"Authorization": f"Bearer {access_token}"}
    template = {
        "object_type": "text",
        "text": text,
        "link": {"web_url": "https://example.com"},
    }
    data = {"template_object": json.dumps(template, ensure_ascii=False)}
    return requests.post(url, headers=headers, data=data, timeout=10).json()

처음 이 글을 올렸을 때는 template_object에 str(template)을 넣었습니다. 아래 “직접 돌려 보니”에서 확인했듯이 이렇게 하면 JSON이 아닌 문자열이 넘어갑니다. 지금 코드는 json.dumps()로 고친 버전입니다.

직접 돌려 보니 — 코드가 조용히 틀리는 네 군데

위 코드를 이 PC(윈도우 11, Python 3.12.10, requests 2.34.2)에서 직접 돌려 봤습니다. 실제 봇 토큰과 카카오 계정은 쓰지 않았습니다. 메시지가 정상 발송되는 장면은 여기 없고, 대신 토큰이 틀렸을 때 서버가 실제로 뭐라고 답하는지와 코드가 에러 없이 틀린 값을 보내는 곳을 확인했습니다. 알림 스크립트는 평소엔 조용하다가 정작 필요한 날 안 오는 게 가장 큰 문제라서, 실패하는 모습을 미리 알아 두는 쪽이 더 쓸모 있었습니다.

1. 틀린 토큰을 넣으면 실제로 이런 응답이 온다

가짜 토큰으로 텔레그램과 카카오 API를 실제로 호출한 결과입니다. 응답 시간은 이 PC에서 한 번씩 잰 값입니다.

호출HTTP 상태응답 본문걸린 시간
텔레그램, 형식만 맞춘 가짜 토큰 (sendMessage)401{"ok":false,"error_code":401,"description":"Unauthorized"}1.11초
텔레그램, 가짜 토큰 (getMe)401Unauthorized (위와 같음)0.99초
텔레그램, 토큰 자리가 빔 (/bot/sendMessage)404{"ok":false,"error_code":404,"description":"Not Found"}0.97초
텔레그램, URL에 bot 접두어 빠짐404Not Found (위와 같음)0.98초
카카오 나에게 보내기, 가짜 액세스 토큰401{"msg":"this access token does not exist","code":-401}0.30초

401이면 토큰 값 자체가 틀린 것이고, 404면 URL을 조립하다 실수한 것입니다. 환경변수에서 토큰을 못 읽어 빈 문자열이 들어가면 401이 아니라 404가 나옵니다. 그래서 404를 보고 토큰을 다시 발급받으면 시간만 버립니다. 이 차이를 알면 원인을 바로 좁힐 수 있습니다. 테스트를 할 때는 sendMessage보다 getMe로 토큰부터 확인하는 편이 깔끔합니다. 메시지를 보내지 않아서 채팅방이 지저분해지지 않습니다.

하나 더 있습니다. 처음 돌렸을 때는 401도 404도 아니라 SSLError: CERTIFICATE_VERIFY_FAILED로 다섯 개 호출이 전부 실패했습니다. 이 PC의 백신이 HTTPS 인증서를 중간에서 다시 서명하는데, 파이썬이 그 인증서를 믿지 않아서 생긴 문제입니다. 회사 PC나 백신이 깔린 PC에서 “코드는 맞는데 알림이 안 간다”면 이것부터 의심해 보세요. 해결 과정은 SSL 인증서 오류 해결 글에 정리해 두었습니다. 여기서는 truststore로 윈도우 인증서 저장소를 쓰게 해서 넘어갔습니다.

2. 카카오 template_object에 str()을 쓰면 JSON이 아니다

카카오 “나에게 보내기” API는 template_object에 JSON 문자열을 받습니다. 그런데 파이썬 딕셔너리에 str()을 씌우면 JSON처럼 생겼지만 JSON이 아닌 문자열이 나옵니다. 직접 확인해 봤습니다.

>>> template = {"object_type": "text", "text": "서버 점검 완료: 정상", "link": {"web_url": "https://example.com"}}
>>> str(template)
"{'object_type': 'text', 'text': '서버 점검 완료: 정상', 'link': {'web_url': 'https://example.com'}}"
>>> json.loads(str(template))
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

>>> json.dumps(template, ensure_ascii=False)
'{"object_type": "text", "text": "서버 점검 완료: 정상", "link": {"web_url": "https://example.com"}}'
>>> json.loads(json.dumps(template, ensure_ascii=False)) == template
True

str()은 작은따옴표를 쓰고, JSON은 큰따옴표만 허용합니다. 값에 True나 None이 들어가면 차이가 더 커집니다. str({"a": True, "b": None})은 {'a': True, 'b': None}이고, JSON으로는 {"a": true, "b": null}이어야 합니다. 파이썬 쪽에서는 아무 에러도 나지 않고 요청이 그대로 나가기 때문에, 문제는 API 응답을 열어 봐야만 드러납니다. 그래서 위 본문 코드를 json.dumps(template, ensure_ascii=False)로 고쳤습니다. ensure_ascii=False를 빼도 동작은 하지만, 한글이 \uc11c\ubc84처럼 바뀌어서 로그로 남겼을 때 읽기 어렵습니다.

3. timeout을 안 넣으면 스크립트가 멈춘 채로 남는다

원래 코드의 requests.post()에는 timeout이 없었습니다. requests는 timeout을 지정하지 않으면 응답을 끝없이 기다립니다. 연결만 받고 응답은 주지 않는 가짜 서버를 이 PC에 띄워 놓고 시험해 봤습니다.

설정결과
timeout=33.01초 뒤 ReadTimeout 예외
timeout=(2, 5) (연결 2초, 읽기 5초)5.02초 뒤 ReadTimeout 예외
timeout 없음20초를 지켜봤지만 계속 대기 중 (예외도 반환도 없음)

알림 함수는 보통 다른 작업 끝에 붙입니다. 거기서 멈추면 알림만 안 가는 게 아니라 작업 스케줄러에 걸린 스크립트 전체가 “실행 중”으로 남습니다. 다음 실행과 겹치기도 합니다. 그래서 본문 코드 두 곳에 모두 timeout=10을 넣었습니다. 알림이 실패하면 차라리 예외로 끝나는 게 낫습니다.

4. 긴 로그는 4,096자 단위로 잘라 보내야 한다

텔레그램 sendMessage는 텍스트를 최대 4,096자까지 받습니다(공식 Bot API 문서 기준). 실행 로그를 통째로 붙여 보내면 이 제한에 걸립니다. 그래서 줄바꿈 위치에서 끊어 여러 번 보내는 함수를 만들어 돌려 봤습니다.

LIMIT = 4096

def split_message(text: str, limit: int = LIMIT) -> list[str]:
    parts = []
    while len(text) > limit:
        cut = text.rfind("\n", 0, limit)   # 한도 안쪽의 마지막 줄바꿈
        if cut <= 0:
            cut = limit                      # 줄바꿈이 없으면 그냥 자름
        parts.append(text[:cut])
        text = text[cut:].lstrip("\n")
    parts.append(text)
    return parts

for part in split_message(long_log):
    send_telegram_message(part)
입력길이나뉜 조각 (글자 수)이어 붙였을 때 원본과 같은가
로그 500줄20,389자6조각: 4,071 / 4,058 / 4,058 / 4,058 / 4,058 / 81같음
줄바꿈 없는 한글 10,000자10,000자3조각: 4,096 / 4,096 / 1,808같음

줄 단위로 끊으면 한 줄이 두 메시지에 걸쳐 쪼개지지 않습니다. 그래서 휴대폰에서 읽을 때 훨씬 편합니다. 다만 보통은 로그 전체를 보낼 필요가 없습니다. 실패한 줄이나 마지막 20줄만 추려 보내는 편이 알림으로는 더 쓸모 있었습니다.

실전 활용 아이디어

  • 네이버 블로그 순위 추적 스크립트에 연결해 순위 변동 시 즉시 알림
  • 서버 헬스체크 크론잡에 연결해 장애 발생 시 즉시 알림
  • 신규 문의 폼 제출 시 담당자에게 실시간 전달
  • 크롤링 작업 완료/실패 여부를 자동으로 보고

마무리

알림 자동화는 한 번 구축해두면 그 이후로는 신경 쓸 일이 거의 없는 대표적인 자동화 영역입니다. 개인 프로젝트나 빠른 테스트에는 텔레그램 봇으로 시작하고, 이후 비즈니스 규모가 커지면 카카오톡 알림톡으로 확장하는 순서를 추천드립니다. 작은 알림 시스템 하나가 업무 대응 속도를 눈에 띄게 바꿔줄 것입니다.