목 차
1. 들어가며
2. 사전설명
3. 코드 설명
1) 로그인 필요모듈 현황 및 관련 내용
2) 로그인 윈도우 창에 비밀번호 입력 등
3) 로그인 시 주의사항 (with ~ as는 필수가 아님)
4. 전체코드
5. 마치며
1. 들어가며
지난 글에서는 OpenAPI-W를 이용하여 키움서버에 접속하는 함수를 알아보았다.
키움 레지스트리에 접속하여,
키움측에서 제공하는CommConnect 및 OnEventConnect의 함수의
개발가이드 내용을 확인하였다.
이 글에서는 파이썬을 통해 키움서버의 OpenAPI-W에 로그인하는 코드를 알아보자.
국내주식의 OpenAPI처럼 자동로그인은 되지 않는다.
키움 측에서 보안상의 사유로 막아 놓았다. ㅠㅠ
2. 사전설명
OpenAPI-W 로그인은 아래와 같이 진행된다.
① 키움서버의 레지스트리에 접근
② 로그인 윈도우(창)을 실행 → < 그림 1 >과 같이, 로그인 창을 띄운다.(이벤트 발생)
③ 발생한 이벤트를 로그인 함수와 연결하여 로그인한다.
3. 코드 설명
위에서 설명하였듯이 "로그인 윈도우(창)"을 띄우고 나서,
자동으로 비밀번호를 입력하는 내용을 알아볼 것이다.
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 함수는 앞의 글에서 설명하였다.
23줄~28줄 : 국내주식 OpenAPI 로그인과 같이,
로그인을 위한 함수를 임의로 만들었다.
2) 로그인 윈도우 창에 비밀번호 입력 등
여기서는 "로그인 윈도우(창)에 비밀번호 입력하는 방법 등을 알아본다.
5줄에서 인포트한 pyautogui 모듈은 앞의 글에서 설명하였다.
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 >을 확인하면, 모의계좌는 인증서 비번(②)도 필요없다.
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 자동로그인을 풀어주면 얼마나 좋을까...
살짝 아쉬움이 남는건 어쩔 수 없는 것 같다.
'2. 해외선물 > 2-4. 해외선물 API (사용)' 카테고리의 다른 글
(키움증권 해외선물 OpenAPI-W) 패턴 만들기 (3) 패턴 만들기 필요성 (0) | 2023.01.16 |
---|---|
(키움증권 해외선물 OpenAPI-W) 패턴 만들기 (2) 부동소수점 문제 회피하기 (0) | 2023.01.15 |
(키움증권 해외선물 OpenAPI-W) 패턴 만들기 (1) 해외선물 종목의 시가, 고가, 저가, 종가 받아오기 (0) | 2023.01.14 |
(키움증권 해외선물 OpenAPI-W) CME 4종목의 현재가 조회(opt10001) (4) | 2023.01.10 |
(키움증권 해외선물 OpenAPI-W) 로그인 설정하기 (4) GetCommFunc 함수 (0) | 2023.01.06 |
(키움증권 해외선물 OpenAPI-W) 로그인 설정하기 (3) with ~ as 구문 (0) | 2023.01.05 |
(키움증권 해외선물 OpenAPI-W) 로그인 설정하기 (2) pyautogui 모듈 (16) | 2023.01.04 |
(키움증권 해외선물 OpenAPI-W) 로그인 설정하기 (1) CommConnect 함수 (0) | 2023.01.03 |