친절한곳

키움 Open API+ 로그인하기 


이전 챕터에서 사용한 PyQt5를 사용하여 UI를 구성한 후 키움 증권에 로그인 하도록 하겠습니다.
키움 Open API+를 사용하려면 먼저 키움 증권사 서버에 로그인 해야 합니다.

먼저 PyCharm을 실행 하여 아래와 같이 kiwoomLogin.py 파일을 생성합니다.
(좌측 상단 프로젝트 폴더 우클릭 New > Python File 클릭 후 노출되는 창에서 kiwoomLogin 입력 후 OK 버튼 클릭)



이후 아래의 소스코드를 kiwoomLogin.py 파일에 입력합니다.
(해당 글을 보시는 분들의 편의를 위해 최대한 주석을 달아두었습니다.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QAxContainer import *
 
class MyWindow(QMainWindow):    # MyWindow 클래스 QMainWindow 클래스를 상속 받아 생성됨
    def __init__(self): # MyWindow 클래스의 초기화 함수(생성자)
        super().__init__()  # 부모클래스 QMainWindow 클래스의 초기화 함수(생성자)를 호출
        self.setWindowTitle("devshj")  # 윈도우 창 타이틀을 devshj로 변경 
        self.setGeometry(300300300150)    # 윈도우 창 위치 및 크기를 지정 (x축 시작점, y축 시작점, 넓이, 높이)
 
        self.kiwoom = QAxWidget("KHOPENAPI.KHOpenAPICtrl.1")    # 키움증권 Open API+의 ProgID를 사용하여 생성된 QAxWidget을 kiwoom 변수에 할당
 
        btn1 = QPushButton("Login", self)   # Login 텍스트를 포함한 버튼을 생성하여 btn1 변수에 할당
        btn1.move(2020)   # 해당 버튼의 위치를 지정 (x축 시작점, y축 시작점)
        btn1.clicked.connect(self.btn1_clicked) # 해당 버튼의 클릭 이벤트를 btn1_clicked 함수와 연결함
 
        btn2 = QPushButton("Check state", self) # Check state 텍스트를 포함한 버튼을 생성하여 btn2 변수에 할당
        btn2.move(2070)   # 해당 버튼의 위치를 지정 (x축 시작점, y축 시작점)
        btn2.clicked.connect(self.btn2_clicked) # 해당 버튼의 클릭 이벤트를 btn2_clicked 함수와 연결함
 
    def btn1_clicked(self): # Login 버튼 클릭 시 실행되는 함수
        ret = self.kiwoom.dynamicCall("CommConnect()")  # 키움 로그인 윈도우를 실행
 
    def btn2_clicked(self): # Check state 버튼 클릭 시 실행되는 함수
        # GetConnectState() > 0:미연결, 1:연결완료
        if self.kiwoom.dynamicCall("GetConnectState()"== 0:   # 로그인 상태값이 0 이라면
            self.statusBar().showMessage("Not connected")   # PyQt5 statusBar에 Not connected 메시지를 노출함
        else:   # 로그인 상태값이 0 이 아니라면
            self.statusBar().showMessage("Connected")   # PyQt5 statusBar에 Connected 메시지를 노출함
 
# py 파일 실행시 제일 먼저 동작
if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = MyWindow()   # MyWindow 클래스를 생성하여 myWondow 변수에 할당
    myWindow.show() # MyWindow 클래스를 노출
    app.exec_() # 메인 이벤트 루프에 진입 후 프로그램이 종료될 때까지 무한 루프 상태 대기


해당 코드를 입력 후 실행을 하게되면 (단축키 Ctrl+Shift+F10)
아래와 같은 화면이 노출됩니다.



현재는 로그인이 안되어 있는 상태이기 때문에 Check state 버튼을 클릭하면,

아래와 같이 왼쪽 하단에 Not connected 텍스트가 노출되게 됩니다.




로그인 버튼을 클릭 시 아래와 같이 키움증권 로그인 윈도우가 노출되게 됩니다.



모의투자 접속에 체크 시 고객 ID, 비밀번호 입력 후 모의투자 모드로 접근이 가능하며,
모의투자 접속에 미체크 시 고객 ID, 비밀번호, 인증비밀번호를 입력 후 실제 모드로 접근 가능합니다.
원하시는 모드의 정보를 입력 후 로그인 버튼을 클릭 시
아래와 같이 버전 처리 완료 후 정상적으로 로그인이 완료됩니다.



Tip. 버전 처리 중 아래와 같은 화면이 노출된다면




아래와 같이 왼쪽 하단에 붉은색의 버튼을 눌러 프로그램 종료 후 다시 시작하여 재 로그인 해야 합니다.




버전 처리 후 로그인이 완료 되었다면,

Check state 버튼을 클릭할 경우 왼쪽 하단에 Connected 텍스트가 노출되게 됩니다.




그럼 이제 로그인을 하게되면 자동으로 왼쪽 하단에 Connected 텍스트가 노출되도록 하겠습니다.

기존에 입력한 코드를 아래의 소스 코드로 변경 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QAxContainer import *
 
class MyWindow(QMainWindow):    # MyWindow 클래스 QMainWindow 클래스를 상속 받아 생성됨
    def __init__(self): # MyWindow 클래스의 초기화 함수(생성자)
        super().__init__()  # 부모클래스 QMainWindow 클래스의 초기화 함수(생성자)를 호출
        self.setWindowTitle("devshj")  # 윈도우 창 타이틀을 devshj로 변경 
        self.setGeometry(300300300150)    # 윈도우 창 위치 및 크기를 지정 (x축 시작점, y축 시작점, 넓이, 높이)
 
        self.kiwoom = QAxWidget("KHOPENAPI.KHOpenAPICtrl.1")    # 키움증권 Open API+의 ProgID를 사용하여 생성된 QAxWidget을 kiwoom 변수에 할당
 
        btn1 = QPushButton("Login", self)   # Login 텍스트를 포함한 버튼을 생성하여 btn1 변수에 할당
        btn1.move(2020)   # 해당 버튼의 위치를 지정 (x축 시작점, y축 시작점)
        btn1.clicked.connect(self.btn1_clicked) # 해당 버튼의 클릭 이벤트를 btn1_clicked 함수와 연결함
 
        btn2 = QPushButton("Check state", self) # Check state 텍스트를 포함한 버튼을 생성하여 btn2 변수에 할당
        btn2.move(2070)   # 해당 버튼의 위치를 지정 (x축 시작점, y축 시작점)
        btn2.clicked.connect(self.btn2_clicked) # 해당 버튼의 클릭 이벤트를 btn2_clicked 함수와 연결함
 
        self.kiwoom.OnEventConnect.connect(self.event_connect)  # 통신 연결 상태가 바뀔 때 이벤트를 event_connect 함수와 연결함
 
    def btn1_clicked(self): # Login 버튼 클릭 시 실행되는 함수
        ret = self.kiwoom.dynamicCall("CommConnect()")  # 키움 로그인 윈도우를 실행
 
    def btn2_clicked(self): # Check state 버튼 클릭 시 실행되는 함수
        # GetConnectState() > 0:미연결, 1:연결완료
        if self.kiwoom.dynamicCall("GetConnectState()"== 0:   # 로그인 상태값이 0 이라면
            self.statusBar().showMessage("Not connected")   # PyQt5 statusBar에 Not connected 메시지를 노출함
        else:   # 로그인 상태값이 0 이 아니라면
            self.statusBar().showMessage("Connected")   # PyQt5 statusBar에 Connected 메시지를 노출함
 
    def event_connect(self, err_code):  # 통신 연결 상태가 바뀔 때 실행되는 함수
        if err_code == 0:   # 로그인이 성공하였다면
            self.statusBar().showMessage("Connected")  # PyQt5 statusBar에 Connected 메시지를 노출함
        else:
            self.statusBar().showMessage("Not connected")  # PyQt5 statusBar에 Not connected 메시지를 노출함
 
# py 파일 실행시 제일 먼저 동작
if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = MyWindow()   # MyWindow 클래스를 생성하여 myWondow 변수에 할당
    myWindow.show() # MyWindow 클래스를 노출
    app.exec_() # 메인 이벤트 루프에 진입 후 프로그램이 종료될 때까지 무한 루프 상태 대기



변경한 코드를 실행 (단축키 Ctrl+Shift+F10) 후 로그인 완료 시

왼쪽 하단에 Connected 텍스트가 노출되는 것을 확인할 수 있습니다.

통신 연결 상태가 변경되면 아래의 코드가 호출되게 되어 event_connect 함수가 호출됩니다.

self.kiwoom.OnEventConnect.connect(self.event_connect)

event_connect 함수는 로그인 성공 여부를 판단하여 왼쪽 하단에 해당 텍스트를 노출하게 됩니다.

이상으로 PyQt를 사용하여 키움 Open API+에 로그인 하는 화면 구성이 완료되었습니다.





주식 자동매매, 주식 어플, 주식 정보 웹 스크래이핑, 공시 정보 연동 등

주식에 관심이 있는 사람들에게 도움이 될 정보를 기본부터 차근차근 정리할 예정입니다.

해당 글을 보고 지적 사항, 수정 사항이 있다면 언제든지 댓글, 또는 메일로 연락 부탁드립니다.

여러분의 관심이 글을 보는 다음 누군가에겐 큰 도움이 될 것입니다. 감사합니다.