kiwoomRest Package
키움증권 REST API 간편이용 패키지.
Installation
pip install kiwoomRest
Usage
모든 요청은 비동기로 처리되며, 요청에 대한 응답은 await 키워드를 사용하여 받을 수 있습니다.
Samples: https://github.com/teranum/kiwoom-restapi-samples
로그인 요청은 반드시 먼저 수행되어야 하며, 로그인이 성공하면 다른 요청을 수행할 수 있습니다.
import asyncio
from kiwoomRest import KwRestApi
from app_keys import appkey, secretkey
async def main():
api = KwRestApi()
api.on_realtime.connect(lambda realdatas: print(f"on_realtime: {realdatas}"))
ret = await api.login(appkey, secretkey, is_simulation=False)
if not ret:
print(api.last_message)
return
print("Login success")
await asyncio.sleep(5)
await api.close()
asyncio.run(main())
조회/연속 요청
inputs = {
"mrkt_tp": "0"
}
response = await api.request("ka10099", inputs)
inputs = {
"stk_cd" : "005930"
}
response = await api.request("ka10001", inputs)
inputs = {
"stk_cd": "005930",
"base_dt": "00000000",
"upd_stkpc_tp": "1"
}
response = await api.request("ka10081", inputs)
if response.cont_yn == "Y":
response = await api.request("t8410", request, cont_yn=response.cont_yn, next_key=response.next_key)
if response.return_code == 0:
print("조회 성공")
print(response.body)
else:
print(f"조회 실패: {response.return_msg}")
조건검색 조회/실시간
inputs = {
"trnm" : "CNSRLST"
}
response = await api.request("ka10171", inputs)
inputs = {
"trnm" : "CNSRREQ",
"seq" : "4",
"search_type" : "0",
"stex_tp" : "K",
"cont_yn" : "N",
"next_key" : ""
}
response = await api.request("ka10172", inputs)
api.on_realtime.connect(print)
inputs = {
"trnm" : "CNSRREQ",
"seq" : "4",
"search_type" : "1",
"stex_tp" : "K"
}
response = await api.realtime(inputs)
if response.return_code != 0:
print(f"실시간검색 등록실패: {response.return_msg}")
return
print("실시간검색 등록성공")
print(response.body)
await asyncio.sleep(60)
inputs = {
"trnm" : "CNSRCLR",
"seq" : "4",
}
response = await api.realtime(inputs)
print("실시간검색 해제")
웹소켓 실시간 시세 등록/해제
api.on_realtime.connect(on_realtime)
inputs = {
"trnm" : "REG",
"grp_no" : "1",
"refresh" : "1",
"data" : [{
" item" : ["005930"],
" type" : ["0B"]
}]
}
response = await api.realtime(inputs)
await asyncio.sleep(60)
inputs["trnm"] = "REMOVE"
response = await api.realtime(inputs)
def on_realtime(realdatas):
print(f"실시간이벤트: {realdatas}")
프로퍼티, 메소드, 이벤트
connected -> bool: 연결여부 (연결: True, 미연결: False)
is_simulation -> bool: 모의투자 여부 (모의투자: True, 실거래: False))
access_token -> str: 발급된 엑세스토큰
last_message -> str: 마지막 메시지, 로그인 또는 요청 실패시 사유 저장
login(appkey:str, secretkey:str, is_simulation:bool = False) -> bool: 로그인
appkey:str - 앱키
secretkey:str - 앱시크릿키
is_simulation:bool - 모의서버 사용여부 (모의서버: True, 실거래서버: False), 기본값: False
reutrn: bool - 로그인 성공여부 (성공: True, 실패: False), 실패시 last_message에 실패 사유 저장
request(api_id:str, indatas:dict, *, cont_yn:str='N', next_key:str='0', path:str=None) -> ResponseData: TR요청
api_id:str - api-id (TR코드)
indatas:dict - 요청 데이터
* - cont_yn, next_key, path는 옵션(기본값으로 설정됨)
cont_yn:str - 연속조회여부 (연속조회: 'Y', 단순조회: 'N'), 기본값: 'N'
next_key:str - 연속조회키 (연속조회여부가 'Y'인 경우 필수 세팅), 기본값: '0'
path:str - PATH경로, 기본값: None(자동으로 설정 됨), 설정 필요시 URL값으로 세팅 ex) '/api/dostk/stkinfo'
return: ResponseData - 응답 데이터, 요청 성공 여부는 return_code로 확인 가능 (0: 성공, 그 외: 실패)
realtime(indatas:dict) -> ResponseData: 실시간 등록/해제
indatas:dict - 실시간 요청 데이터
return: ResponseData - 응답 데이터, 요청 성공 여부는 return_code로 확인 가능 (0: 성공, 그 외: 실패)
close() -> None: 연결 종료
on_message(msg:str): 메시지 수신 이벤트 (웹소켓 오류시 발생)
msg - 메시지
- ex.1 ) 'websocket exception. {e}'
- ex.2 ) 'websocket closed. {msg}'
- ex.3 ) 'websocket error. {msg}'
on_realtime(realdatas:dict): 실시간 수신 이벤트 (실시간 데이터 수신시 발생)
realdatas - 실시간 데이터
이벤트 핸들러 연결 : api 객체 생성시 연결
api = KwRestApi()
api.on_message.connect(print)
api.on_realtime.connect(print)
return_code -> int: 응답코드 (0: 성공, 그 외: 실패)
return_msg -> str: 응답메시지 (성공/실패 메시지)
body -> dict: 응답데이터 (조회결과 데이터)
cont_yn -> str: 연속조회여부 (연속조회 있을 경우: 'Y'로 세팅됨)
next_key -> str: 연속조회키
api_id -> str: 요청 api-id (TR코드)
path -> str: 요청 PATH경로(URL)