프로젝트/코인 투자 매크로

2025-05-23 [3] Private API Test

훈 님의 개발 블로그 2025. 5. 24. 00:29

Private API Signature

Private API는 Public API랑 다르게 "이 요청은 진짜 네가 보낸 게 맞아!"라는 걸 증명하는 인증 과정이 필요

1. 인증 과정

요소 설명
API Key (Connect Key) "나야!" 하고 보여주는 아이디 같은 것
API Secret (Secret Key) "내가 진짜 나라는 걸 증명할게!" 하는 비밀번호
Nonce 요청을 보낼 때마다 사용하는 딱 한 번만 쓸 수 있는 숫자.
같은 요청을 두 번 보내는 공격(Replay Attack)을 막기 위해 사용.
보통 현재 시간을 이용해서 생성

 

2. 예시 확인

' 2025-05-17 [1] Preview & Bithumb API '에서 다룬 bithumb API 정보에서 API 사용 예시를 확인 가능하다.

위 이미지에서 오른쪽 PRIVATE API에 있는 '자산'을 클릭하면 아래와 같은 예시가 나와있다.
Python을 클릭하여 필요한 예시를 확인할 수 있다.

그 아래에 Response 예시도 확인 가능하다.
- 200 OK


- 400 Bad Request


3. 필요한 Module 설치

- 예시에서 사용한 jwt는 설치가 필요한 module이다.
- ' 2025-05-19 [2] PyCharm 실행 ~ Public API Test'에서 진행한 것과 같이 jwt module을 설치한다.
- Terminal을 실행하여 pip install pyjwt 입력

- Successfully installed pyjwt 문구 확인

 

4. Code 작성

config.py

- ### 대신 실제 자신의 Key 입력

api_key = "##############################################"
api_secret = "####################################################################################"

 

bithumb_private_api_test.py

- 아래 보강된 예시코드 입력
- 보강 내용 : json형식 출력, try-except 추가

# bithumb_private_api_test.py

# 1. 필요한 라이브러리 설치하기
# 파이참 터미널에서 아래 명령어를 먼저 실행!
# pip install pyjwt

import jwt
import uuid
import time
import requests
import json

# 2. config.py 파일에서 API 키 가져오기
try:
    from config import api_key, api_secret
except ImportError:
    print("config.py 파일을 생성하고 API 키를 입력해주세요.")
    exit()

# 3. API 요청 정보 설정
api_url = "https://api.bithumb.com"
endpoint = "/v1/accounts"  # 최신 v1 엔드포인트 사용

# 4. JWT(JSON Web Token) 생성
payload = {
    'access_key': api_key,
    'nonce': str(uuid.uuid4()),
    'timestamp': str(round(time.time() * 1000)) # timestamp는 문자열이어야 함
}

# pyjwt를 사용해서 토큰 생성 (알고리즘은 HS256 사용)
jwt_token = jwt.encode(payload, api_secret, algorithm="HS256")
authorization_token = f'Bearer {jwt_token}'

headers = {
    'Authorization': authorization_token
}

# 5. API 호출 (v1/accounts는 GET 방식)
try:
    print("빗썸 v1 API로 계정 정보를 요청합니다...")
    response = requests.get(api_url + endpoint, headers=headers)
    response.raise_for_status()  # 200 OK가 아니면 에러 발생

    print("\n요청 성공! 🎉")
    print("계정 정보:")
    # 응답 내용 (JSON 형식) 가져오기
    print(json.dumps(response.json(), indent=4, ensure_ascii=False))

except Exception as err:
    print("\n요청 실패 ㅠㅠ")
    print(f"에러 원인: {err}")
    # 응답이 있는 경우 상세 내용 출력
    if 'response' in locals() and response:
        print(f"상태 코드: {response.status_code}")
        print(f"응답 내용: {response.text}")

 

5. 결과 확인

- 아래와 같이 결과가 출력되면 성공!

- 항목 별 설명

항목 설명
curreny 화폐 단위 or 종목 이름
- KRW : 원화
- ETH : 이더리움
balance 보유하고 있는 총 수량 (거래 가능한 수량 + 거래 중인 수량)
- 숫자가 아니라 문자열인 점 주의
locked 현재 거래에 묶여있는 수량
- 매수 매도를 걸어두면 1
avg_buy_price 평균 매수 단가(평단가)
avg_buy_price_modified 사용자가 직접 수정한 평단가
(빗썸 웹사이트에서는 사용자가 직접 평단가를 수정할 수 있는 기능 존재)
unit_curreny 위에 있는 모든 가격 정보(or 평단가)의 기준이 되는 화폐 단위

 

현재까지 진행 상태

  • Project 환경 구축 완료
  • Public API로 시장 정보 가져오기 성공
  • Private API로 내 자산 정보 가져오기 성공

다음 단계

  • 코드 정리 및 함수화 (Refactoring)

 

끝!!