[Python 재무제표 크롤링 #8] 이베스트 API (Ebest API) 접속, 로그인 하기
| 이베스트 API (Ebest API)
이베스트 API(Ebest API)는 주식 데이터 조회, 주식 주문, 체결 등을 프로그래밍 언어로 제어할 수 있게 해주는 인터페이스입니다.(API에 관한 설명)이 API를 사용하려면 이베스트 증권사의 증권 계정을 만든 후, 이베스트 API를 다운로드 받아서 사용해야 합니다. 아래는 API 다운로드 방법 및 몇 가지 사용 방법을 게시한 사이트입니다.
2. 모의투자 가입하기
3. 기초 API 익히기
| 이베스트 API를 통해 로그인 하기
위의 절차를 진행했으면 이제 xingAPI를 통해서 증권 데이터에 접근할 수 있습니다. xingAPI은 이벤트 기반 방식으로 설계되어 있어서 API사용자가 주식 매도,매수 혹은 증권 데이터를 요청했을 경우 서버에서 데이터를 받을 때 이벤트 방식으로 수신하게 되어 있습니다.
먼저 주식 매도,매수 혹은 증권 데이터를 요청하기 전에는 증권사 서버에 로그인 해야합니다. 이제부터는 증권사 서버에 로그인 하기 위해 어떻게 파이썬 코드를 작성해야 하는지 알아보도록 하겠습니다.
아래는 xinAPI를 사용하기 위해 임포트 해야하는 모듈입니다.
import pythoncom
import win32com.client as winAPI
위 모듈은 pywin32 패키지를 설치하면 사용할 수 있습니다. 이 모듈들은 COM(Component Object Model)을 통해 xingAPI 프로그램에 접근하기 위해 쓰입니다.
또한 이벤트 기반 방식으로 되어 데이터를 수신하기 되어 있기 때문에 이 이벤트를 받을 클래스를 선언해야 합니다.
STAND_BY = 0
RECEIVED = 1
class XASessionEvents:
login_state = STAND_BY
def OnLogin(self, code, msg):
XASessionEvents.login_state = RECEIVED
print(msg)
def OnDisconnect(self, code, msg):
pass
class XAQueryEvents:
query_state = STAND_BY
def OnReceiveData(self, code):
XAQueryEvents.query_state = RECEIVED
def OnReceiveMessage(self, error, nMessageCode, szMessage):
print(szMessage)
XASessionEvents는 서버와의 세션이 연결됬는 지에 대한 여부를 알려주는 이벤트를 처리하는 역할을 합니다. OnLogin 메서드를 통해 로그인 관련 메세지를 받습니다.
XAQueryEvents는 증권 데이터를 요청할 시, 요청한 데이터를 수신했을 때 발생하는 이벤트를 처리하는 클래스입니다. OnReceiveData, OnReceiveMessage 메서드를 통해 그와 관련된 메세지를 수신합니다.
아래는 API 서버에 로그인하는 코드입니다.
SERVER_PORT = 20001
SHOW_CERTIFICATE_ERROR_DIALOG = False
REPEATED_DATA_QUERY = 1
TRANSACTION_REQUEST_EXCESS = -21
TODAY = datetime.datetime.now().strftime('%Y%m%d')
if __name__ == "__main__":
id = "아이디"
password = "비밀번호"
certificate_password = "공인인증서_비밀번호"
xa_session = winAPI.DispatchWithEvents("XA_Session.XASession", XASessionEvents)
# demo.ebestsec.co.kr => 모의투자
# hts.ebestsec.co.kr => 실투자
xa_session.ConnectServer("hts.ebestsec.co.kr", SERVER_PORT)
xa_session.Login(id, password, certificate_password, SERVER_PORT, SHOW_CERTIFICATE_ERROR_DIALOG)
while XASessionEvents.login_state is STAND_BY:
pythoncom.PumpWaitingMessages()
XASessionEvents.login_state = STAND_BY
증권사 API의 실서버에 로그인 하기 위해서는 아이디, 비밀번호, 공인인증서 비밀번호가 필요합니다. 모의투자 서버에 접속하기 위해서는 공인인증서 비밀번호는 필요없지만 계속해서 모의투자 신청을 해야하기 때문에 번거롭습니다. 따라서 증권 데이터만 받는 용도로 쓸시에는 실투자 서버에 접속하는 것이 좋습니다.
위의 코드를 설명하면 winAPI.DispatchWithEvents는 세션 관련 API 이벤트가 발생했을 시 XASessionEvents 클래스에 해당 이벤트를 처리하기 위해 등록하는 코드입니다. 그리고 xa_session.ConnectServer를 통해 서버를 설정하고 Login 메서드를 통해 로그인을 시도합니다.
이벤트 기반이기 때문에 이벤트가 올 때까지 기다려야 합니다. 그렇지 않을 시에는 데이터가 오기 전에 프로그램이 먼저 끝나버리고 말죠. 이 기다리는 로직을 구현한 것이 아래의 코드입니다. XASeesionEvents.login_state가 순간적으로 바뀔 시 while loop를 빠져나오고 login_state를 원상태로 되돌리죠.
while XASessionEvents.login_state is STAND_BY:
pythoncom.PumpWaitingMessages()
XASessionEvents.login_state = STAND_BY
| 전체 코드 및 실행 결과
import pythoncom
import win32com.client as winAPI
STAND_BY = 0
RECEIVED = 1
class XASessionEvents:
login_state = STAND_BY
def OnLogin(self, code, msg):
XASessionEvents.login_state = RECEIVED
print(msg)
def OnDisconnect(self, code, msg):
pass
class XAQueryEvents:
query_state = STAND_BY
def OnReceiveData(self, code):
XAQueryEvents.query_state = RECEIVED
def OnReceiveMessage(self, error, nMessageCode, szMessage):
print(szMessage)
SERVER_PORT = 20001
SHOW_CERTIFICATE_ERROR_DIALOG = False
REPEATED_DATA_QUERY = 1
TRANSACTION_REQUEST_EXCESS = -21
TODAY = datetime.datetime.now().strftime('%Y%m%d')
if __name__ == "__main__":
id = "아이디"
password = "비밀번호"
certificate_password = "공인인증서_비밀번호"
xa_session = winAPI.DispatchWithEvents("XA_Session.XASession", XASessionEvents)
if xa_session.IsConnected() is True:
xa_session.DisconnectServer()
# demo.ebestsec.co.kr => 모의투자
# hts.ebestsec.co.kr => 실투자
xa_session.ConnectServer("hts.ebestsec.co.kr", SERVER_PORT)
xa_session.Login(id, password, certificate_password, SERVER_PORT, SHOW_CERTIFICATE_ERROR_DIALOG)
while XASessionEvents.login_state is STAND_BY:
pythoncom.PumpWaitingMessages()
XASessionEvents.login_state = STAND_BY
로그인 성공