[키움 OpenAPI] 기본 개발 가이드 ‘로그인 버전처리’ 코드 (in Python)




키움API에서 제공하는 개발 가이드의 내용 중 ‘로그인 버전처리’ OpenAPI 사용에 대하여 테스트한 내용을 정리합니다.


로그인 버전 처리 API

키움 OpenAPI를 사용하기 위하여 로그인을 처리하는 API 입니다.

OpenAPI를 사용하기 위해서는 반드시 로그인이 되어야 합니다.

기본 설명 (from. KOA StudioSA)

‘KOA StudioSA’ 에서는 아래와 같이 설명하고 있습니다.

[로그인 개요]
로그인은 CommConnect()함수를 호출하며 OnEventConnect 이벤트 인자값으로 로그인 성공여부를 알수 있습니다.
이 값이 0이면 성공이고 나머지는 실패로 오류코드값을 참고해서 실패원인을 파악할수 있습니다. 
실서버와 동일한 시세데이터로 주문테스트를 할수 있는 모의투자서버를 제공하는데 로그인창에서 "모의투자 서버"을 선택해서 간단히 접속하실수 있습니다.

[수동 로그인]
로그인창에 로그인ID와 비밀번호를 직접입력해서 로그인을 하는것을 말하며 기본적으로 이 로그인방법을 사용하게 됩니다.
수동 로그인중에 버전처리내용이 있는 경우 버전처리도 함께 진행됩니다.

[자동 로그인]
로그인한 다음 계좌비밀번호 입력창을 통해 자동로그인을 설정할 수 있습니다.
트레이 메뉴(모니터 오른쪽 하단)에서 "계좌비밀번호 저장" 메뉴를 선택하면 화면이 표시되는데 여기서 로그인 이후 사용할 계좌와
계좌비밀번호를 입력하고 등록버튼을 눌러서 저장한 다음 계좌번호 아래에 있는 AUTO체크 박스를 선택하시면 자동 로그인을 위한
설정이 모두 끝납니다.
로그인 설정을 자동으로 하면 종목정보를 제외한 버전처리를 모두 무시하게 되며 버전처리를 다시 받으려면 AUTO버튼을 체크
해지하고 프로그램을 재 실행 하시면 됩니다.

[계좌비밀번호 설정]
잔고나 주문가능금액,수량등 계좌관련 조회나 주문전에 미리 계좌비밀번호를 설정해야 오류 알림창과 -301 오류코드없이 사용하실수 있습니다.
계좌비밀번호 설정은 계좌비밀번호 입력창에서만 가능하며 이 입력창은 메뉴나 함수로 출력하실수 있습니다.
메뉴이용 - 로그인후 트레이 메뉴(모니터 오른쪽 하단)에서 "계좌비밀번호 저장"선택
함수이용 - 로그인후 OpenAPI.KOA_Functions(_T("ShowAccountWindow"), _T(""))호출

[버전 처리]
로그인할때 버전처리가 필요한 경우 버전처리 알림창이 출력될수 있습니다.
이 알림창이 표시되면 OpenAPI프로그램을 먼저 모두 종료한다음 알림창에 있는 닫기버튼을 누르셔야 합니다.
그렇지 않으면 버전처리가 정상적으로 끝나지 않아서 로그인할때 또 버전처리 알림창이 표시됩니다.
그리고 알림창이 표시되었을때 KOA Studio도 실행중이면 역시 함께 종료시켜주셔야 합니다.
이렇게 OpenAPI프로그램을 모두 종료하신 다음 알림창을 닫아주시면 버전처리가 자동으로 진행되고 프로그램을 재실행 해주시면 됩니다.

[모의투자]
로그인 창에서 모의투자접속을 선택을 체크하면 모의투자로 접속하며 이 체크를 풀면 실서버(운영서버)로 접속합니다.
단 KOA Studio 프로그램은 항상 모의투자로만 접속가능해서 모의투자접속 체크 해지가 않됩니다.
모의투자로 로그인하시려면 당사 홈페이지에서 미리 모의투자 사용신청을 하셔야 하며 상세한 내용은 당사 홈페이지를 참고하시기 바랍니다.
모의투자 계좌번호, 주문 가능종목, 수수료등 정책은 실서버와 차이가 있으므로 상세한 내용은 홈페이지 내용을 꼭 참고해 주세요.

[중복로그인]
OpenAPI는 중복로그인을 허용하지 않기 때문에 동일PC나 다른PC나 관계없이 마지막에 로그인한 경우만 유지되고 이전에 로그인한 프로그램은 자동으로 로그오프됩니다.
모의투자서버 로그인 역시 중복로그인을 허용하지 않습니다.

관련 함수 (from. KOA StudioSA)

‘KOA StudioSA’ 에서는 아래와 같이 설명하고 있습니다.

CommConnect() 함수

수동 로그인설정인 경우 로그인창을 출력해서 로그인을 시도하거나 자동로그인 설정인 경우 로그인창 출력없이 로그인을 시도합니다.

GetConnectState() 함수

현재 로그인 상태를 알려줍니다.
리턴값 1:연결, 0:연결안됨

GetLoginInfo() 함수

로그인 후 사용할 수 있으며 인자값에 대응하는 정보를 얻을 수 있습니다.

인자는 다음값을 사용할 수 있습니다.

"ACCOUNT_CNT" : 보유계좌 수를 반환합니다.
"ACCLIST" 또는 "ACCNO" : 구분자 ';'로 연결된 보유계좌 목록을 반환합니다.
"USER_ID" : 사용자 ID를 반환합니다.
"USER_NAME" : 사용자 이름을 반환합니다.
"KEY_BSECGB" : 키보드 보안 해지여부를 반환합니다.(0 : 정상, 1 : 해지)
"FIREW_SECGB" : 방화벽 설정여부를 반환합니다.(0 : 미설정, 1 : 설정, 2 : 해지)
"GetServerGubun" : 접속서버 구분을 반환합니다.(1 : 모의투자, 나머지 : 실서버)

리턴값
인자값에 대응하는 정보를 얻을 수 있습니다.

OnEventConnect() 이벤트

[OnEventConnect()이벤트]

OnEventConnect(
long nErrCode   // 로그인 상태를 전달하는데 자세한 내용은 아래 상세내용 참고
)

로그인 처리 이벤트입니다. 성공이면 인자값 nErrCode가 0이며 에러는 다음과 같은 값이 전달됩니다.
 
nErrCode별 상세내용
-100 사용자 정보교환 실패
-101 서버접속 실패
-102 버전처리 실패

OnReceiveMsg() 이벤트

OnReceiveMsg(
BSTR sScrNo,   // 화면번호
BSTR sRQName,  // 사용자 구분명
BSTR sTrCode,  // TR이름
BSTR sMsg     // 서버에서 전달하는 메시지
)

서버통신 후 수신한 메시지를 알려줍니다.
메시지에는 6자리 코드번호가 포함되는데 이 코드번호는 통보없이 수시로 변경될 수 있습니다. 따라서 주문이나 오류관련처리를
이 코드번호로 분류하시면 안됩니다.

파일 구조

ㄴ KiwoomAPI.py
ㄴ KiwoomMain.py

KiwoomAPI.py

from PyQt5.QtWidgets import *
from PyQt5.QAxContainer import *
from PyQt5.QtCore import *

class KiwoomAPI(QAxWidget):
    def __init__ (self):
        super().__init__()
        self.set_kiwoom_api()
        self.set_event_slot()

# ========== #
    def set_kiwoom_api(self):
        self.setControl("KHOPENAPI.KHOpenAPICtrl.1")

    def set_event_slot(self):
        # 공통
        self.OnReceiveMsg.connect(self.E_OnReceiveMsg)

        # 로그인 버전처리
        self.OnEventConnect.connect(self.E_OnEventConnect)

# ========== #
    ### Event 함수 ###
    ## 공통 ##
    def E_OnReceiveMsg(self, sScrNo, sRQName, sTrCode, sMsg):
        print(sScrNo, sRQName, sTrCode, sMsg)

    ## 로그인 버전처리 ##
    def E_OnEventConnect(self, nErrCode):
        print(nErrCode)

        self.event_loop_CommConnect.exit()

# ========== #
    ### OpenAPI 함수 ###
    ## 로그인 버전처리 ##
    # 로그인
    def CommConnect(self):
        self.dynamicCall('CommConnect()')
        self.event_loop_CommConnect = QEventLoop()
        self.event_loop_CommConnect.exec_()

    # 로그인 상태
    def GetConnectState(self):
        ret = self.dynamicCall('GetConnectState()')

        print(ret)

    def GetLoginInfo(self, kind=''):
        ret = self.dynamicCall('GetLoginInfo(String)', kind)

        print(ret)

KiwoomMain.py

import sys
from PyQt5.QtWidgets import *
import KiwoomAPI

class KiwoonMain:
    def __init__(self):
        self.kiwoom = KiwoomAPI.KiwoomAPI()
        self.kiwoom.CommConnect()

# ========== #
    def GetLoginInfo(self):
        # 로그인 상태
        self.kiwoom.GetConnectState()

        # 로그인 정보
        self.kiwoom.GetLoginInfo("ACCOUNT_CNT")
        self.kiwoom.GetLoginInfo("ACCLIST")
        self.kiwoom.GetLoginInfo("USER_ID")
        self.kiwoom.GetLoginInfo("USER_NAME")
        self.kiwoom.GetLoginInfo("KEY_BSECGB")
        self.kiwoom.GetLoginInfo("FIREW_SECGB")
        self.kiwoom.GetLoginInfo("GetServerGubun")

실행

app = QApplication(sys.argv)
api_con = KiwoonMain()

result = api_con.GetLoginInfo()
print(result)

결과

0  # nErrCode
1  # GetConnectState()
1  # ACCOUNT_CNT
ACCLIST1;
USER_ID
USER_NAME
0  # KEY_BSECGB
1  # FIREW_SECGB
1  # GetServerGubun

연관 포스트

[키움API] 기본 개발 가이드 내용 및 샘플 코드 (in Python) / OpenAPI 오류코드

[키움API] TR 목록 및 샘플 코드 (in Python)




7 thoughts on “[키움 OpenAPI] 기본 개발 가이드 ‘로그인 버전처리’ 코드 (in Python)”

  1. 키움 Open API 중복 로그인 불가 에러 메시지가 계속 나와서 접속이 해지되는데 어떻게 해결할 수 있는지 혹시 아시나요?

    응답
    • 중복로그인은 키움 정책에 의해 허용하지 않는 것으로 확인됩니다.
      영웅문이나 API 등 로그인된 사항이 있는지 체크를 하고 종료 후, 시도해 보셔야 하겠습니다.

      [중복로그인]
      OpenAPI는 중복로그인을 허용하지 않기 때문에 동일PC나 다른PC나 관계없이 마지막에 로그인한 경우만 유지되고 이전에 로그인한 프로그램은 자동으로 로그오프됩니다.
      모의투자서버 로그인 역시 중복로그인을 허용하지 않습니다.

      응답

Leave a Comment