본문 바로가기
✨ python/FastAPI

[FastAPI, React] Telegram Bot 연동하기

by 환풍 2025. 12. 21.
728x90
반응형

 

결과화면

FastAPI로 텔레그램 Bot을 연동하여 알람이 오게 만들었따.


 

 

1. 텔레그램 봇 만들기

https://telegram.me/BotFather

 

BotFather

BotFather is the one bot to rule them all. Use it to create new bot accounts and manage your existing bots.

telegram.me

텔레그램에서 BotFather을 검색하게 되면, 봇 생성을 할 수 있다.

 

/start
/newbot

위 명령어를 순서대로 친 후, 이름을 지정해주면 Token을 발급해준다.

 

2. 나의 chat_id 얻기

https://api.telegram.org/bot<토큰>/getUpdates

해당 사이트에 가서, 나의 chat id를 확인할 수 있다.

"chat": {
  "id": 123456789,
}

 

3. FastAPI에 텔레그램 전송 함수 만들기

telegram_bot.py

BOT_TOKEN = "여기에_나의_텔레그램_봇_토큰"
CHAT_ID = "여기에_나의_chat_id"
import requests

BOT_TOKEN = "~~~~~~~~~~~~~~"
CHAT_ID = "~~~~~~~~~~~~~~"


def send_telegram(message: str):
    url = f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage"
    payload = {
        "chat_id": CHAT_ID,
        "text": message,
    }
    requests.post(url, json=payload)

 

 

4. WebSocket에서 가격 조건 체크하기

from fastapi import APIRouter, WebSocket

import websockets  # 업비트 WebSocket 연결용
import json  # JSON 파싱용

from telegram.telegram_bot import send_telegram  # 텔레그램 전송 함수

router = APIRouter()

# 업비트 공식 WebSocket 주소
UPBIT_WS_URL = "wss://api.upbit.com/websocket/v1"

# ===============================
# 🔔 알림 관련 설정
# ===============================
TARGET_PRICE = 50000000  # 알림을 받을 목표 가격 (예: 5천만 원)
alert_sent = False  # 중복 알림 방지용 플래그


@router.websocket("/chart")
async def ticker(ws: WebSocket):
    """
    1️⃣ React에서 /chart WebSocket으로 접속
    2️⃣ 서버가 업비트 WebSocket에 연결
    3️⃣ 업비트 데이터를 받아서
        - React로 그대로 전달
        - 동시에 서버에서 가격 조건 체크
    """

    # React 클라이언트 WebSocket 연결 승인
    await ws.accept()

    # 업비트 WebSocket 서버에 연결
    async with websockets.connect(UPBIT_WS_URL) as upbit_ws:

        # 업비트에 구독 메시지 전송
        subscribe = [
            {"ticket": "proxy"},  # 연결 식별용 (아무 문자열 가능)
            {"type": "ticker", "codes": ["KRW-BTC"]},  # BTC 실시간 시세
        ]

        await upbit_ws.send(json.dumps(subscribe))

        global alert_sent  # 함수 안에서 전역 변수 사용

        while True:
            # ===============================
            # 1️⃣ 업비트에서 데이터 수신
            # ===============================
            raw = await upbit_ws.recv()  # bytes 형태
            text = raw.decode("utf-8")  # JSON 문자열로 변환
            data = json.loads(text)  # dict로 변환

            # ===============================
            # 2️⃣ React로 실시간 데이터 전달
            # ===============================
            await ws.send_text(text)

            # ===============================
            # 3️⃣ 가격 조건 체크 (서버에서)
            # ===============================
            price = data["trade_price"]  # 현재 체결가

            # 목표 가격 돌파 + 아직 알림 안 보냈을 때
            if price >= TARGET_PRICE and not alert_sent:
                send_telegram(f"🚨 BTC 가격 도달!\n현재가: {price:,}원")
                alert_sent = True  # 중복 알림 방지

            # 가격이 다시 내려오면 → 다음 알림 가능하게 리셋
            if price < TARGET_PRICE:
                alert_sent = False

 

 

 

https://bright-landscape.tistory.com/468

 

[FastAPI, React] 차트 골든크로스, 데드크로스 표시 ( Telegram Bot)

결과화면 전체 아키텍쳐 요약업비트 WebSocket ↓FastAPI 중계 ↓React 실시간 분봉 생성 ↓이동평균 계산 ↓골든 / 데드 감지 ↓FastAPI 알림 API ↓Telegram BotReact 구조CandleChart.jsimport React, { useState, useEffec

bright-landscape.tistory.com

 

텔레그램에 봇과 연동을 했으니, 이제 이동평균선 MA에 따라 골크 같은거를 나타내봐야겠다.

728x90
반응형

댓글