하아찡

C# 업비트API 요청수 제한 본문

C#/업비트

C# 업비트API 요청수 제한

하아찡 2025. 5. 22. 14:03

API 호출 목록 북마크사이트

https://mysitecollection.com/guest/1/19/coinapi

 

내사이트모음

자신만의 사이트를 저장해두고 사용합니다.

mysitecollection.com


각종 요청에 따라 호출제한이 있습니다.

대표적인 예를보면 캔들정보를 불러오는데 초당 10회가넘어가면 정상적인 호출을 할 수 없습니다.

 

public ChartViewModel(UpbitManager upbitManager)
{
    _upbitManager = upbitManager;
    _publicAPI = new PublicAPI();
    CandleType = "minutes";
    CandleMinUnit = 1;
    WeakReferenceMessenger.Default.Register<CoinSelectedMessage>(this, (r, m) =>
    {
        SelectedMarketCode = m.Value;
        ChartData = new LinkedList<Candle>();
        

        _publicAPI.Candles(ChartData, CandleType, CandleMinUnit, SelectedMarketCode.Market, "");
        for(int i = 0; i < 300; i++)
        {
            _publicAPI.Candles(ChartData, CandleType, CandleMinUnit, SelectedMarketCode.Market, ChartData.First.Value.Utc);
        }

        Logger.Log($"[Chart] 코인 선택됨: {m.Value.KoreanName}");

    });
}

 

public void Candles(LinkedList<Candle> candles, string type = "minutes", int unit = 1, string market = "", string time = "", int cnt = 200)
{
    

    if(market == "")
    {
        return;
    }
    if(time != "")
    {
        DateTime dt = DateTime.ParseExact(
            time,
            "yyyy-MM-dd tt h:mm:ss", 
            new CultureInfo("ko-KR") 
        );

        time = dt.ToString("yyyy-MM-dd HH:mm:ss");  
    }
    type = ((type == "minutes") ? (type + "/" + unit + "?") : (type + "?"));
    var client = new RestClient($"{_urls.Candles}{type}market={market}&count={cnt}&to={time}");
    var request = new RestRequest();
    request.AddHeader("accept", "application/json");

    
    try
    {
        RestResponse response = client.Execute(request);
        var remainingReqHeader = response.Headers.FirstOrDefault(h => h.Name == "Remaining-Req")?.Value?.ToString();
        if (remainingReqHeader != null)
        {
            // 예: group=default; min=1800; sec=29
            var parts = remainingReqHeader.Split(';');
            var secPart = parts.FirstOrDefault(p => p.Trim().StartsWith("sec="));
            if (secPart != null)
            {
                int remainingSec = int.Parse(secPart.Replace("sec=", "").Trim());
                if (remainingSec <= 1)
                {
                    Logger.Log("초당 요청 한도 임박, 1초 대기");
                    Thread.Sleep(1000); 
                }
            }
        }
        if (response.StatusCode == HttpStatusCode.TooManyRequests)
        {
            // 요청이 너무많음
            Logger.Log($"너무 많은 요청 : {market}");
            return;
        }
        JArray jsonArray = JArray.Parse(response.Content);
        

        foreach (var item in jsonArray.Children())
        {
            Candle i = new Candle();
            i.Utc = item["candle_date_time_utc"].ToString();
            i.Kst = item["candle_date_time_kst"].ToString();

            i.Op = Convert.ToDouble(item["opening_price"].ToString());
            i.Hp = Convert.ToDouble(item["high_price"].ToString());
            i.Lp = Convert.ToDouble(item["low_price"].ToString());
            i.Tp = Convert.ToDouble(item["trade_price"].ToString());

            i.Timestamp = Convert.ToInt64(item["timestamp"].ToString());

            //i.change_rate = Convert.ToDouble(item["change_rate"].ToString());


            i.Candle_acc_trade_price = Convert.ToDouble(item["candle_acc_trade_price"].ToString());
            i.Candle_acc_trade_volume = Convert.ToDouble(item["candle_acc_trade_volume"].ToString());
            candles.AddFirst(i);
            
            

        }


        
    }
    catch (Exception e)
    {
        Debug.WriteLine($"캔들 읽어오기 오류 마켓코드 : {market}");
        
    }
}

 

 

 


요청받은 헤더에 남은 요청 횟수를 가져와서 잘 처리하시면 됩니다.

반응형

'C# > 업비트' 카테고리의 다른 글

C# 업비트 캔들 작업 이슈  (1) 2025.05.24
C# 업비트 API 캔들데이터처리  (0) 2025.05.22
C# 업비트 APIKey 인증  (0) 2025.05.21
C# 업비트 Websocket 연결  (0) 2025.05.20
C# 업비트 Rest API 호출  (2) 2025.05.19