initial commit

This commit is contained in:
2026-02-04 00:16:34 +09:00
commit ae11528dd9
867 changed files with 209640 additions and 0 deletions

View File

@@ -0,0 +1,120 @@
# [인증] OAuth 접근토큰 발급
# Generated by KIS API Generator (Single API Mode)
# -*- coding: utf-8 -*-
"""
Created on 2025-06-19
"""
import json
import logging
import sys
import pandas as pd
import requests
sys.path.extend(['../..', '.'])
import kis_auth as ka
# 로깅 설정
logging.basicConfig(level=logging.INFO, format='%(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
##############################################################################################
# [인증] OAuth 접근토큰 발급
##############################################################################################
# 상수 정의
API_URL = "/oauth2/tokenP"
def auth_token(
grant_type: str,
appkey: str,
appsecret: str,
env_dv: str
) -> pd.DataFrame:
"""
OAuth 접근토큰 발급 API를 호출하여 DataFrame으로 반환합니다.
Args:
grant_type (str): [필수] 권한부여 Type (client_credentials)
appkey (str): [필수] 앱키 (한국투자증권 홈페이지에서 발급받은 appkey)
appsecret (str): [필수] 앱시크릿키 (한국투자증권 홈페이지에서 발급받은 appsecret)
env_dv (str): [필수] 환경구분 (real: 실전, demo: 모의)
Returns:
pd.DataFrame: OAuth 토큰 발급 결과
Example:
>>> df = auth_token(
... grant_type="client_credentials",
... appkey=trenv.my_app,
... appsecret=trenv.my_sec,
... env_dv="real"
... )
>>> print(df)
"""
# 필수 파라미터 검증
if not grant_type:
logger.error("grant_type is required. (e.g. 'client_credentials')")
raise ValueError("grant_type is required. (e.g. 'client_credentials')")
if not appkey:
logger.error("appkey is required. (한국투자증권 홈페이지에서 발급받은 appkey)")
raise ValueError("appkey is required. (한국투자증권 홈페이지에서 발급받은 appkey)")
if not appsecret:
logger.error("appsecret is required. (한국투자증권 홈페이지에서 발급받은 appsecret)")
raise ValueError("appsecret is required. (한국투자증권 홈페이지에서 발급받은 appsecret)")
if not env_dv:
logger.error("env_dv is required. (real: 실전, demo: 모의)")
raise ValueError("env_dv is required. (real: 실전, demo: 모의)")
# 환경 구분에 따른 서버 URL 설정
config = ka.getEnv()
if env_dv == "real":
base_url = config.get("prod", "")
elif env_dv == "demo":
base_url = config.get("vps", "")
else:
logger.error("env_dv must be 'real' or 'demo'")
raise ValueError("env_dv must be 'real' or 'demo'")
url = f"{base_url}{API_URL}"
# 헤더 설정
headers = {
"Content-Type": "application/json",
"Accept": "text/plain",
"charset": "UTF-8"
}
# 요청 데이터
data = {
"grant_type": grant_type,
"appkey": appkey,
"appsecret": appsecret,
}
try:
# POST 방식으로 직접 API 호출
response = requests.post(url, data=json.dumps(data), headers=headers)
if response.status_code == 200:
# 응답 데이터를 DataFrame으로 반환 (1개 row)
response_data = response.json()
current_data = pd.DataFrame([response_data])
logger.info("OAuth 토큰 발급 성공")
return current_data
else:
logger.error("API call failed: %s - %s", response.status_code, response.text)
return pd.DataFrame()
except requests.RequestException as e:
logger.error("Request failed: %s", str(e))
return pd.DataFrame()
except json.JSONDecodeError as e:
logger.error("JSON decode failed: %s", str(e))
return pd.DataFrame()

View File

@@ -0,0 +1,104 @@
# -*- coding: utf-8 -*-
"""
Created on 2025-06-19
"""
import sys
import logging
import pandas as pd
sys.path.extend(['../..', '.']) # kis_auth 파일 경로 추가
import kis_auth as ka
from auth_token import auth_token
# 로깅 설정
logging.basicConfig(level=logging.INFO, format='%(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
##############################################################################################
# [인증] OAuth 접근토큰 발급 테스트
##############################################################################################
# 통합 컬럼 매핑
COLUMN_MAPPING = {
'access_token': '접근토큰',
'token_type': '접근토큰유형',
'expires_in': '접근토큰유효기간_초',
'access_token_token_expired': '접근토큰유효기간_일시표시'
}
def main():
"""
OAuth 접근토큰 발급 테스트 함수
Parameters:
- grant_type (str): 권한부여 Type (client_credentials)
- appkey (str): 앱키 (한국투자증권 홈페이지에서 발급받은 appkey)
- appsecret (str): 앱시크릿키 (한국투자증권 홈페이지에서 발급받은 appsecret)
- env_dv (str): 환경구분 (real: 실전, demo: 모의)
Returns:
- pd.DataFrame: OAuth 토큰 발급 결과
Response Fields:
- access_token: 접근토큰 (OAuth 토큰이 필요한 API 경우 발급한 Access token)
- token_type: 접근토큰유형 ("Bearer")
- expires_in: 접근토큰 유효기간(초)
- access_token_token_expired: 접근토큰 유효기간(일시표시)
Example:
>>> df = auth_token(grant_type="client_credentials", appkey=trenv.my_app, appsecret=trenv.my_sec, env_dv="real")
"""
try:
# pandas 출력 옵션 설정
pd.set_option('display.max_columns', None) # 모든 컬럼 표시
pd.set_option('display.width', None) # 출력 너비 제한 해제
pd.set_option('display.max_rows', None) # 모든 행 표시
# 환경 설정에서 앱키와 앱시크릿 가져오기
config = ka.getEnv()
# 실전투자용 앱키/앱시크릿 사용 (모의투자의 경우 paper_app, paper_sec 사용)
appkey = config.get("my_app", "")
appsecret = config.get("my_sec", "")
# 앱키와 앱시크릿이 설정되어 있는지 확인
if not appkey or not appsecret:
logger.error("앱키 또는 앱시크릿이 설정되지 않았습니다. kis_devlp.yaml 파일을 확인해주세요.")
logger.info("필요한 설정: my_app (앱키), my_sec (앱시크릿)")
return
# API 호출
logger.info("OAuth 접근토큰 발급 API 호출 시작")
result = auth_token(
grant_type="client_credentials",
appkey=appkey,
appsecret=appsecret,
env_dv="real" # 실전 환경으로 설정 (필요시 "demo"로 변경)
)
# 결과 확인
if result.empty:
logger.warning("조회된 데이터가 없습니다.")
return
# 결과 처리
logger.info("=== OAuth 접근토큰 발급 결과 ===")
logger.info("사용 가능한 컬럼: %s", result.columns.tolist())
# 통합 컬럼명 한글 변환 (필요한 컬럼만 자동 매핑됨)
result = result.rename(columns=COLUMN_MAPPING)
logger.info("결과:")
print(result)
except Exception as e:
logger.error("에러 발생: %s", str(e))
raise
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,127 @@
# [인증] WebSocket 웹소켓 접속키 발급
# Generated by KIS API Generator (Single API Mode)
# -*- coding: utf-8 -*-
"""
Created on 2025-06-19
"""
import json
import logging
import sys
from typing import Optional
import pandas as pd
import requests
sys.path.extend(['../..', '.'])
import kis_auth as ka
# 로깅 설정
logging.basicConfig(level=logging.INFO, format='%(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
##############################################################################################
# [인증] WebSocket 웹소켓 접속키 발급
##############################################################################################
# 상수 정의
API_URL = "/oauth2/Approval"
def auth_ws_token(
grant_type: str,
appkey: str,
appsecret: str,
env_dv: str,
token: Optional[str] = ""
) -> pd.DataFrame:
"""
WebSocket 웹소켓 접속키 발급 API를 호출하여 DataFrame으로 반환합니다.
Args:
grant_type (str): [필수] 권한부여 Type (client_credentials)
appkey (str): [필수] 고객 앱Key (한국투자증권 홈페이지에서 발급받은 appkey)
appsecret (str): [필수] 고객 앱Secret (한국투자증권 홈페이지에서 발급받은 appsecret)
env_dv (str): [필수] 환경구분 (real: 실전, demo: 모의)
token (Optional[str]): 접근토큰 (OAuth 토큰이 필요한 API 경우 발급한 Access token)
Returns:
pd.DataFrame: WebSocket 접속키 발급 결과
Example:
>>> df = auth_ws_token(
... grant_type="client_credentials",
... appkey=trenv.my_app,
... appsecret=trenv.my_sec,
... env_dv="real"
... )
>>> print(df)
"""
# 필수 파라미터 검증
if not grant_type:
logger.error("grant_type is required. (e.g. 'client_credentials')")
raise ValueError("grant_type is required. (e.g. 'client_credentials')")
if not appkey:
logger.error("appkey is required. (한국투자증권 홈페이지에서 발급받은 appkey)")
raise ValueError("appkey is required. (한국투자증권 홈페이지에서 발급받은 appkey)")
if not appsecret:
logger.error("appsecret is required. (한국투자증권 홈페이지에서 발급받은 appsecret)")
raise ValueError("appsecret is required. (한국투자증권 홈페이지에서 발급받은 appsecret)")
if not env_dv:
logger.error("env_dv is required. (real: 실전, demo: 모의)")
raise ValueError("env_dv is required. (real: 실전, demo: 모의)")
# 환경 구분에 따른 서버 URL 설정
config = ka.getEnv()
if env_dv == "real":
base_url = config.get("prod", "")
elif env_dv == "demo":
base_url = config.get("vps", "")
else:
logger.error("env_dv must be 'real' or 'demo'")
raise ValueError("env_dv must be 'real' or 'demo'")
url = f"{base_url}{API_URL}"
# 헤더 설정
headers = {
"Content-Type": "application/json",
"Accept": "text/plain",
"charset": "UTF-8"
}
# 요청 데이터
data = {
"grant_type": grant_type,
"appkey": appkey,
"secretkey": appsecret,
}
# token이 있는 경우에만 data에 추가
if token:
data["token"] = token
try:
# POST 방식으로 직접 API 호출
response = requests.post(url, data=json.dumps(data), headers=headers)
if response.status_code == 200:
# 응답 데이터를 DataFrame으로 반환 (1개 row)
response_data = response.json()
current_data = pd.DataFrame([response_data])
logger.info("WebSocket 접속키 발급 성공")
return current_data
else:
logger.error("API call failed: %s - %s", response.status_code, response.text)
return pd.DataFrame()
except requests.RequestException as e:
logger.error("Request failed: %s", str(e))
return pd.DataFrame()
except json.JSONDecodeError as e:
logger.error("JSON decode failed: %s", str(e))
return pd.DataFrame()

View File

@@ -0,0 +1,104 @@
# -*- coding: utf-8 -*-
"""
Created on 2025-06-19
"""
import sys
import logging
import pandas as pd
sys.path.extend(['../..', '.']) # kis_auth 파일 경로 추가
import kis_auth as ka
from auth_ws_token import auth_ws_token
# 로깅 설정
logging.basicConfig(level=logging.INFO, format='%(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
##############################################################################################
# [인증] WebSocket 웹소켓 접속키 발급 테스트
##############################################################################################
# 통합 컬럼 매핑
COLUMN_MAPPING = {
'code': '응답코드',
'message': '응답메세지',
'approval_key': '웹소켓접속키'
}
def main():
"""
WebSocket 웹소켓 접속키 발급 테스트 함수
Parameters:
- grant_type (str): 권한부여 Type (client_credentials)
- appkey (str): 고객 앱Key (한국투자증권 홈페이지에서 발급받은 appkey)
- appsecret (str): 고객 앱Secret (한국투자증권 홈페이지에서 발급받은 appsecret)
- env_dv (str): 환경구분 (real: 실전, demo: 모의)
- token (str): 접근토큰 (OAuth 토큰이 필요한 API 경우 발급한 Access token)
Returns:
- pd.DataFrame: WebSocket 접속키 발급 결과
Response Fields:
- code: 응답코드 (HTTP 응답코드)
- message: 응답메세지
Example:
>>> df = auth_ws_token(grant_type="client_credentials", appkey=trenv.my_app, appsecret=trenv.my_sec, env_dv="real")
"""
try:
# pandas 출력 옵션 설정
pd.set_option('display.max_columns', None) # 모든 컬럼 표시
pd.set_option('display.width', None) # 출력 너비 제한 해제
pd.set_option('display.max_rows', None) # 모든 행 표시
# OAuth 토큰 발급 (WebSocket 접속키 발급에 필요)
logger.info("OAuth 토큰 발급 중...")
ka.auth() # 토큰 발급
logger.info("OAuth 토큰 발급 완료")
# 환경 설정에서 토큰, 앱키, 앱시크릿 가져오기
trenv = ka.getTREnv()
appkey = trenv.my_app
appsecret = trenv.my_sec
# 토큰 및 앱키가 설정되어 있는지 확인
if not appkey or not appsecret:
logger.error("앱키 또는 앱시크릿이 설정되지 않았습니다.")
return
# API 호출
logger.info("WebSocket 웹소켓 접속키 발급 API 호출 시작")
result = auth_ws_token(
grant_type="client_credentials",
appkey=appkey,
appsecret=appsecret,
env_dv="real", # 실전 환경으로 설정 (필요시 "demo"로 변경)
)
# 결과 확인
if result.empty:
logger.warning("조회된 데이터가 없습니다.")
return
# 결과 처리
logger.info("=== WebSocket 웹소켓 접속키 발급 결과 ===")
logger.info("사용 가능한 컬럼: %s", result.columns.tolist())
# 통합 컬럼명 한글 변환 (필요한 컬럼만 자동 매핑됨)
result = result.rename(columns=COLUMN_MAPPING)
logger.info("결과:")
print(result)
except Exception as e:
logger.error("에러 발생: %s", str(e))
raise
if __name__ == "__main__":
main()