Source code for pyqqq.brokerage.ebest.oauth

import datetime as dtm
import requests


[docs] class EBestAuth: """ LS(구 이베스트투자)증권 인증 정보를 담고 있는 객체 Args: appkey (str): 앱 키 appsecret (str): 앱 시크릿 paper_trading (bool): 모의 투자 여부 """
[docs] def __init__(self, appkey: str, appsecret: str, paper_trading: bool = False): self.appkey = appkey self.appsecret = appsecret self.paper_trading = paper_trading self.access_token = None self.expired_at: dtm.datetime = None
@property def host_url(self) -> str: """ 모의/실전 투자 환경에 따른 API 호스트 URL을 반환합니다. Returns: str: API 호스트 URL """ return "https://openapi.ls-sec.co.kr:8080" @property def websocket_url(self) -> str: """ 실시간 데이터 스트리밍을 위한 웹소켓 URL을 반환합니다. Returns: str: 웹소켓 URL """ if self.paper_trading: return "wss://openapi.ls-sec.co.kr:29443" else: return "wss://openapi.ls-sec.co.kr:9443"
[docs] def get_token(self, refresh=False) -> str: """ 액세스 토큰을 반환합니다. Args: refresh (bool): 강제 재발급 Returns: str: 액세스 토큰 """ if refresh or (self.access_token is None or self.expired_at < dtm.datetime.now()): token, expired_at = self.issue_access_token() self.access_token = token self.expired_at = expired_at return self.access_token
[docs] def issue_access_token(self): """ 액세스 토큰을 발급합니다. Returns: tuple: 액세스 토큰과 만료 시간을 담은 튜플 """ if self.appkey is None or self.appsecret is None: raise ValueError("App key and app secret must be set") headers = {"content-type": "application/x-www-form-urlencoded"} body = { "grant_type": "client_credentials", "appkey": self.appkey, "appsecretkey": self.appsecret, "scope": "oob", } r = requests.post(f"{self.host_url}/oauth2/token", headers=headers, data=body) r.raise_for_status() data = r.json() access_token = data["access_token"] expires_in = data["expires_in"] next_day_am7 = dtm.datetime.now().replace(hour=7, minute=0, second=0, microsecond=0) + dtm.timedelta(days=1) expired_at = min(dtm.datetime.now() + dtm.timedelta(seconds=expires_in), next_day_am7) return access_token, expired_at