이번달엔 한국투자증권 API로 자동매매를 구축해서 지금 소액으로 테스트 중입니다. 개발하면서 몇 가지 난관도 있었는데 그 중 하나가 자동로그인 입니다. 시행착오는 있었지만 증권사에 메일로 문의를 하면 하루 뒤에 답변을 잘 해주는 편이라 무사히 완성했습니다.

자동로그인 기능이 없는지 문의를 했더니 보안때문에 그런 기능은 제공하지 않지만 pywinauto 라는 걸 통해서 직접 구현이 가능하다는 답변을 들었습니다. 덕분에 유용하고 재미있는 모듈을 알게 됐네요. 다른 작업시에도 유용하게 쓸수 있을 것 같아 공유해볼까 합니다.

간단히 말하면 윈도우 프로그램을 실행하고 제어할 수 있는 모듈입니다. 구글에 검색하면 노트패드를 열어서 글자를 입력하는 등의 예시가 나와 있습니다. 이것을 이용해서 한투 eFriend Expert를 실행하고 패스워드를 입력해서 로그인 하는데 성공했습니다.

먼저 pywinauto를 인스톨 해 주세요.

pip install pywinauto


파이썬 파일을 만들고 아래와 같이 코드를 작성해 줍니다. 제 경우는 ExpertLogin.py 라는 파일을 생성했습니다.

from pywinauto import Application  # pywinauto가 import 되어 있으면 API 실행 멈춤. 로그인과 API 실행을 분리해야 함.
from PyQt5.QtTest import *
import psutil

class Main:
    def __init__(self):

        # Check if any chrome process was running or not.
        # import psutil
        # if self.checkIfProcessRunning('chrome'):

        chkHantuRunning = self.checkIfProcessRunning('efexpert')
        if chkHantuRunning:
            print('한투 트레이 아이콘이 실행중입니다. (efexpert) ')
        else:
            # pywinauto를 통한 자동로그인
            # https://pywinauto.readthedocs.io/en/latest/index.html
            # pip install pywinauto
            # from pywinauto import Application
            app = Application(backend="win32").start("C:\eFriend Expert\efriendexpert\efriendexpert.exe")
            dlg = app.window(title_re=".* efriendexpert.exe(32비트)")
            # 실행하면 에러와 함께 dict_keys 값들이 표시됨. 작업관리자 해당 앱의 sub 메뉴에서 확인 가능
            # dict_keys(['Dialog', 'eFriend Expert 로그인', 'eFriend Expert 로그인Dialog'])' => eFriend_Expert_로그인 같이 입력하면 됨.
            QTest.qWait(500)  # 0.5초 시간지연. 안줘도 작동 잘 됨.
            app.eFriend_Expert_로그인.type_keys('자신의 로그인 패스워드 직접입력')
            app.top_window().type_keys("{TAB}")
            QTest.qWait(500)
            app.eFriend_Expert_로그인.type_keys('자신의 공인인증서 패스워드 직접입력')
            app.top_window().type_keys("{ENTER}")

    # 프로그램 작동여부 체크
    def checkIfProcessRunning(self, processName):
        '''
        Check if there is any running process that contains the given name processName.
        '''
        # Iterate over the all the running process
        for proc in psutil.process_iter():
            try:
                # Check if process name contains the given name string.
                if processName.lower() in proc.name().lower():
                    return True
            except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
                pass
        return False

if __name__ == "__main__":
    Main()


주석에 있는 url로 접속하시면 pywinauto 사용법 가이드를 보실 수 있습니다. 한 가지 주의할점은 pywinauto가 import 되어 있는 파일에서 API TR요청을 하면 멈춰버리더군요. 따라서 로그인 하는 파일과 TR 요청하는 파일은 따로 분리해서 작성하셔야 합니다.

내친 김에 psutil을 사용해서 이미 로그인했으면 중복실행하지 않는 코드도 추가했습니다. 로그인 하는 파일을 분리해서 작성하고, 보통 로그인은 한 번만 실행할테니 굳이 필요하지는 않습니다만 사용하실 분들은 psutil도 인스톨해 주세요.

로그인 시 관리자 권한으로 실행해야 합니다. 파이참으로 실행해 보실거라면 파이참을 관리자권한으로 실행해 주시고, 여기서는 위 파일을 관리자권한으로 실행하는 배치파일을 작성해보겠습니다.

윈도우에서 텍스트 파일을 하나 생성하고 확장자를 bat로 저장해 주세요. 저는 hantuLogin.bat 라는 파일을 작성했습니다. 파일 안에 아래와 같이 코드를 작성해 주세요.

@ECHO ON
title Hantu Login

:: BatchGotAdmin
:------------------------------------- 
REM --> Check for permissions 
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" 

REM --> If error flag set, we do not have admin. 
if '%errorlevel%' NEQ '0' ( 
	echo Requesting administrative privileges... 
	goto UACPrompt 
) else ( goto gotAdmin ) 

:UACPrompt 
	echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
	set params = %*:"="" 
	echo UAC.ShellExecute "cmd.exe", "/c %~s0 %params%", "", "runas", 1 >> "%temp%\getadmin.vbs" 

	"%temp%\getadmin.vbs" 
	del "%temp%\getadmin.vbs" 
	exit /B 
:gotAdmin 
	pushd "%CD%" 
	CD /D "%~dp0" 
:--------------------------------------

c:
cd C:\작성한파일이있는디렉토리경로입력


call activate 아나콘다가상환경이름입력
python ExpertLogin.py


실행하면 아래와 같이 로그인 되는 것을 볼 수 있습니다.

위에서 작성한 배치파일을 윈도우 작업 스케줄러에 등록해서 아침마다 자동 로그인 되도록 하시면 됩니다.

한투API로 개발을 해보니 몇 가지 장단점이 있더군요.

먼저 가장 치명적인 단점은 HTS 종목 조건검색 결과를 가져오는 기능을 제공하지 않습니다. 메일로 건의해 보았지만 제공은 어렵다는 답변을 받았습니다. 할 수 없이 다른 증권사 API에서 검색한 결과를 가져와서 사용하도록 했습니다. 그 외에도 신용 매수시에 자기융자, 유통융자 구분 코드값을 입력해야 하는데 해당 종목의 구분코드값을 조회하는 기능이 없는 등 허술한 부분도 있습니다.

장점은 속도가 무진장 빠릅니다. 요청속도에 사실상 제한이 없습니다. 10msec 이내에 TR을 연속 요청하면 호출제한이 걸린다고 레퍼런스 가이드에 써 있어서 지연시간을 넣긴 했는데 0.01초니 사실상 제한이 없다고 봐도 좋을 듯 합니다.

그럼 유용하게 사용하시고 새해 복 많이 받으세요.

'주식 > 증권사 API 개발' 카테고리의 다른 글

크레온 총매입단가, 수익률 계산방법  (0) 2023.01.26
백테스트 결과  (0) 2022.02.11

+ Recent posts