19. VS Code에서 Python으로 코인 알림 봇 만들기 — 텔레그램 실시간 가격 알림 완벽 가이드
저도 처음에는 테슬라나 비트코인 변동성을 잡겠다고 새벽 2시, 4시마다 알람을 맞춰두고 깨서 거래소 앱을 확인하곤 했습니다. 하루에 앱을 열어본 횟수만 50번이 넘었고, 수면 부족으로 일상생활까지 망가지기 일쑤였죠. 참다못해 파이썬으로 텔레그램 알림 봇을 만들어 '5% 급등락 시에만 사이렌 알림'을 걸어둔 뒤로는, 밤새 차트를 보며 낭비하던 6시간의 수면을 되찾았고 뇌동매매 대신 차분하고 냉정하게 대응할 수 있게 되었습니다
이 글에서는 업비트 공개 API로 코인 실시간 가격을 수집하고, 조건(급등·급락·목표가 도달)이 충족될 때 텔레그램으로 즉시 알림을 발송하는 봇을 — VS Code에서 처음부터 완성까지 단계별로 구축해 드리겠습니다.
코인 알림 봇이 필요한 이유 — 감시하는 사람에서 알림받는 사람으로
24시간 쉬지 않고 움직이는 암호화폐 시장에서 사람이 직접 가격을 모니터링하는 것은 사실상 불가능합니다. 주식은 장이 열리는 시간이 정해져 있지만, 코인은 새벽 3시에도 30%가 움직입니다.
알림 봇은 잠들지 않는 보조 모니터입니다. 사람 대신 24시간 가격을 감시하다가, 설정한 조건이 딱 맞아떨어지는 순간에만 스마트폰을 울립니다. 매일 거래소 앱을 열어 확인하던 습관에서 벗어나, 알림이 왔을 때만 화면을 보는 방식으로 전환할 수 있습니다.
이 봇으로 할 수 있는 것
- 목표가 도달 알림 — "비트코인이 1억 원을 돌파하면 알려줘"
- 급등·급락 감지 — "5분 안에 3% 이상 변동이 생기면 알려줘"
- 거래량 급증 감지 — "평소보다 거래량이 5배 이상 터지면 알려줘"
- 정기 가격 리포트 — "매일 오전 9시에 주요 코인 가격 요약을 보내줘"
사전 준비 — 텔레그램 봇 생성하기
알림을 받을 텔레그램 봇을 먼저 만들어야 합니다. 코딩 없이 텔레그램 앱 안에서 5분이면 완료됩니다.
봇 생성 순서
- 텔레그램 앱에서 @BotFather 를 검색해 대화를 시작합니다.
/newbot을 입력합니다.- 봇 이름을 입력합니다 (예:
My Coin Alert Bot). - 봇 유저네임을 입력합니다 — 반드시
bot으로 끝나야 합니다 (예:mycoin_alert_bot). - 생성 완료 후 HTTP API 토큰을 복사해 저장합니다.
Chat ID 확인하기
봇이 메시지를 보낼 대상(본인 채팅방)의 ID를 확인해야 합니다.
- 방금 만든 봇을 검색해
/start를 입력합니다. - 브라우저에서 아래 URL에 접속합니다 (토큰 부분을 본인 것으로 교체).
https://api.telegram.org/bot8865271761:AAFr73XFgZNcqnAmfN7iZJbgxxxxxxx_9xx/getUpdates- 결과 JSON에서
"chat": {"id": 123456789}형태의 숫자를 복사합니다.
환경 설정 — 라이브러리 설치 및 키 관리
pip install requests python-dotenv
프로젝트 폴더에 .env 파일을 만들고 아래 내용을 저장합니다.
TELEGRAM_TOKEN=your_bot_token_here
TELEGRAM_CHAT_ID=your_chat_id_here
.gitignore 에 .env 를 추가해 토큰이 외부에 노출되지 않도록 합니다.
# config.py — 환경 변수 로딩
from dotenv import load_dotenv
import os
load_dotenv()
TELEGRAM_TOKEN = os.getenv("TELEGRAM_TOKEN")
TELEGRAM_CHAT_ID = os.getenv("TELEGRAM_CHAT_ID")
STEP 1 — 텔레그램 메시지 발송 함수 만들기
import requests
def send_telegram(message: str) -> bool:
url = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage"
payload = {
"chat_id": TELEGRAM_CHAT_ID,
"text": message,
"parse_mode": "HTML", # 굵게, 기울임 등 HTML 서식 사용 가능
}
try:
response = requests.post(url, data=payload, timeout=10)
response.raise_for_status()
return True
except Exception as e:
print(f"텔레그램 발송 실패: {e}")
return False
# 테스트 발송
send_telegram("✅ 코인 알림 봇이 정상 작동 중입니다.")
코드를 실행하면 텔레그램으로 메시지가 즉시 도착합니다. 이것만으로도 알림 기능의 절반은 완성된 것입니다.
STEP 2 — 업비트 API로 실시간 코인 가격 수집하기
업비트는 별도 API 키 없이 공개 REST API를 통해 실시간 시세를 무료로 제공합니다.
import requests
def get_upbit_price(ticker: str) -> dict:
"""
ticker 예시: "KRW-BTC", "KRW-ETH", "KRW-XRP"
"""
url = "https://api.upbit.com/v1/ticker"
params = {"markets": ticker}
headers = {"accept": "application/json"}
try:
response = requests.get(url, params=params, headers=headers, timeout=5)
response.raise_for_status()
data = response.json()[0]
return {
"ticker": ticker,
"current": data["trade_price"], # 현재가
"open": data["opening_price"], # 시가
"high": data["high_price"], # 고가
"low": data["low_price"], # 저가
"change_rate": data["signed_change_rate"] * 100, # 전일 대비 등락률(%)
"volume_24h": data["acc_trade_price_24h"], # 24시간 거래대금
}
except Exception as e:
print(f"가격 조회 실패 ({ticker}): {e}")
return {}
# 테스트
btc = get_upbit_price("KRW-BTC")
print(f"비트코인 현재가: {btc['current']:,.0f}원 ({btc['change_rate']:+.2f}%)")
STEP 3 — 알림 조건 설정하기
목표가 도달 알림
def check_target_price(ticker: str, target: float, direction: str = "above") -> None:
"""
direction: "above" = 목표가 이상, "below" = 목표가 이하
"""
data = get_upbit_price(ticker)
if not data:
return
current = data["current"]
hit = current >= target if direction == "above" else current <= target
if hit:
emoji = "🚀" if direction == "above" else "📉"
msg = (
f"{emoji} <b>목표가 도달 알림</b>\n\n"
f"종목: {ticker}\n"
f"현재가: {current:,.0f}원\n"
f"목표가: {target:,.0f}원\n"
f"조건: {'이상' if direction == 'above' else '이하'} 도달"
)
send_telegram(msg)
print(f"알림 발송: {ticker} {current:,.0f}원")
급등·급락 감지 알림
def check_sudden_change(ticker: str, threshold: float = 3.0) -> None:
"""
threshold: 변동률 기준 (%) — 기본값 3%
"""
data = get_upbit_price(ticker)
if not data:
return
change = data["change_rate"]
if abs(change) >= threshold:
emoji = "🔴" if change < 0 else "🟢"
direction = "급락" if change < 0 else "급등"
msg = (
f"{emoji} <b>{direction} 감지 알림</b>\n\n"
f"종목: {ticker}\n"
f"현재가: {data['current']:,.0f}원\n"
f"전일 대비: {change:+.2f}%\n"
f"24시간 거래대금: {data['volume_24h']/1e8:.1f}억원"
)
send_telegram(msg)
정기 가격 리포트 발송
from datetime import datetime
def send_price_report(tickers: list) -> None:
now = datetime.now().strftime("%Y-%m-%d %H:%M")
lines = [f"📊 <b>코인 가격 리포트</b>\n{now}\n"]
for ticker in tickers:
data = get_upbit_price(ticker)
if data:
name = ticker.replace("KRW-", "")
emoji = "🔴" if data["change_rate"] < 0 else "🟢"
lines.append(
f"{emoji} <b>{name}</b>: {data['current']:,.0f}원 "
f"({data['change_rate']:+.2f}%)"
)
send_telegram("\n".join(lines))
STEP 4 — 전체 봇 통합 + 스케줄러 연동
지금까지 만든 함수들을 하나로 묶고, 주기적으로 자동 실행되도록 연결합니다.
pip install schedule
import schedule
import time
from datetime import datetime
# 감시할 종목 및 조건 설정
WATCH_LIST = ["KRW-BTC", "KRW-ETH", "KRW-XRP", "KRW-SOL"]
TARGET_ALERTS = [
{"ticker": "KRW-BTC", "target": 100_000_000, "direction": "above"}, # 비트코인 1억 돌파
{"ticker": "KRW-ETH", "target": 4_000_000, "direction": "above"}, # 이더리움 400만 돌파
]
SURGE_THRESHOLD = 5.0 # 5% 이상 변동 시 급등·급락 알림
def run_monitoring():
print(f"[{datetime.now().strftime('%H:%M:%S')}] 모니터링 실행 중...")
# 목표가 확인
for alert in TARGET_ALERTS:
check_target_price(alert["ticker"], alert["target"], alert["direction"])
# 급등·급락 확인
for ticker in WATCH_LIST:
check_sudden_change(ticker, threshold=SURGE_THRESHOLD)
def run_daily_report():
send_price_report(WATCH_LIST)
# 스케줄 설정
schedule.every(5).minutes.do(run_monitoring) # 5분마다 조건 체크
schedule.every().day.at("09:00").do(run_daily_report) # 매일 오전 9시 리포트
schedule.every().day.at("22:00").do(run_daily_report) # 매일 오후 10시 리포트
# 시작 알림
send_telegram("🤖 코인 알림 봇이 시작되었습니다.\n5분마다 조건을 모니터링합니다.")
print("봇 시작. 종료하려면 Ctrl+C를 누르세요.")
while True:
schedule.run_pending()
time.sleep(30)
중복 알림 방지 — 같은 조건에서 반복 알림 차단하기
목표가가 달성된 뒤에도 계속 알림이 오는 문제를 방지합니다. 한 번 알림이 발송된 조건은 당일 안에 다시 발송되지 않도록 상태를 기록합니다.
from datetime import date
# 발송 기록 저장
sent_alerts = {}
def check_target_price_safe(ticker: str, target: float, direction: str = "above") -> None:
alert_key = f"{ticker}_{target}_{direction}_{date.today()}"
# 오늘 이미 발송한 알림이면 건너뜀
if alert_key in sent_alerts:
return
data = get_upbit_price(ticker)
if not data:
return
current = data["current"]
hit = current >= target if direction == "above" else current <= target
if hit:
emoji = "🚀" if direction == "above" else "📉"
msg = (
f"{emoji} <b>목표가 도달 알림</b>\n\n"
f"종목: {ticker}\n"
f"현재가: {current:,.0f}원\n"
f"목표가: {target:,.0f}원"
)
if send_telegram(msg):
sent_alerts[alert_key] = True # 발송 성공 시 기록
자주 발생하는 오류와 해결법
오류 1 — 텔레그램 메시지가 오지 않는 경우
원인: 토큰 또는 Chat ID 오류
해결: .env 파일의 값이 정확한지 재확인, 봇에게 /start 메시지를 먼저 보냈는지 확인
오류 2 — 업비트 API가 429 오류(Too Many Requests)를 반환하는 경우
원인: 분당 요청 횟수 초과 (업비트 공개 API는 분당 600회 제한)
해결: 모니터링 주기를 5분 이상으로 설정, 종목 수가 많다면 요청 사이에 time.sleep(0.1) 추가
오류 3 — 봇을 종료했다가 재시작하면 중복 알림이 다시 발송되는 경우
원인: sent_alerts 딕셔너리가 메모리에만 저장되어 재시작 시 초기화됨
해결: 발송 기록을 json 파일이나 sqlite3에 저장해 영속성 확보
import json, os
SENT_LOG = "sent_alerts.json"
def load_sent_alerts():
if os.path.exists(SENT_LOG):
with open(SENT_LOG, "r") as f:
return json.load(f)
return {}
def save_sent_alerts(data: dict):
with open(SENT_LOG, "w") as f:
json.dump(data, f)
마무리 — 핵심 요약
✅ 코인 알림 봇 구축 체크리스트
- 텔레그램 봇 생성 — BotFather에서 토큰 발급, Chat ID 확인
- 환경 변수 관리 —
.env파일에 토큰 저장,.gitignore등록 필수 - 업비트 공개 API — API 키 없이 무료로 실시간 시세 수집 가능
- 알림 조건 3종 — 목표가 도달, 급등·급락 감지, 정기 리포트
- 스케줄러 연동 —
schedule라이브러리로 5분마다 자동 체크 - 중복 알림 방지 — 발송 기록을 파일로 저장해 재시작 후에도 유지
다음으로 알아두면 좋은 것
이 봇에 이전 시리즈에서 배운 Streamlit 대시보드를 연결하면, 텔레그램 알림과 웹 화면 모니터링을 동시에 운영할 수 있습니다. 또한 업비트 Open API(인증 필요)를 활용하면 가격 조회에서 더 나아가 자동 주문까지 구현할 수 있지만, 실제 자산이 걸린 자동매매는 충분한 테스트와 리스크 관리 전략을 반드시 먼저 수립하신 후 진행하시길 권장합니다.
댓글
댓글 쓰기