투자프로그램 프로젝트 (1) - 키움증권 API를 사용한 자동 로그인

728x90

초기에 여러가지 프로그램, 라이브러리를 다운받아야 하지만 기초 개발환경을 만들었다고 가정하고 코드만 올림

개발환경 - Pycharm, 파이썬 활용

 

메인 API 클래스 - 키움증권 로그인을 구현하는 클래스

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

# 아래의 QAxWidget을 생성자로 초기화시킴 = 로그인할 준비를 마친다.
        #def __init 이란 함수로 super()을 사용해서 조상의 객체를 초기화시킨다.
class kiwoom(QAxWidget):
    def __init__(self):
        super().__init__()
        # 아래의 API 메서드를 클래스 초기화 시킬 때 실행시켜서 한번만 실행시키자
        self._make_kiwoom_instance()
        # 아래 접속결과를 실행해야 하기 때문에 객체를 생성할 때 실행해주기 위해 아래에 선언한다
        self._set_signal_slots()
        # 선언만 하면 의미가 없으므로 생성자에 넣어서 프로그램이 시작되면 자동으로 시작되도록 한다
        self._comm_connect()

    # 아래의 메서드는 클래스가 실행되면서 API 식별자만 실행시켜주면되므로 사용하지 않는다는 뜻에서 _로 시작한다.
    def _make_kiwoom_instance(self):
        # OpenAPI를 설치한 컴퓨터라면 동일 파일 이름으로 API를 식별하므로 그대로 적자
        self.setControl("KHOPENAPI.KHOpenAPICtrl.1")

    def _set_signal_slots(self):
        # slot의 역활을 하는 것(요청이 오면 작동)이 OnEventConnect이고
        # 요청의 결과값을 받아올 함수가 _login_slot이다
        # 요청의 결과값을 받아오면 OnEventConnect가 기다렸다가 응답 작업 시작
        self.OnEventConnect.connect(self._login_slot)

    # KOA의 개발환경에서 확인한 파라미터값이 error_code가 있으므로 넣어서 함수를 정상 실행시킨다.
    def _login_slot(self, error_code):
        if error_code == 0:
            print("connected")
        else:
            print("오류(100:사용자 정보 교환실패 | 101: 서버 접속 실패 | 102: 버전처리 실패): " + error_code)
        #아래 함수를 끝냄으로써 로그인이벤트가 성공적으로 완료되면 loop를 끝냄
        self.login_event_loop.exit()

    # 로그인 요청 신호를 보낸 이후 응답대기를 설정하는 메서드
    def _comm_connect(self):
        # Commconnect는 로그인창을 출력하는 함수 = 따라서 dynamiccall을 사용해서 Commconnect를 호출
        self.dynamicCall("CommConnect()")
        #호출한 후에 기다리지 않고 그냥 다음코드로 넘어가버리면 에러가 발생하므로 응답을 대기하는 상태가 필요함
        #따라서 아래 함수로 이벤트를 대기시킴 = 아래 login_event_loop의 QEventLoop와 exec은 한짝이락 보면 됨
        self.login_event_loop = QEventLoop()
        self.login_event_loop.exec_()

 

클래스를 main에 선언하여 실행 시 키움증권 로그인 창을 띄움

import sys
from api.kiwoom import *

# 아래의 QApplication 과 app.exec_()이란 코드는 API를 제어하는 메인루프 = OCX 방식 API를 사용하게 해줌
app = QApplication(sys.argv)
kiwoom = kiwoom()
app.exec_()
728x90