2. 해외선물/2-4. 해외선물 API (사용)

(키움증권 해외선물 OpenAPI-W) 로그인 설정하기 (5) 파이썬 코드 활용

봄이오네 2023. 1. 7. 08:11
반응형
목 차
1. 들어가며
2. 사전설명
3. 코드 설명
   1) 로그인 필요모듈 현황 및 관련 내용
   2) 로그인 윈도우 창에 비밀번호 입력 등
   3) 로그인 시 주의사항 (with ~ as는 필수가 아님)
4. 전체코드
5. 마치며

1. 들어가며

지난 글에서는 OpenAPI-W를 이용하여 키움서버에 접속하는 함수를 알아보았다.

키움 레지스트리에 접속하여,

키움측에서 제공하는CommConnect 및 OnEventConnect의 함수의

개발가이드 내용을 확인하였다.

 

이 글에서는 파이썬을 통해 키움서버의 OpenAPI-W에 로그인하는 코드를 알아보자.

국내주식의 OpenAPI처럼 자동로그인은 되지 않는다.

키움 측에서 보안상의 사유로 막아 놓았다. ㅠㅠ


2. 사전설명

OpenAPI-W 로그인은 아래와 같이 진행된다.

키움서버의 레지스트리에 접근

② 로그인 윈도우(창)을 실행 → < 그림 1 >과 같이, 로그인 창을 띄운다.(이벤트 발생)

③ 발생한 이벤트를 로그인 함수와 연결하여 로그인한다.

 

< 그림1 > 로그인 윈도우(창) 화면


3. 코드 설명

위에서 설명하였듯이 "로그인 윈도우(창)"을 띄우고 나서,

자동으로 비밀번호를 입력하는 내용을 알아볼 것이다.

 

1) 로그인 필요모듈 현황 및 관련 내용

그림2-1. 필요모듈 현황 및 로그인 관련 내용

 

1줄~6줄 : 파이썬 인터프리터(해석기)를 직접 제어하기 위해 sys 모듈 등 필요 모듈을 임포트한다.

                  ※ 필요 모듈의 설명은 아래 < 링크 >에서 설명

 

(키움증권 해외선물 OpenAPI-W) 자동매매를 위한 파이썬 모듈 설명

목 차 1. 들어가며 2. 사전설명 1) 모듈의 정의, 활용 및 종류 2) 모듈 불러오는 형태 3. 활용할 모듈 설명 1) sys 모듈 2) from PyQt5.QAxContainer import * 3) from PyQt5.QtWidgets import * 4) from PyQt5.QtCore import * 5) impo

springcoming.tistory.com

 

10줄 : QAxWidget 모듈을 활용하여 OpenAPI-W 레지스트리 접근하기 위해,

           self.kiwoom의 변수에 레지스트리를 인스턴스화 시킨다.

 

13줄 : 15줄(CommConnect(1))의 이벤트가 발생하였을 때,

           23줄(def login_Connect 함수)가 발생할 수 있도록

           OnEventConnect 함수를 이용하여 연결(connect)한다.

             → 즉, 15줄 및 23줄의 함수를 연결한다.

 

15줄 : < 그림1 >의 로그인 윈도우(창)을 띄우는 함수이다.

16줄 : < 그림1 > 아이디의 비밀번호 자동화를 위한 함수(30줄,  password_login)를 실행한다.

17줄~18줄 : 로그인이 완료될 때까지, 다른 코드의 실행을 대기(loop) 시킨다.

 

20줄 : 이 글의 첫번째 핵심이다.

  • 함수 형태 : self.kiwoom.dynamicCall("GetCommonFunc(QString, QString)", "ShowAccountWindow", "")

명확한 설명이 필요하다.

위에서 설명한 13줄(CommConnect(1))이 아이디의 비밀번호를 입력하는 화면이라면,

20줄의 함수(ShowAccountWindow)는 < 그림 2-2 >의 계좌 비밀번호를 입력하는 화면이다.

 

계좌 비밀번호가 필요한 이유는,

계좌에 있는 종목, 매입가 또는 매매(진입, 청산)를 위해 필요하다.

 

    ※ 20번 줄의 GetCommonFunc 함수는 앞의 글에서 설명하였다.

그림2-2. 계좌 비밀번호 입력 화면

 

23줄~28줄 : 국내주식 OpenAPI 로그인과 같이,

                     로그인을 위한 함수를 임의로 만들었다.

 

2) 로그인 윈도우 창에 비밀번호 입력 등

여기서는 "로그인 윈도우(창)에 비밀번호 입력하는 방법 등을 알아본다.

5줄에서 인포트한 pyautogui 모듈은 앞의 글에서 설명하였다.

 

그림2-3. 로그인 윈도우(창)에 비밀번호 입력하는 화면

 

30줄 : 로그인 윈도우(창)에 아이디의 비밀번호를 입력하기 위해

          임의의 함수(password_login)를 선언한다. → 16줄에서 30줄의 함수를 실행한다.

 

31줄~35줄 : 이 글의 두번째 핵심이다.

                     반드시 필요한 내용은 아니지만, 로그인을 위한 아이디의 비번을 입력한다.

  • 31줄 : 바탕화면에 있는 btlg_password.txt 파일을 열고, f에 인스터스화 한다.
  • 32줄 : btlg_password.txt 파일의 각 줄(line)를 읽는 함수를 lines에 인스턴스화 한다.
  • 33줄 : lines에 첫번째 줄(0)에 있는 내용은 아이디 비번을 입력
  • 34줄 : lines에 두번째 줄(1)에 있는 내용은 < 그림1 >에서 확인하였듯이 실전투자시, "인증서 비번" 입력
  • 35줄 : lines에 세번째 줄(2)에 있는 내용은 계좌번호 비번인데, 키움에서 계좌비번을 막아놓은 관계로 입력 불요

설명이 상당히 길었다.

간단하게 생각하면, 아래 < 그림 2-4 >에서 확인하였듯이,

btlg_password.txt 첫번째 줄은 아이디의 비번(①), 두번째 줄은 인증서 비번(②)이고,

마지막 줄은 계좌비번(③)인데, 모의계좌이므로 0000이다. (사용자의 비번 등을 입력한다)

→ 계좌비번(③)은 굳이 입력할 필요없다.

      (키움 측에서 계좌비번은 입력 못하게 자동로그인을 막아두었다)

→ < 그림1 >을 확인하면, 모의계좌는 인증서 비번(②)도 필요없다.

 

그림2-4. btlg_password 텍스트 파일에 임의로 입력된 내용

 

37줄~43줄 : 이 글의 세번째 핵심이다. 자세한 설명은 다음 글에서 설명한다.

       

  • 37줄 : pyautogui 모듈을 활용하여 마우스를 x=1010, y=485 로 이동(그림1의 비밀번호)한다. 
  • 38줄 : "아이디의 비밀번호" 창을 한번 클릭하여, 비번 창을 활성화 시킨다.
  • 39줄 : 입력을 위해 3초 동안 대기한다.
  • 40줄 : 33줄에서 읽어온 아이디의 비번을 타이핑(write)한다.
  • 43줄 : pyautogui 모듈을 활용하여 엔터(enter) 버튼을 누른다.

47줄~51줄 : 8줄의 btl_system() 클래스를 48줄에서 btl 변수에 인스턴스화 한다.

 

3) 로그인 시 주의사항 (with ~ as는 필수가 아님)

31줄~35줄이 필요 사항은 아니다.

31줄~35줄을 삭제하고, 40줄을 아래와 같이 변경하여도 된다.

  • (당초) pyautogui.write(self.password, interval=0.1)
  • (변경) pyautogui.write(" 비밀빈호 입력 ", interval=0.1)

즉 31줄~35줄을 삭제하고, self.password에 사용자의 비밀번호를 입력해 주면 된다.


4. 전체코드

import sys
from PyQt5.QAxContainer import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import pyautogui
import time

class btl_system():
    def __init__(self):
        self.kiwoom = QAxWidget("KFOPENAPI.KFOpenAPICtrl.1")
        print("로그인 시작!")

        self.kiwoom.OnEventConnect.connect(self.login_Connect)

        self.kiwoom.dynamicCall("CommConnect(1)")       # CommConnect() : 괄호 안에 자동(1)을 넣는다.
        self.password_login()
        self.login_event_loop = QEventLoop()
        self.login_event_loop.exec_()

        self.kiwoom.dynamicCall("GetCommonFunc(QString, QString)", "ShowAccountWindow", "")

    ########## 로그인 관련 함수 ##########
    def login_Connect(self, err_code):
        if err_code == 0:
            print('로그인 성공했습니다!')
            self.login_event_loop.exit()
        else:
            print('로그인 실패했습니다!')

    def password_login(self):
        with open(r'C:\Users\User\Desktop\btlg_password.txt') as f:
            lines = f.readlines()
            self.password = lines[0].strip()
            self.cetification_password = lines[1].strip()
            self.deposit_password = lines[2].strip()

        pyautogui.moveTo(1010, 485)  # 비밀번호 좌표 : Point(x=1010, y=485)
        pyautogui.click()     # 실행 안될 때는 파이참을 "관리자 권한 실행"으로 실행
        time.sleep(3)
        pyautogui.write(self.password, interval=0.1)
        # time.sleep(3)
        # pyautogui.write(self.cetification_password, interval=0.1)  # 실투시 비번 활성화
        pyautogui.press('enter')

        print("해외선물의 로그인을 완료하였습니다.")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    btl = btl_system()

    app.exec_()

5. 마치며

OpenAPI-W에 로그인 하는 방법을 알아보았다.

국내주식 OpenAPI는 자동로그인이 되니,

위와 같이 복잡하게 할 필요는 없다.

 

해외선물 OpenAPI-W는 자동로그인을 막아놓으니,

테스팅할 때 조금은 불편함이 존재한다.

 

자동로그인이 되지 않아 오죽 답답했으면,

pyautogui 모듈까지 이용해서 로그인에 도전했을까 생각했다.

 

키움증권에서 OpenAPI 자동로그인을 풀어주면 얼마나 좋을까...

살짝 아쉬움이 남는건 어쩔 수 없는 것 같다.

반응형