글쓰는 개발자

[비트코인] 업비트 실시간 시세 받아오기 본문

IT 서비스 제작과정/Development

[비트코인] 업비트 실시간 시세 받아오기

세가사 2024. 4. 12. 23:51
반응형

업비트 시세를 받는 방식은 두가지로 나뉘어져 있다.

1. REST API를 사용하는 방식

2.웹소켓을 이용하는 방식

 

1. REST API 호출방식

REST API를 사용하는 방식을 사용할때는 따로 IP 등록이나 OPEN API 전용 키를 만드는등의 번거로운 작업이 불필요하다는 장점이 있다. 

사용법도 간단한데 현재가를 알고싶은 코인의 고유코드를 markets 파라미터에 담아서 호출하면 된다.

curl --url https://api.upbit.com/v1/ticker?markets=KRW-BTC

결과는 다음과 같이 실시간 코인정보를 받아온다. trading_price가 현재가이다.

[
   {
      "market":"KRW-BTC",
      "trade_date":"20240412",
      "trade_time":"135449",
      "trade_date_kst":"20240412",
      "trade_time_kst":"225449",
      "trade_timestamp":1712930089221,
      "opening_price":100542000.00000000,
      "high_price":101426000.00000000,
      "low_price":100321000.00000000,
      "trade_price":100581000.00000000,
      "prev_closing_price":100541000.00000000,
      "change":"RISE",
      "change_price":40000.00000000,
      "change_rate":0.0003978476,
      "signed_change_price":40000.00000000,
      "signed_change_rate":0.0003978476,
      "trade_volume":0.09441127,
      "acc_trade_price":166587537439.7825200000000000,
      "acc_trade_price_24h":243843221213.42435000,
      "acc_trade_volume":1649.62179620,
      "acc_trade_volume_24h":2418.14766006,
      "highest_52_week_price":105000000.00000000,
      "highest_52_week_date":"2024-03-14",
      "lowest_52_week_price":32510000.00000000,
      "lowest_52_week_date":"2023-06-15",
      "timestamp":1712930089268
   }
]

현재 업비트내에서 제공하는 마켓명의 코드명과 이름은 market API를 호출해서 확인할 수 있다.

https://api.upbit.com/v1/market/all?isDetails=false

 

현재가만을 알고 싶으면 따로 인증키가 필요하지는 않지만 만약 주문가능정보나 개별주문조회 등 내 계정과 관련된 정보를 보거나 실제 API를 이용한 자동거래등을 위한 API를 사용하기 위해서는 인증을 위한 키를 발급받아야 한다.

 

2. 업비트 오픈API 인증키 발급

먼저 upbit service center에 open api guide 페이지 (https://upbit.com/service_center/open_api_guide) 에 들어가서 open api 사용하기 버튼을 클릭한다.

로그인을 하고 OPEN API 관리 페이지에 들어가서 내가 사용할 API의 목록에 체크를 한뒤 IP 주소등록을 해서 키를 생성한다.

IP 주소는 내 외부 IP를 입력해야 하기 때문에 아이피 확인 사이트(https://www.findip.kr/)에 있는 아이피를 입력해준다.

Open API Key 발급받기를 누르고 2채널 인증을 하면 다음과 같이 OPen API Key가 발급된다.  이중 Secret Key는 한번만 확인할수 있기 때문에 창을 닫기 전에 따로 잘 보관해 두자.

 

3. 계정연동 API 사용을 위한 JWT 토큰 발급

내 계정과 연동된 API들을 사용하기 위해서는 위의 Access key와 Secret Key들을 조합해서 JWT 토큰을 생성해야 한다.

JWT 토큰은 다음과 같은 node 스크립트를 이용해 생성가능하다.

const jwt = require("jsonwebtoken");
const { v4: uuidv4 } = require('uuid');
const crypto = require('crypto');
const querystring = require("querystring");

const query = querystring.encode({
    "market": "KRW-BTC"
});

const hash = crypto.createHash('sha512');
const queryHash = hash.update(query, 'utf-8').digest('hex');

const payload = {
  access_key: "발급받은 Access key",
  nonce: uuidv4(),
  query_hash: queryHash,
  query_hash_alg: 'SHA512',
};

const jwtToken = jwt.sign(payload, "발급받은 Secret key");
const authorizationToken = `Bearer ${jwtToken}`;
console.log(authorizationToken);

query내의 파라미터는 요청하는 API에 따라 변경해서 발급해주어야 한다. 현재는 비트코인을 기반으로 쿼리파라미터를 지정했지만 추후 다른 코인 정보를 얻기위해서는 JWT Token 을 해당 코인 정보로 재발급해주어야 한다.

토큰 발급이 완료되었으면 해당 URL을 사용해 주문 가능 정보를 호출해보자.

curl --request GET \
     --url 'https://api.upbit.com/v1/orders/chance?market=KRW-BTC' \
     --header 'Authorization: Bearer jwtToken' \
     --header 'accept: application/json'

다음같이 내가 가진 현금과 현재 돈으로 최대 구매 가능개수 등을 바로 알수 있다.

{
   "bid_fee":"0.0005",
   "ask_fee":"0.0005",
   "maker_bid_fee":"0.0005",
   "maker_ask_fee":"0.0005",
   "market":{
      "id":"KRW-BTC",
      "name":"BTC/KRW",
      "order_types":[
         "limit"
      ],
      "order_sides":[
         "ask",
         "bid"
      ],
      "bid_types":[
         "limit",
         "price"
      ],
      "ask_types":[
         "limit",
         "market"
      ],
      "bid":{
         "currency":"KRW",
         "min_total":"5000"
      },
      "ask":{
         "currency":"BTC",
         "min_total":"5000"
      },
      "max_total":"1000000000",
      "state":"active"
   },
   "bid_account":{
      "currency":"KRW",
      "balance":"7110892.25060624",
      "locked":"0",
      "avg_buy_price":"0",
      "avg_buy_price_modified":true,
      "unit_currency":"KRW"
   },
   "ask_account":{
      "currency":"BTC",
      "balance":"0.02",
      "locked":"0",
      "avg_buy_price":"100990000",
      "avg_buy_price_modified":false,
      "unit_currency":"KRW"
   }
}

 

4. 웹소켓 사용방식

이번에는 웹소켓을 사용하는 방식을 알아보자.

const jwt = require("jsonwebtoken");
const {v4: uuidv4} = require('uuid');
const WebSocket = require("ws");

const payload = {
    access_key: "발급받은 Access key", 
    nonce: uuidv4(),
};

const jwtToken = jwt.sign(payload, "발급받은 Secret key");

const ws = new WebSocket("wss://api.upbit.com/websocket/v1", {
    headers: {
        authorization: `Bearer ${jwtToken}`
    }
});

ws.on("open", () => {
    console.log("connected!");
    ws.send(`[{"ticket":"${uuidv4()}"},{"type":"ticker","codes":["KRW-BTC"],"isOnlyRealtime": true}]`);

});

ws.on("error", console.error);

ws.on("message", (data) => console.log(data.toString()));

ws.on("close", () => console.log("closed!"));

발급받은 Aceess Key와 Secret Key 정보만 입력해두면 codes 필드에 입력한 코인 정보들이 일정 주기별로 호출된다.

이를 이용해 실시간 매매 모니터링 시스템 등을 만들수 있다.

반응형