Toy Project(토이 프로젝트)/Clone(리그오브트레이더스, 업비트, 삼성증권)

[toy project]업비트 open api 실시간 데이터 가져오기 (feat. websocket)

Angry Stock 2023. 1. 19. 12:24
반응형
1. KRWMarket.vue, BTCMarket.vue, USDTMarket.vue의 스크립트
<script>
import { onMounted, ref } from "vue";
import axios from "axios";
import { v4 as uuidv4 } from "uuid";  //범용 고유 식별자

export default {
  name: "app-krwmarket",

  setup() {
    let coins = ref([]);
    const symbols = ref([]);

    onMounted(async () => {
      await axios.get("https://api.upbit.com/v1/market/all").then((result) => {
        let newcoins = result.data.filter((result) => {
          return result.market.indexOf("KRW-") != -1;
        }); // BTC마켓은 "BTC-" , USDT마켓은 "USDT-" 로 필터링
        coins.value = newcoins;

        for (let i = 0; i < coins.value.length; i++) {
          symbols.value.push(coins.value[i].market);
        } // 심볼을 가져올 변수를 만듬
      });

      await axios
        .get("https://api.upbit.com/v1/ticker", {
          params: { markets: symbols.value.join(",") },
        })
        .then((result) => {
          for (let i = 0; i < coins.value.length; i++) {
            coins.value[i] = Object.assign(coins.value[i], result.data[i]);
          }
        }); // upbit에서 제공하는 방법으로 요청
        
        // --------------------- 이어서 작성 -------------------------

      const ws = new WebSocket("wss://api.upbit.com/websocket/v1"); // 웹소켓 연결

      ws.onopen = () => {
        ws.send(
          `${JSON.stringify([
            { ticket: uuidv4() },
            { type: "ticker", codes: symbols.value },
          ])}`
        );
      }; //업비트에 보내는 메세지 cdoes, symbols.value 는 받을 데이터의 ex) "KRW-BTC"

      ws.onmessage = async (result) => {
        //보낸 메세지에 따른 실시간 응답
        const ticker = await new Response(result.data).json(); //실시간 데이터를 받음
        const key = Object.keys(coins.value).find(
          (key) => coins.value[key].market == ticker.code
        ); //실시간 데이터를 덮어 씌울 데이터를 찾기위해 key 값 찾기
        if (coins.value[key].market == ticker.code) {
          coins.value[key] = Object.assign(coins.value[key], ticker);
        } //실시간 데이터의 code와 기본데이터의 market이 같으면 덮어 씌움
      };
    });

    return { coins };
  },
};
</script>
2. 출력화면

반응형