일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- idxmax
- idxmin
- pycharm
- 구현
- highlight.js
- pywinauto
- 하이라이트
- 파이썬
- CSS
- line number
- freeze_support
- 멀티 로그인
- multiprocessing
- 코드블럭
- 의사 클래스
- 티스토리
- 금결원
- Windows
- 우리FIS
- OpenAPI+
- 퀀트
- 웹크롤링
- Python
- 진행 상황
- DataFrame
- Tistory
- 필기
- QueueHandler
- HTML
- 금융결제원
- Today
- Total
맨땅에 헤딩하는 사람
키움증권 Open API+ 멀티 로그인 | python pywinauto 본문
키움증권 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+의 조작 객체가 로그인 창의 어떤 요소인 지 나타내는 정보가 없어서 직접 확인했으며 결과는 다음과 같다.
- 고객 ID 입력 : Edit, Edit0, Edit1
- 비밀번호 : Edit2
- 인증비밀번호 : Edit3
- 로그인 : Button, Button0, Button1
- 종료 : Button3
- 고객 아이디 저장 : Button6
- 모의투자 접속 : 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이고 그 외 반환값은 실투자 서버이다. 정상적으로 출력됨을 확인할 수 있다.
'퀀트 > 구현' 카테고리의 다른 글
키움증권 Open API+ 구현 상 issue 해결 | python (0) | 2020.10.24 |
---|---|
WICS 섹터 기업 업종 json 포맷 웹크롤링 | python (2) | 2020.07.17 |
퀀트 주가 분석 및 자동매매 시스템 환경 구축 | python (1) | 2020.07.16 |
장전 시간외 거래에서 프로그램으로 빠르게 매수 주문 넣기 | python (0) | 2020.07.12 |
어닝 서프라이즈 특징주 예후 분석 | python (2) | 2020.07.11 |