kiwoom-restful


Namekiwoom-restful JSON
Version 0.2.5 PyPI version JSON
download
home_pageNone
SummarySimple Python Wrapper for Kiwoom REST API+
upload_time2025-09-14 18:18:55
maintainerNone
docs_urlNone
authorNone
requires_python>=3.10
licenseNone
keywords 키움증권 kiwoom heroes rest api
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Kiwoom REST API
Simple Python Wrapper for Kiwoom RESTful API   

## What is it?
* 키움증권에서 제공하는 'REST' API 인터페이스 사용을 위한 간단한 Python Wrapper 모듈
* 네트워크 프로토콜 디테일은 숨기고 투자 전략 로직에 집중할 수 있도록 설계
* 직접 개발하고자 하는 사람을 위한 모듈로 부가적인 기능은 최대한 배제
* 'REST' API가 아닌 기존 PyQt 기반 OCX 방식 API는 [이곳][ocx]을 참조

## Table of Contents
- [Kiwoom REST API](#kiwoom-rest-api)
  - [What is it?](#what-is-it)
  - [Table of Contents](#table-of-contents)
  - [Features](#features)
  - [Installation](#installation)
  - [Examples](#examples)
  - [Architecture](#architecture)
  - [License](#license)
  - [Disclaimer](#disclaimer)

## Features
* 간결한 API를 통한 빠른 프로토 타입 및 전략 최적화
* Async Http 요청 및 응답 + Websocket 데이터 처리
* 실시간 데이터 처리를 위한 non-블로킹 콜백 시스템 
* msgpsec / orjson 기반 실시간 고속 json 파싱
* 초당 Http 연결/호출 제한 자동관리
* Websocket ping-pong 자동처리

모듈 관련 상세한 API 문서 페이지는 [이곳][doc]을 참고해 주세요.

## Installation
```bash
# install from pypi
pip install -U kiwoom-restful

# install from git fork/clone
pip install -e ,
```
Requirements
* python 3.11+ recommended (at leaset 3.10+)
* install uvloop is a plus for linux environment
```python
import asyncio, uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
```

## Examples
기본적인 API 구현 및 Bot 활용예시
```python
from kiwoom import API, Bot
from kiwoom.http import Response

# API 상세 구현
class MyAPI(API):
    def __init__(self, host:str, appkey: str, secretkey: str):
        super().__init__(host, appkey, secretkey)
    
    # 증권사별매매상위요청
    async def what_stocks_ebest_bought_today(self) -> list[dict]:
        endpoint = '/api/dostk/rkinfo'
        api_id = 'ka10039'
        data = {
            'mmcm_cd': '063',    # 회원사코드
            'trde_qty_tp': '0',  # 거래량구분 (전체 '0')
            'trde_tp': '1',      # 매매구분 (순매수 '1')    
            'dt': '0',           # 기간 (당일 '0')
            'stex_tp': '3'       # 거래소구분 (통합 '3')
        }
        # 다음 데이터가 있으면 무조건 계속 요청
        should_continue = lambda res: True  
        # 키움 REST API 서버 응답 데이터 취합 후 반환
        res: dict = await self.request_until(
            should_continue, 
            endpoint, 
            api_id, 
            data=data
        )
        key = 'sec_trde_upper'
        if key in res:
            return res[key]
        return []  # or raise Exception

# API 활용 클래스
class MyBot(Bot):
    def __init__(self, host: str, appkey: str, secretkey: str):
        super().__init__(
            host, appkey, secretkey, 
            api=MyAPI(host, appkey, secretkey) 
        )
        self.blacklist: set[str] = set()

    async def add_to_blacklist(self) -> None:
        data = await self.api.what_stocks_ebest_bought_today()
        ETFs = ("KODEX", "TIGER", "RISE")
        top10 = data[:10]
        for item in top10:
            # Roughly skip ETFs
            name = item["stk_nm"]
            if any(etf in name for etf in ETFs):
                continue

            self.blacklist.add(item["stk_cd"])
```


Bot 기본 내장함수 2가지 활용예시
```python
import asyncio
from kiwoom import Bot
from kiwoom.proc import candle, trade

class MyBot(Bot):
    async def run():
        # 분봉차트 데이터
        code = '005930_AL'  # 거래소 통합코드
        df = await self.candle(
                code=code, 
                period='min',   # 'tick' | 'min' | 'day'
                ctype='stock',  # 'stock' | 'sector'
                start='20250901',
                end='',
        )
        await candle.to_csv(file=f'{code}.csv', path='./', df)

        # 계좌 체결내역 데이터 (최근 2달만)
        fmt = '%Y%m%d'
        today = datetime.today()
        start = today - timedelta(days=60)
        start = start.strftime(fmt)
        end = end.strftime(fmt)
        trs = self.trade(start, end)

        # 키움증권 0343 매매내역 화면 스타일로 저장
        await trade.to_csv('trade.csv', './', trs)
```

Websocket 실시간 데이터 요청 구현예시
```python
import asyncio
import orjson
import pandas as pd
from kiwoom import Bot
from kiwoom.config.real import RealData

class MyBot(Bot):
    def __init__(self, host: str, appkey: str, secretkey: str):
        super().__init__(host, appkey, secretkey)
        self.ticks: list[dict[str, str]] = []

    async def on_receive_order_book(msg: RealData):
        # 호가 데이터 처리 콜백함수 예시
        # RealData(
        #   values: bytes  # utf-8 encoded bytes
        #   type: str,     # API type (ex. 0B, 0D, ...)
        #   name: str,     # API name (ex. 주식체결, 주식호가잔량, ...)
        #   item: str      # 종목코드
        # )
        # values는 기호에 맞게 parsing 해서 사용
        # msg.values = json.loads(msg.values) # slow
        msg.values = orjson.loads(msg.values) # fast
        print(
            f"종목코드: {msg.item}, "
            f"최우선매도호가: {msg.values['41']}"
            f"최우선매수호가: {msg.values['51']}"
        )
    
    async def on_receive_tick(msg: RealData):
        # 체결 데이터 처리 콜백함수 예시
        self.list.append(orjson.loads(msg.values))
        if len(self.list) >= 100:
            df = pd.DataFrame(self.list)
            print(df)

    async def run():
        # 거래소 통합 종목코드 받아오기 
        kospi, kosdaq = '0', '10'
        kospi_codes = await bot.stock_list(kospi, ats=True)
        kosdaq_codes = await bot.stock_list(kosdaq, ats=True)

        # 호가 데이터 수신 시 콜백 등록
        self.api.add_callback_on_real_data(
            real_type="0D",  # 실시간시세 > 주식호가잔량
            callback=self.on_receive_order_book
        )
        # 체결 데이터 수신 시 콜백 등록
        self.api.add_callback_on_real_data(
            real_tyle="0B",  # 실시간시세 > 주식체결
            callback=self.on_receive_tick
        )

        # 데이터 수신을 위한 서버 요청
        # > 데이터가 수신되면 자동으로 콜백이 호출됨
        # > grp_no(그룹 번호) 별 종목코드(최대 100개) 관리 필요
        codes1 = kospi_codes[:100]  
        await self.api.register_hoga(grp_no='1', codes=codes1)
        await self.api.register_tick(grp_no='1', codes=codes1)
        
        codes2 = kosdaq_codes[:100]
        await self.api.register_hoga(grp_no='2', codes=codes2)

        codes3 = kospi_codes[100:200]
        await self.api.register_tick(grp_no='3', codes=codes1)

        # 데이터 수신 해제
        await self.api.remove_register(grp_no='1', type=['0B', '0D'])  
        await self.api.remove_register(grp_no='2', type='0D')  # 호가 '0D'
        await self.api.remove_register(grp_no='3', type='0B')  # 체결 '0B'
```

실제 운영을 위한 스크립트 예시
```python
import asyncio
from kiwoom import Bot, REAL

async def main():
    # appkey, secretkey 파일 위치 예시
    appkey = "../keys/appkey.txt"
    secretkey = "../keys/secretkey.txt"

    # context 사용을 통한 연결 및 리소스 관리
    async with MyBot(host=REAL, appkey, secretkey) as bot:
        bot.debug(True)  # 요청 및 응답 프린트
        await bot.connect()
        await bot.run()

    # context 외부는 자동 연결 해제
    print('Done')

if __name__ == '__main__':
    asyncio.run(main())

```

## Architecture
Layered Roles
* Client : Http 요청 횟수 제한 관리 및 데이터 연속 조회 관리
* Socket : WebSocket 연결 및 수명 관리, 데이터 수신 후 asyncio.Queue에 전달

* API : 
    * 기본적인 REST API Http 요청 및 응답 관리
    * Queue를 소비하며 ping-pong, login 및 데이터 디코딩 수행
    * 실시간 데이터 주제별 스트림/콜백/구독 관리

* Bot : API 기능을 활용하여 전략을 수행하도록 사용자가 구현 

## License
[MIT License][mit] © Contributors

## Disclaimer
* 본 프로젝트는 키움증권 공식 프로젝트가 아닙니다.
* 실제 운용 전 모의 테스트 환경에서 충분히 검증 바랍니다.
* 발생한 어떠한 손실에 대하여도 본 프로젝트의 개발자는 책임이 없음을 알립니다.



[ocx]: https://github.com/breadum/kiwoom
[doc]: https://breadum.github.io/kiwoom-restful/latest/api
[mit]: https://github.com/breadum/kiwoom-restful?tab=MIT-1-ov-file

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "kiwoom-restful",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "\ud0a4\uc6c0\uc99d\uad8c, Kiwoom, Heroes, REST API",
    "author": null,
    "author_email": "breadum <breadum.kr@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/e2/91/6870ac730b5728c58749d319dea2608d907243711d82513c90385e28ee61/kiwoom_restful-0.2.5.tar.gz",
    "platform": null,
    "description": "# Kiwoom REST API\nSimple Python Wrapper for Kiwoom RESTful API   \n\n## What is it?\n* \ud0a4\uc6c0\uc99d\uad8c\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 'REST' API \uc778\ud130\ud398\uc774\uc2a4 \uc0ac\uc6a9\uc744 \uc704\ud55c \uac04\ub2e8\ud55c Python Wrapper \ubaa8\ub4c8\n* \ub124\ud2b8\uc6cc\ud06c \ud504\ub85c\ud1a0\ucf5c \ub514\ud14c\uc77c\uc740 \uc228\uae30\uace0 \ud22c\uc790 \uc804\ub7b5 \ub85c\uc9c1\uc5d0 \uc9d1\uc911\ud560 \uc218 \uc788\ub3c4\ub85d \uc124\uacc4\n* \uc9c1\uc811 \uac1c\ubc1c\ud558\uace0\uc790 \ud558\ub294 \uc0ac\ub78c\uc744 \uc704\ud55c \ubaa8\ub4c8\ub85c \ubd80\uac00\uc801\uc778 \uae30\ub2a5\uc740 \ucd5c\ub300\ud55c \ubc30\uc81c\n* 'REST' API\uac00 \uc544\ub2cc \uae30\uc874 PyQt \uae30\ubc18 OCX \ubc29\uc2dd API\ub294 [\uc774\uacf3][ocx]\uc744 \ucc38\uc870\n\n## Table of Contents\n- [Kiwoom REST API](#kiwoom-rest-api)\n  - [What is it?](#what-is-it)\n  - [Table of Contents](#table-of-contents)\n  - [Features](#features)\n  - [Installation](#installation)\n  - [Examples](#examples)\n  - [Architecture](#architecture)\n  - [License](#license)\n  - [Disclaimer](#disclaimer)\n\n## Features\n* \uac04\uacb0\ud55c API\ub97c \ud1b5\ud55c \ube60\ub978 \ud504\ub85c\ud1a0 \ud0c0\uc785 \ubc0f \uc804\ub7b5 \ucd5c\uc801\ud654\n* Async Http \uc694\uccad \ubc0f \uc751\ub2f5 + Websocket \ub370\uc774\ud130 \ucc98\ub9ac\n* \uc2e4\uc2dc\uac04 \ub370\uc774\ud130 \ucc98\ub9ac\ub97c \uc704\ud55c non-\ube14\ub85c\ud0b9 \ucf5c\ubc31 \uc2dc\uc2a4\ud15c \n* msgpsec / orjson \uae30\ubc18 \uc2e4\uc2dc\uac04 \uace0\uc18d json \ud30c\uc2f1\n* \ucd08\ub2f9 Http \uc5f0\uacb0/\ud638\ucd9c \uc81c\ud55c \uc790\ub3d9\uad00\ub9ac\n* Websocket ping-pong \uc790\ub3d9\ucc98\ub9ac\n\n\ubaa8\ub4c8 \uad00\ub828 \uc0c1\uc138\ud55c API \ubb38\uc11c \ud398\uc774\uc9c0\ub294 [\uc774\uacf3][doc]\uc744 \ucc38\uace0\ud574 \uc8fc\uc138\uc694.\n\n## Installation\n```bash\n# install from pypi\npip install -U kiwoom-restful\n\n# install from git fork/clone\npip install -e ,\n```\nRequirements\n* python 3.11+ recommended (at leaset 3.10+)\n* install uvloop is a plus for linux environment\n```python\nimport asyncio, uvloop\nasyncio.set_event_loop_policy(uvloop.EventLoopPolicy())\n```\n\n## Examples\n\uae30\ubcf8\uc801\uc778 API \uad6c\ud604 \ubc0f Bot \ud65c\uc6a9\uc608\uc2dc\n```python\nfrom kiwoom import API, Bot\nfrom kiwoom.http import Response\n\n# API \uc0c1\uc138 \uad6c\ud604\nclass MyAPI(API):\n    def __init__(self, host:str, appkey: str, secretkey: str):\n        super().__init__(host, appkey, secretkey)\n    \n    # \uc99d\uad8c\uc0ac\ubcc4\ub9e4\ub9e4\uc0c1\uc704\uc694\uccad\n    async def what_stocks_ebest_bought_today(self) -> list[dict]:\n        endpoint = '/api/dostk/rkinfo'\n        api_id = 'ka10039'\n        data = {\n            'mmcm_cd': '063',    # \ud68c\uc6d0\uc0ac\ucf54\ub4dc\n            'trde_qty_tp': '0',  # \uac70\ub798\ub7c9\uad6c\ubd84 (\uc804\uccb4 '0')\n            'trde_tp': '1',      # \ub9e4\ub9e4\uad6c\ubd84 (\uc21c\ub9e4\uc218 '1')    \n            'dt': '0',           # \uae30\uac04 (\ub2f9\uc77c '0')\n            'stex_tp': '3'       # \uac70\ub798\uc18c\uad6c\ubd84 (\ud1b5\ud569 '3')\n        }\n        # \ub2e4\uc74c \ub370\uc774\ud130\uac00 \uc788\uc73c\uba74 \ubb34\uc870\uac74 \uacc4\uc18d \uc694\uccad\n        should_continue = lambda res: True  \n        # \ud0a4\uc6c0 REST API \uc11c\ubc84 \uc751\ub2f5 \ub370\uc774\ud130 \ucde8\ud569 \ud6c4 \ubc18\ud658\n        res: dict = await self.request_until(\n            should_continue, \n            endpoint, \n            api_id, \n            data=data\n        )\n        key = 'sec_trde_upper'\n        if key in res:\n            return res[key]\n        return []  # or raise Exception\n\n# API \ud65c\uc6a9 \ud074\ub798\uc2a4\nclass MyBot(Bot):\n    def __init__(self, host: str, appkey: str, secretkey: str):\n        super().__init__(\n            host, appkey, secretkey, \n            api=MyAPI(host, appkey, secretkey) \n        )\n        self.blacklist: set[str] = set()\n\n    async def add_to_blacklist(self) -> None:\n        data = await self.api.what_stocks_ebest_bought_today()\n        ETFs = (\"KODEX\", \"TIGER\", \"RISE\")\n        top10 = data[:10]\n        for item in top10:\n            # Roughly skip ETFs\n            name = item[\"stk_nm\"]\n            if any(etf in name for etf in ETFs):\n                continue\n\n            self.blacklist.add(item[\"stk_cd\"])\n```\n\n\nBot \uae30\ubcf8 \ub0b4\uc7a5\ud568\uc218 2\uac00\uc9c0 \ud65c\uc6a9\uc608\uc2dc\n```python\nimport asyncio\nfrom kiwoom import Bot\nfrom kiwoom.proc import candle, trade\n\nclass MyBot(Bot):\n    async def run():\n        # \ubd84\ubd09\ucc28\ud2b8 \ub370\uc774\ud130\n        code = '005930_AL'  # \uac70\ub798\uc18c \ud1b5\ud569\ucf54\ub4dc\n        df = await self.candle(\n                code=code, \n                period='min',   # 'tick' | 'min' | 'day'\n                ctype='stock',  # 'stock' | 'sector'\n                start='20250901',\n                end='',\n        )\n        await candle.to_csv(file=f'{code}.csv', path='./', df)\n\n        # \uacc4\uc88c \uccb4\uacb0\ub0b4\uc5ed \ub370\uc774\ud130 (\ucd5c\uadfc 2\ub2ec\ub9cc)\n        fmt = '%Y%m%d'\n        today = datetime.today()\n        start = today - timedelta(days=60)\n        start = start.strftime(fmt)\n        end = end.strftime(fmt)\n        trs = self.trade(start, end)\n\n        # \ud0a4\uc6c0\uc99d\uad8c 0343 \ub9e4\ub9e4\ub0b4\uc5ed \ud654\uba74 \uc2a4\ud0c0\uc77c\ub85c \uc800\uc7a5\n        await trade.to_csv('trade.csv', './', trs)\n```\n\nWebsocket \uc2e4\uc2dc\uac04 \ub370\uc774\ud130 \uc694\uccad \uad6c\ud604\uc608\uc2dc\n```python\nimport asyncio\nimport orjson\nimport pandas as pd\nfrom kiwoom import Bot\nfrom kiwoom.config.real import RealData\n\nclass MyBot(Bot):\n    def __init__(self, host: str, appkey: str, secretkey: str):\n        super().__init__(host, appkey, secretkey)\n        self.ticks: list[dict[str, str]] = []\n\n    async def on_receive_order_book(msg: RealData):\n        # \ud638\uac00 \ub370\uc774\ud130 \ucc98\ub9ac \ucf5c\ubc31\ud568\uc218 \uc608\uc2dc\n        # RealData(\n        #   values: bytes  # utf-8 encoded bytes\n        #   type: str,     # API type (ex. 0B, 0D, ...)\n        #   name: str,     # API name (ex. \uc8fc\uc2dd\uccb4\uacb0, \uc8fc\uc2dd\ud638\uac00\uc794\ub7c9, ...)\n        #   item: str      # \uc885\ubaa9\ucf54\ub4dc\n        # )\n        # values\ub294 \uae30\ud638\uc5d0 \ub9de\uac8c parsing \ud574\uc11c \uc0ac\uc6a9\n        # msg.values = json.loads(msg.values) # slow\n        msg.values = orjson.loads(msg.values) # fast\n        print(\n            f\"\uc885\ubaa9\ucf54\ub4dc: {msg.item}, \"\n            f\"\ucd5c\uc6b0\uc120\ub9e4\ub3c4\ud638\uac00: {msg.values['41']}\"\n            f\"\ucd5c\uc6b0\uc120\ub9e4\uc218\ud638\uac00: {msg.values['51']}\"\n        )\n    \n    async def on_receive_tick(msg: RealData):\n        # \uccb4\uacb0 \ub370\uc774\ud130 \ucc98\ub9ac \ucf5c\ubc31\ud568\uc218 \uc608\uc2dc\n        self.list.append(orjson.loads(msg.values))\n        if len(self.list) >= 100:\n            df = pd.DataFrame(self.list)\n            print(df)\n\n    async def run():\n        # \uac70\ub798\uc18c \ud1b5\ud569 \uc885\ubaa9\ucf54\ub4dc \ubc1b\uc544\uc624\uae30 \n        kospi, kosdaq = '0', '10'\n        kospi_codes = await bot.stock_list(kospi, ats=True)\n        kosdaq_codes = await bot.stock_list(kosdaq, ats=True)\n\n        # \ud638\uac00 \ub370\uc774\ud130 \uc218\uc2e0 \uc2dc \ucf5c\ubc31 \ub4f1\ub85d\n        self.api.add_callback_on_real_data(\n            real_type=\"0D\",  # \uc2e4\uc2dc\uac04\uc2dc\uc138 > \uc8fc\uc2dd\ud638\uac00\uc794\ub7c9\n            callback=self.on_receive_order_book\n        )\n        # \uccb4\uacb0 \ub370\uc774\ud130 \uc218\uc2e0 \uc2dc \ucf5c\ubc31 \ub4f1\ub85d\n        self.api.add_callback_on_real_data(\n            real_tyle=\"0B\",  # \uc2e4\uc2dc\uac04\uc2dc\uc138 > \uc8fc\uc2dd\uccb4\uacb0\n            callback=self.on_receive_tick\n        )\n\n        # \ub370\uc774\ud130 \uc218\uc2e0\uc744 \uc704\ud55c \uc11c\ubc84 \uc694\uccad\n        # > \ub370\uc774\ud130\uac00 \uc218\uc2e0\ub418\uba74 \uc790\ub3d9\uc73c\ub85c \ucf5c\ubc31\uc774 \ud638\ucd9c\ub428\n        # > grp_no(\uadf8\ub8f9 \ubc88\ud638) \ubcc4 \uc885\ubaa9\ucf54\ub4dc(\ucd5c\ub300 100\uac1c) \uad00\ub9ac \ud544\uc694\n        codes1 = kospi_codes[:100]  \n        await self.api.register_hoga(grp_no='1', codes=codes1)\n        await self.api.register_tick(grp_no='1', codes=codes1)\n        \n        codes2 = kosdaq_codes[:100]\n        await self.api.register_hoga(grp_no='2', codes=codes2)\n\n        codes3 = kospi_codes[100:200]\n        await self.api.register_tick(grp_no='3', codes=codes1)\n\n        # \ub370\uc774\ud130 \uc218\uc2e0 \ud574\uc81c\n        await self.api.remove_register(grp_no='1', type=['0B', '0D'])  \n        await self.api.remove_register(grp_no='2', type='0D')  # \ud638\uac00 '0D'\n        await self.api.remove_register(grp_no='3', type='0B')  # \uccb4\uacb0 '0B'\n```\n\n\uc2e4\uc81c \uc6b4\uc601\uc744 \uc704\ud55c \uc2a4\ud06c\ub9bd\ud2b8 \uc608\uc2dc\n```python\nimport asyncio\nfrom kiwoom import Bot, REAL\n\nasync def main():\n    # appkey, secretkey \ud30c\uc77c \uc704\uce58 \uc608\uc2dc\n    appkey = \"../keys/appkey.txt\"\n    secretkey = \"../keys/secretkey.txt\"\n\n    # context \uc0ac\uc6a9\uc744 \ud1b5\ud55c \uc5f0\uacb0 \ubc0f \ub9ac\uc18c\uc2a4 \uad00\ub9ac\n    async with MyBot(host=REAL, appkey, secretkey) as bot:\n        bot.debug(True)  # \uc694\uccad \ubc0f \uc751\ub2f5 \ud504\ub9b0\ud2b8\n        await bot.connect()\n        await bot.run()\n\n    # context \uc678\ubd80\ub294 \uc790\ub3d9 \uc5f0\uacb0 \ud574\uc81c\n    print('Done')\n\nif __name__ == '__main__':\n    asyncio.run(main())\n\n```\n\n## Architecture\nLayered Roles\n* Client : Http \uc694\uccad \ud69f\uc218 \uc81c\ud55c \uad00\ub9ac \ubc0f \ub370\uc774\ud130 \uc5f0\uc18d \uc870\ud68c \uad00\ub9ac\n* Socket : WebSocket \uc5f0\uacb0 \ubc0f \uc218\uba85 \uad00\ub9ac, \ub370\uc774\ud130 \uc218\uc2e0 \ud6c4 asyncio.Queue\uc5d0 \uc804\ub2ec\n\n* API : \n    * \uae30\ubcf8\uc801\uc778 REST API Http \uc694\uccad \ubc0f \uc751\ub2f5 \uad00\ub9ac\n    * Queue\ub97c \uc18c\ube44\ud558\uba70 ping-pong, login \ubc0f \ub370\uc774\ud130 \ub514\ucf54\ub529 \uc218\ud589\n    * \uc2e4\uc2dc\uac04 \ub370\uc774\ud130 \uc8fc\uc81c\ubcc4 \uc2a4\ud2b8\ub9bc/\ucf5c\ubc31/\uad6c\ub3c5 \uad00\ub9ac\n\n* Bot : API \uae30\ub2a5\uc744 \ud65c\uc6a9\ud558\uc5ec \uc804\ub7b5\uc744 \uc218\ud589\ud558\ub3c4\ub85d \uc0ac\uc6a9\uc790\uac00 \uad6c\ud604 \n\n## License\n[MIT License][mit] \u00a9 Contributors\n\n## Disclaimer\n* \ubcf8 \ud504\ub85c\uc81d\ud2b8\ub294 \ud0a4\uc6c0\uc99d\uad8c \uacf5\uc2dd \ud504\ub85c\uc81d\ud2b8\uac00 \uc544\ub2d9\ub2c8\ub2e4.\n* \uc2e4\uc81c \uc6b4\uc6a9 \uc804 \ubaa8\uc758 \ud14c\uc2a4\ud2b8 \ud658\uacbd\uc5d0\uc11c \ucda9\ubd84\ud788 \uac80\uc99d \ubc14\ub78d\ub2c8\ub2e4.\n* \ubc1c\uc0dd\ud55c \uc5b4\ub5a0\ud55c \uc190\uc2e4\uc5d0 \ub300\ud558\uc5ec\ub3c4 \ubcf8 \ud504\ub85c\uc81d\ud2b8\uc758 \uac1c\ubc1c\uc790\ub294 \ucc45\uc784\uc774 \uc5c6\uc74c\uc744 \uc54c\ub9bd\ub2c8\ub2e4.\n\n\n\n[ocx]: https://github.com/breadum/kiwoom\n[doc]: https://breadum.github.io/kiwoom-restful/latest/api\n[mit]: https://github.com/breadum/kiwoom-restful?tab=MIT-1-ov-file\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Simple Python Wrapper for Kiwoom REST API+",
    "version": "0.2.5",
    "project_urls": {
        "Documentation": "https://breadum.github.io/kiwoom-restful/latest/api",
        "Download": "https://pypi.org/project/kiwoom-restful",
        "Homepage": "https://github.com/breadum/kiwoom-restful",
        "Issues": "https://github.com/breadum/kiwoom-restful/issues",
        "Repository": "https://github.com/breadum/kiwoom-restful"
    },
    "split_keywords": [
        "\ud0a4\uc6c0\uc99d\uad8c",
        " kiwoom",
        " heroes",
        " rest api"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "83a42947964f34d4cd9cfcb12679846eb14fe977072d2bb2b6207e2c107a719a",
                "md5": "e33d283e87ef328b19a02c4300a59f28",
                "sha256": "d1eed48d4069f603375e67f34d24c48316e8a9e50084989e04656add03b39dbe"
            },
            "downloads": -1,
            "filename": "kiwoom_restful-0.2.5-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "e33d283e87ef328b19a02c4300a59f28",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 29340,
            "upload_time": "2025-09-14T18:18:53",
            "upload_time_iso_8601": "2025-09-14T18:18:53.992323Z",
            "url": "https://files.pythonhosted.org/packages/83/a4/2947964f34d4cd9cfcb12679846eb14fe977072d2bb2b6207e2c107a719a/kiwoom_restful-0.2.5-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e2916870ac730b5728c58749d319dea2608d907243711d82513c90385e28ee61",
                "md5": "43aacdee9e99ea3d55a42f9cd6161151",
                "sha256": "a8dbe36101e8220c8292a5a78d7404df5f6ca63dd1dbb56285d8c9a07d97285b"
            },
            "downloads": -1,
            "filename": "kiwoom_restful-0.2.5.tar.gz",
            "has_sig": false,
            "md5_digest": "43aacdee9e99ea3d55a42f9cd6161151",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 26369,
            "upload_time": "2025-09-14T18:18:55",
            "upload_time_iso_8601": "2025-09-14T18:18:55.040092Z",
            "url": "https://files.pythonhosted.org/packages/e2/91/6870ac730b5728c58749d319dea2608d907243711d82513c90385e28ee61/kiwoom_restful-0.2.5.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-09-14 18:18:55",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "breadum",
    "github_project": "kiwoom-restful",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "kiwoom-restful"
}
        
Elapsed time: 2.02103s