본문 바로가기

바이낸스 가입방법
  • 코인 잡기술 블로그
기술/코인 알림 봇 만들기 (기초)

[python]코인 알림 봇 만들기(8편) : 바이낸스 API 에러 코드

by 금붕맨 2023. 4. 3.
반응형

API요청 에러 코드

 

400

 

import requests
import pandas as pd
import numpy as np

#tickers = ['BTCUSDT', 'ETHUSDT', ··· , 'OAXUSDT', 'RDNTUSDT']
tickers_future = ['BTCUSDT', 'ETHUSDT', ··· , 'AMBUSDT', 'LEVERUSDT']

for i in tickers_future:
    url = "https://www.binance.com/api/v3/uiKlines?limit=1000&symbol=" + i + "&interval=5m"
    headers = {"User-Agent": "본인의 유저에이전트"}
    res = requests.get(url, headers=headers)
    res.raise_for_status()

위 코드는 어제 7편 글을 쓸 때 제가 실수했던 상황입니다. 티커리스트를 바이낸스 현물시장에 상장된 코인들을 가져온 것이 아니라 선물시장에 상장된 코인들을 가져왔었습니다. api요청할 때 현물과 선물의 url은 다르기 때문에 오류가 나올 수밖에 없는 코드입니다.

 

결과

BTCUSDT  1.2배
ETHUSDT  1.4배
...
SNXUSDT  0.7배
DOTUSDT  1.6배
Traceback (most recent call last):
  File "C:\-\PycharmProjects\pythonProject\코인알림봇\07_모든알트코인 조회.py", line 12, in <module>
    res.raise_for_status()
  File "C:\-\anaconda3\lib\site-packages\requests\models.py", line 1021, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: https://www.binance.com/api/v3/uiKlines?limit=1000&symbol=DEFIUSDT&interval=5m

잘 실행되다 DEFIUSDT순서에서 400이라는 에러코드를 받았습니다. 바이낸스를 확인해 보니 DEFI코인은 선물시장엔 상장되었지만 현물시장에는 상장되어있지 않은 코인이란 것을 알 수 있었습니다. 옆에 오류가 생긴 url주소 (https://www.binance.com/api/v3/uiKlines?limit=1000&symbol=DEFIUSDT&interval=5m)에 들어가 봅니다.

 

바이낸스 오류 코드

메시지로 "invalid symbol"이라고 말하고 있습니다. 여기서 "code"는 HTTPError코드와 다른 코드번호입니다. -1121은 바이낸스에서 invalid symbol이라는 메시지란 뜻으로 정의한 것이고 400은 저희가 잘못된 문법으로 요청을 해서 받는 코드번호입니다(정상적으로 실행되었다는 코드번호는 200입니다.). 이것은 제가 실수해서 일어난 코드이지만 제대로 한다 해도 실시간으로 실행하다 보면 상장폐지되는 코인들이 있기 때문에 같은 에러가 일어날 수 있습니다. 

 

 

해결책(try/ except Exception)

실시간으로 티커리스트들을 새롭게 받아 실행하는 방법도 있지만 API 요청에 부담을 줄 수 있고 7편 마지막에 언급한 것처럼 쓸데없는 코인의 정보가 올라가 있을 수 도 있습니다. 그래서 이런 오류가 발생할 시 해결책 아닌 해결책이 무시하는 것입니다.

for i in tickers:
    try:
        url = "https://www.binance.com/api/v3/uiKlines?limit=1000&symbol=" + i + "&interval=5m"
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"}
        res = requests.get(url, headers=headers)
        res.raise_for_status()

        #본문생략

        print(i + "  " + str(volume_ratio)+"배")
    except Exception:
        pass

만약 오류가 생겼을 시 pass("무시해라")하라는 코드입니다. for문 하위로 넣어 줍니다.

 

결과

BTCUSDT  1.2배
ETHUSDT  1.4배
...
AMBUSDT  0.4배
LEVERUSDT  0.8배

선물 티커리스트의 마지막인 LEVERUSDT까지 잘 실행되었습니다. 물론 DEFI 같은 코인은 print 되지 않고 잘 무시했네요.

 

 

429

오류코드 400 말고도 다양한 오류코드가 있을 수 있는데 가장 주의해야 할 것은 429라고 생각합니다. 메시지 내용은 "Too Many Requests"로 만약 이 메시지를 받았다면 바이낸스기준인 1분당 1200포인트 이상의 HTTP요청을 하게 된 것입니다.  계속 이러한 경고메시지를 받게 된다면 IP차단까지 갈 수 있으니 해결책으로 제시한 "예외는 무시하라"라는 코드를 그대로 사용하면 안됩니다. 그러므로 pass대신 메시지를 출력하도록 수정하겠습니다.

    except Exception as e:
        if str(e).startswith('429'):
            print("Too many requests")
        else:
            pass

as e는 예외를 확인할 수 있게 해 줍니다. 예를 들면, 유효하지 않는 심벌의 오류인 400이 발생하면 "400 Client Error: Bad Request for url: https://www.binance.com/api/v3/uiKlines?limit=1000&symbol=DEFIUSDT&interval=5m"라는 문구를 남기게 해주는 것입니다. if조건식으로 앞에 429로 일치하는 오류가 발생하면 "Too many requests"를 출력하게 되고, 그 외에는 무시하게 되는 것입니다.  확인해야만 하는 다른 에러코드가 있다면 elif로 추가하시면 됩니다.

 

 

전체코드

import requests
import pandas as pd
import numpy as np

#tickers = ['BTCUSDT', 'ETHUSDT', ··· , 'OAXUSDT', 'RDNTUSDT']
tickers_future = ['BTCUSDT', 'ETHUSDT', ··· , 'AMBUSDT', 'LEVERUSDT']

for i in tickers_future:
    url = "https://www.binance.com/api/v3/uiKlines?limit=1000&symbol=" + i + "&interval=5m"
    headers = {"User-Agent": "본인의 유저에이전트"}
    res = requests.get(url, headers=headers)
    res.raise_for_status()
    
    value = res.json()
    df = pd.DataFrame(value)
    df.columns = ['time', 'open', 'high', 'low', 'close', 'volume', '6', 'volume_asset', '8', '9', '10', '11']

    volume = df['volume_asset'].astype(float)
    close = df['close'].astype(float)

    close998 = close.iloc[-2]
    close997 = close.iloc[-3]
    volume998 = volume.iloc[-2]
    
    volume_range = volume[0:997]
    volume_avg = np.average(volume_range)
    volume_ratio = round(volume998 / volume_avg, 1)

    print(i + "  " + str(volume_ratio)+"배")

except Exception as e:
    if str(e).startswith('429'):
        print("Too many requests")
    else:
        pass

 

 

에러코드 링크

(1) HTTP 상태 코드를 정리해서 볼 수 있는 링크입니다. 에러코드만 보고 싶으시다면 400과 500시리즈를 보시면 됩니다.

 

HTTP 상태 코드 - HTTP | MDN

HTTP 응답 상태 코드는 특정 HTTP 요청이 성공적으로 완료되었는지 알려줍니다. 응답은 5개의 그룹으로 나누어집니다: 정보를 제공하는 응답, 성공적인 응답, 리다이렉트, 클라이언트 에러, 그리고

developer.mozilla.org

 

 

(2) 바이낸스 API 에러코드 링크입니다. 그런데 HTTPError메시지에 같이 오는 url로 접속하시면 바로 확인하실 수 있기 때문에 굳이 문서까지 갈 필요는 없을 것 같기도 하네요.

 

Binance API Documentation

 

binance-docs.github.io

 

 

바이낸스 가입 절차 (수수료 할인 및 주의 사항)

바이낸스 신규 가입 레퍼럴(추천인) 코드 - 수수료 할인 혜택 주의사항(가짜사이트, 거짓정보) 가입 절차 레퍼럴(추천인) 코드 - 수수료 할인 혜택 바이낸스에는 추천인 제도가 있으며 신규 가입

goldfishman.tistory.com

반응형

댓글