투자 자동화의 마지막 조각은 알림입니다. 신호가 떠도 내가 못 보면 없는 신호니까요.
저는 처음에 카카오톡 “나에게 보내기”로 알림을 받았습니다. 그리고 어느 날, 중요한 신호가 “발송 성공”됐는데 저녁까지 그걸 몰랐습니다. 메시지는 도착해 있었는데 알림이 울리지 않았거든요.
그래서 텔레그램 봇으로 갈아탔고, 정확히 10분 걸렸습니다. 그 순서를 그대로 적습니다.
[30초 요약] ① BotFather에게 `/newbot` → 토큰 받기 ② 봇에게 메시지 한 번 보낸 뒤 `getUpdates`로 chat id 확인 ③ 파이썬 `requests` 몇 줄로 발송. 텔레그램은 푸시가 확실히 울리고 토큰이 만료되지 않습니다. 카카오 “나에게 보내기”는 푸시가 울리지 않아 급한 알림용으로 부적합합니다.
1단계 — 봇 만들고 토큰 받기 (1분)
- 텔레그램에서 `BotFather` 를 검색해 대화를 엽니다 (파란 인증 표시가 있는 공식 계정)
- `/newbot` 을 보냅니다
- 봇 이름과 사용자명(`_bot`으로 끝나야 함)을 정합니다
- 토큰을 받습니다 — `123456789:ABC…` 형태
이 토큰은 비밀번호입니다. 코드에 직접 쓰지 말고 환경변수로 두세요. 유출되면 누구나 내 봇으로 메시지를 보낼 수 있습니다. 유출이 의심되면 BotFather에서 `/revoke`로 재발급하면 됩니다.
2단계 — chat id 확인하기 (3분)
봇이 누구에게 보낼지 알아야 합니다. 그게 chat id입니다.
먼저 방금 만든 봇에게 아무 메시지나 하나 보내세요. 이걸 안 하면 다음 단계에서 빈 결과가 나옵니다 — 가장 흔한 실수입니다.
그다음 브라우저에서 이 주소를 엽니다(`<토큰>` 자리에 본인 토큰).
https://api.telegram.org/bot<토큰>/getUpdates
응답 JSON에서 `”chat”:{“id”: 123456789, …}` 의 숫자가 chat id입니다.
파이썬으로 뽑으려면 이렇게 합니다.
import os, requests
TOKEN = os.environ["TELEGRAM_BOT_TOKEN"]
updates = requests.get(f"https://api.telegram.org/bot{TOKEN}/getUpdates",
timeout=10).json()
for u in updates.get("result", []):
chat = (u.get("message") or u.get("channel_post") or {}).get("chat", {})
print(chat.get("id"), chat.get("type"), chat.get("title") or chat.get("username"))
결과가 비어 있다면 봇에게 메시지를 안 보냈거나, 이미 오래전에 조회해서 업데이트가 소진된 경우입니다. 봇에게 한 번 더 보내고 다시 실행하세요.
그룹·채널로 보낼 때
봇을 그룹이나 채널에 초대해서 보낼 수도 있습니다. 이때 chat id는 음수로 나오고, 슈퍼그룹·채널은 보통 `-100`으로 시작합니다. 채널이라면 봇을 관리자로 추가해야 발송이 됩니다.
3단계 — 파이썬으로 알림 보내기 (5분)
제가 실제로 쓰는 발송 함수입니다.
import os, time, requests
def send_telegram(text: str, retries: int = 3) -> bool:
token = os.getenv("TELEGRAM_BOT_TOKEN", "").strip()
chat_id = os.getenv("TELEGRAM_CHAT_ID", "").strip()
if not (token and chat_id):
return False
for attempt in range(retries):
try:
r = requests.post(
f"https://api.telegram.org/bot{token}/sendMessage",
json={"chat_id": chat_id, "text": text,
"disable_web_page_preview": True},
timeout=10,
)
if r.status_code == 200 and r.json().get("ok"):
return True
if r.status_code == 429: # 너무 많이 보냄 — 서버가 준 대기시간을 지킨다
wait = int((r.json().get("parameters") or {}).get("retry_after", 2))
time.sleep(min(wait, 10))
continue
except Exception:
time.sleep(2 ** attempt)
return False
send_telegram("[테스트] 자동화 서버에서 보냄")
세 가지를 넣어둔 이유가 있습니다.
- `retry_after` 존중 — 짧은 시간에 몰아 보내면 429가 오고, 서버가 몇 초 기다리라고 알려줍니다
- `disable_web_page_preview` — 링크가 들어간 알림에서 미리보기 카드가 화면을 덮지 않게
- 실패해도 예외를 던지지 않음 — 알림이 실패했다고 본 프로그램이 멈추면 안 됩니다. 대신 `False`를 받아 로그에 남깁니다
카카오 “나에게 보내기”를 버린 이유
| 항목 | 카카오 나에게 보내기 | 텔레그램 봇 |
|---|---|---|
| 푸시 알림 | 울리지 않음 (내가 나에게 보낸 메시지) | 즉시 울림 |
| 토큰 | 주기적 만료 → 갱신 로직 필요 | 만료 없음 |
| 발송 형식 | 템플릿 제약 | 자유 텍스트 |
| 구축 시간 | 앱 등록·동의·토큰 관리 | 10분 |
표를 풀면, 급한 신호일수록 카카오는 맞지 않는다는 뜻입니다. “알림이 간 것”과 “알림을 본 것”은 완전히 다른 사건입니다.
토큰 만료도 무시할 수 없습니다. 갱신이 꼬이면 알림 전체가 조용히 죽습니다. 알림 시스템이 조용히 죽는 것만큼 무서운 게 없습니다.
그런데 전부 텔레그램으로 보내면 안 됩니다
알림이 많아지면 아무도 안 봅니다. 저는 한 번 모든 이벤트를 텔레그램으로 보냈다가 2주 만에 알림을 무시하게 됐습니다.
지금은 이렇게 나눕니다.
- 행동이 필요한 것(위험 신호 발동·주문 실패) → 텔레그램 (푸시)
- 참고용(일일 요약·정상 완료) → 카카오나 로그 (조용히)
그리고 텔레그램 발송이 실패하면 카카오로 폴백하게 해두었습니다. 둘 다 실패할 때만 치명 로그를 남깁니다.
자주 묻는 질문
getUpdates 결과가 계속 비어 있어요. 봇에게 먼저 메시지를 보냈는지 확인하세요. 웹훅을 설정해둔 봇은 `getUpdates`가 동작하지 않으니, 웹훅을 해제한 뒤 조회해야 합니다.
봇이 메시지를 못 보낸다고 나옵니다 (403). 사용자가 봇을 차단했거나 대화를 시작한 적이 없는 경우입니다. 봇과의 대화창에서 시작(Start)을 눌러주세요.
비용이 드나요? 봇 생성과 API 사용은 무료입니다.
여러 명에게 보낼 수 있나요? 각자의 chat id로 따로 보내거나, 그룹을 만들어 봇을 넣고 그룹 chat id로 한 번에 보내면 됩니다.
서버에서 돌리려면요? 코드는 그대로이고, 토큰과 chat id를 서버 환경변수로 넣으면 됩니다. 저는 라즈베리파이 서버에서 크론으로 돌립니다.
함께 읽으면 좋은 글
알림을 받을 자동화의 본체는 토스증권 OpenAPI 가이드와 한국투자증권 API 사용법에, 서버 구성은 라즈베리파이 자동화 서버에 정리했습니다.
알림은 보내는 게 아니라 보게 만드는 것입니다.
※ 본 글은 2026년 기준 사용 경험이며 API 사양은 변경될 수 있습니다. 토큰은 반드시 환경변수로 관리하세요.