맨땅에 헤딩하는 사람

키움증권 Open API+ 멀티 로그인 | python pywinauto 본문

퀀트/구현

키움증권 Open API+ 멀티 로그인 | python pywinauto

purplechip 2020. 8. 23. 00:18

키움증권 Open API+는 2020년 8월 기준 동일 아이디의 중복 로그인이 불가능하다. 키움증권 고객센터를 보면 동일 아이디는 중복 로그인이 불가능하지만 모의투자서버와 실서버의 개별 로그인은 가능하며, TR 조회 제한은 프로세스별로 집계된다고 한다. 이에 따라 여러 아이디로 2개의 서버에 멀티 로그인을 해야할 필요성을 느끼고 pywinauto 모듈을 사용해 로그인하는 코드를 구현하였다. pywinauto에 대한 기초적인 내용은 아래 링크에서 확인 가능하다.

2020/08/22 - [파이썬/이론] - [Python] Windows GUI 자동화 pywinauto 사용법

 

구현코드 

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# -*- coding: utf-8 -*-
from threading import Thread
from multiprocessing import Process, Lock
from config import configUpdate # user-defined
from qpkg import Kiwoom # user-defined
import time
import sys
 
def login_input(user_id, norm_pwd, cert_pwd, is_simulated=False):
    import pywinauto
    # sys.coinit_flags=0
    while True:
        procs = pywinauto.findwindows.find_elements()
        for proc in procs:
            if proc.name == 'Open API Login':
                break
        if proc.name == 'Open API Login':
            break
 
    login_app = pywinauto.Application().connect(process=proc.process_id)
    login_dig = login_app.OpenAPILogin
    login_dig.Edit1.send_keystrokes(user_id)
    login_dig.Edit2.send_keystrokes(norm_pwd)
    if is_simulated:
        if login_dig.Edit3.is_enabled():
            login_dig.Button5.click()  # check mock invest server mode
        login_dig.Edit2.send_keystrokes('{ENTER}'# login
    else:
        if not login_dig.Edit3.is_enabled():
            login_dig.Button5.click()  # uncheck mock invest server mode
        login_dig.Edit3.send_keystrokes(cert_pwd)
        login_dig.Edit3.send_keystrokes('{ENTER}'# login
 
def multi(idx, lock):
    app = Kiwoom.QApplication(sys.argv)
    kiwoom = Kiwoom.Kiwoom()
 
    if idx % 2 == 0# check mock invest server mode
        is_simulated = True
    else:
        is_simulated = False
    lock.acquire() # process lock
    login_th = Thread(target=login_input,
                      kwargs={'user_id':configUpdate.KIWOOM[idx//2]['USER_ID'],
                             'norm_pwd':configUpdate.KIWOOM[idx//2]['NORM_PWD'],
                             'cert_pwd':configUpdate.KIWOOM[idx//2]['CERT_PWD'],
                             'is_simulated':is_simulated})
    login_th.start()
    kiwoom.comm_connect()
    lock.release() # process unlock
 
    print('process[{0}]'.format(idx))
    print('Login state : {0}'.format(kiwoom.get_connect_state()))
    print('Server : {0}'.format(kiwoom.get_login_info("GetServerGubun")))
    #app.exec_() # not to terminate process
 
if __name__=='__main__':
    procs = []
    lock = Lock()
    start_time = time.time()
    for idx in range(2):
        proc = Process(target=multi, args=(idx, lock))
        procs.append(proc)
        proc.start()
    for proc in procs:
        proc.join()
    end_time = time.time()
    print('time : {0}'.format(end_time - start_time))
cs
  • line 42 : 키움증권 Open API+ 로그인 프로그램은 동시 접속이 불가능하게 되어 있기 때문에 Lock을 걸고 로그인이 끝나면 Lock을 해제한다.
  • line 49 : comm_connect() 함수가 로그인창을 띄우는 함수이다. 이 함수를 thread로 보내면 핸들값이 사라져서 종료가 되길래 로그인 정보 입력하는 함수를 thread로 처리하였다.
  • line 22-32 : send_strokes()를 사용한 이유는 type_keys() 보다 신뢰성이 높아보이기 때문이다. type_keys()는 윈도우가 최상단에 위치한 것이 아니면 정확한 키보드 입력이 안된다. 그러나 send_keystrokes()는 윈도우가 최상단이 아니어도 입력이 전달된다. 

위 코드를 실행 시킬 때 파이썬은 무조건 관리자 모드로 실행해야 한다. IDE를 사용한다면 IDE를 관리자 권한으로 실행한다. 그리고 비밀번호는 보통 특수문자가 포함되어있는데 '%', '^', '*'의 특수문자는 '{%}', '{^}', '{*}'와 같이 표현해야 한다. 그 이유는 pywinauto가 사용하는 특수키 중 위 특수문자를 사용한 것이 있기 때문이다. 마지막으로 pywinauto에서 Open API+의 조작 객체가 로그인 창의 어떤 요소인 지 나타내는 정보가 없어서 직접 확인했으며 결과는 다음과 같다.

[그림 1. 키움 Open API+ 로그인 화면]

  1. 고객 ID 입력 : Edit, Edit0, Edit1
  2. 비밀번호 : Edit2
  3. 인증비밀번호 : Edit3
  4. 로그인 : Button, Button0, Button1
  5. 종료 : Button3
  6. 고객 아이디 저장 : Button6
  7. 모의투자 접속 : Button5

프로그램은 정상적으로 동작하며 실행한 결과는 다음과 같다.

process[0]
Login state : True
Server : 1
 
[GetPCIdentity] VER 3.2.0.0  build 2015.8.12
 
[GetPCIdentity] VER 3.2.0.0  build 2015.8.12
process[1]
Login state : True
Server : 
 
[GetPCIdentity] VER 3.2.0.0  build 2015.8.12
 
[GetPCIdentity] VER 3.2.0.0  build 2015.8.12
time : 16.306111097335815
cs

[GetPCIdentity]는 Open API+에서 자동적으로 출력하는 문구이고 Process, Login state, Server를 확인하면 된다. 키움 모의투자 서버의 경우 반환 값이 1이고 그 외 반환값은 실투자 서버이다. 정상적으로 출력됨을 확인할 수 있다.

Comments