대신증권 CYBOS PLUS 프로그램 구현 (1) - 자동 로그인 기능 구현하기 ①
프로그램 구현 목표
- CYBOS PLUS 자동 로그인 기능 구현하기
- 접속을 시도하기 전에 접속 여부 구분하기 (바로가기 링크)
- 로그인 결과 확인하기 (위 게시글과 동일한 링크)
대신증권의 경우에는 기본적으로 CYBOS PLUS에 로그인을 해야 하는데, 대강 보면 매번 직접 눌러서 로그인을 해야만 하는 것 같지만 자동 로그인 기능을 구현하는 방법이 있다. 사실 Open API를 활용해서 자동 매매 프로그램을 구현하는데도 불구하고 매번 로그인을 직접 눌러서 진행해야 한다는 건 증권사에 있어서 가장 큰 오점이자 단점으로 작용할 수 있다. 본인만 하더라도 대신증권 CYBOS PLUS를 활용한 프로그램 코드를 구현할 때에는 코드를 실행했을 때 자동으로 로그인되는 기능이 없다는 걸 몰랐을 정도로 당연한 기능에 속한다.
(1) CYBOS PLUS 자동 로그인 기능 구현하기
예전 게시글에서도 살펴봤던 내용이고 바로 위에서도 언급했던 내용이지만, 대신증권의 Open API를 이용하기 위해서는 대신증권 CYBOS PLUS에 로그인이 되어야만 한다. 그런데 이 프로그램을 실행시키는 방법은 정말 바탕화면에 있는 아이콘을 더블클릭해서 실행시킨 후, (아이디는 자동 저장되기 때문에) 패스워드를 직접 수기로 입력한 후 엔터를 쳐야만 로그인이 되는 방식이다. 자동 매매 프로그램을 사용하기 위한 하나의 과정이라고 보기에는 자동화가 불가능한 영역인 것 같지만, 대신증권에서도 이 부분이 가장 치명적인 오점으로 작용한다는 걸 알고 있기 때문인지 Q&A 게시판에 접수되는 '자동 로그인 기능은 없나요.'라는 질문들에 대해 '대신증권도 자동 로그인이 가능하다.'고 안내하고 있다.
그렇다면 그 방법은 무엇일까? 바로 `pywinauto` 모듈이다. 우리는 파이썬을 통해 윈도우 프로그램을 실행시키고 관련 데이터들을 입력시킬 수 있는 `pywinauto` 모듈을 활용해서 자동으로 CYBOS PLUS를 실행시키고 로그인할 수 있다. 이전에도 대신증권 모듈에 대한 인스턴스를 생성할 때 `import win32com.client`를 통해 불러온 모듈의 `Dispatch()` 함수를 통해 인스턴스를 생성했던 것처럼, 이번에도 `import pywinauto`를 통해 불러온 모듈을 가지고 CYBOS PLUS를 자동으로 실행시킬 수 있다. 만약 `pywinauto` 모듈이 설치되어 있지 않다면 아래와 같이 빨간색 밑줄이 그어질텐데, 이 모듈을 이전에 설치했던 방식과는 다른 방식으로 설치해주어야 한다. 아래의 이미지와 같이 파이참 하단의 Terminal 내에서 아래와 같은 코드를 입력한 후 엔터를 쳐서 바로 설치하면 된다. (만약 아나콘다와 같은 가상환경에서 생성한 파이썬 버전을 파이참의 인터프리터로 활용하고 있는 경우에는, 아나콘다 프롬프트에서 아래 코드를 입력해서 따로 설치해줘야 사용이 가능하다.)
이제 설치가 되었다면, `from pywinauto import application`이라는 구문을 추가하여 application 함수를 사용할 수 있도록 한 후에, CYBOS PLUS를 실행시키고 비밀번호를 입력하여 로그인하는 기능을 구현할 클래스로 `class login:`를 새롭게 생성해주도록 하자.
※ Line: 3, 9~11
## Boss.py ##
import win32com.client
from pywinauto import application
from COM import CpSysDib
from COM import CpUtil
from COM import CpTrade
from COM import DsCbo1
class login:
def __init__(self):
pass
class cybos:
def __init__(self):
self.cybos = CpUtil.CpCybos()
self.stockchart = CpUtil.CpStockCode()
self.trade = CpTrade.CpTdUtil()
self.codemgr = CpUtil.CpCodeMgr()
self.stockmst = DsCbo1.StockMst()
self.stockchart = CpSysDib.StockChart()
self.cybos._IsConnect()
if __name__ == "__main__":
cybos()
이제 `class login:` 클래스 내부의 초기화 함수에서는 우리가 사용하고자 하는 계정의 아이디(`self.Id`)와 비밀번호(`self.Password`)를 하나의 변수로 생성해준 후에, `def run(self):` 함수를 생성하고 초기화 함수 내부에 `self.run()` 코드를 추가해서 해당 클래스가 호출되는 즉시 `def run(self):` 함수가 실행되도록 하자. 추후에 `self.Id`와 `self.Password` 변수에 입력되어 있는 아이디와 비밀번호 값만 변경하면 그 계정으로 로그인이 가능하도록 구현하는 게 목표이므로 하나의 변수로 설정했다.
※ Line: 9~16
## Boss.py ##
import win32com.client
from pywinauto import application
from COM import CpSysDib
from COM import CpUtil
from COM import CpTrade
from COM import DsCbo1
class login:
def __init__(self):
self.Id = ""
self.Password = ""
self.run()
def run(self):
pass
class cybos:
def __init__(self):
self.cybos = CpUtil.CpCybos()
self.stockchart = CpUtil.CpStockCode()
self.trade = CpTrade.CpTdUtil()
self.codemgr = CpUtil.CpCodeMgr()
self.stockmst = DsCbo1.StockMst()
self.stockchart = CpSysDib.StockChart()
self.cybos._IsConnect()
if __name__ == "__main__":
cybos()
여기까지 잘 구현했다면, Cybos Plus를 실행하는 함수인 `def run(self):`라는 함수를 생성해주도록 하자. 그 안에서는 앞서 설치했던 `pywinauto` 모듈의 `application` 클래스를 사용할 예정이다. 이 클래스는 실행하고자 하는 파일이 위치한 폴더 내 경로(`path`)와 실행할 옵션(`args`)을 전달하여 곧바로 실행시킬 수 있다. 그러기 위해서는 현재 Cybos Plus가 위치한 경로를 알아야 하는데, 바탕화면에 있는 대신증권 Cybos 5와 Cybos Plus 아이콘을 우클릭한 후에 속성(R)을 눌러 해당 바로가기 파일이 연결되는 원 파일(실행 파일)의 경로를 확인해보도록 하자.
경로를 확인해보니 대신증권 CYBOS 5는 C:\DAISHIN\STARTER\ncStarter.exe를 실행하는 바로가기 아이콘이고, Cybos Plus 아이콘은 동일한 실행 파일을 실행시키지만 그 실행 옵션으로 `/prj:cp`를 전달하여 실행하고 있음을 확인할 수 있다. 그렇다면 일단 프로그램이 실행될 경로는 확인하였으니, 아래와 같이 코드를 구현해보도록 하자. 그럼 대신증권 CYBOS 5가 아래와 같이 실행될 것이다.
def run(self):
app = application.Application()
executable_path = r"C:\\DAISHIN\\STARTER\\ncStarter.exe"
app.start(executable_path)
하지만 우리가 실행하고자 하는 프로그램은 대신증권 CYBOS 5가 아닌 Cybos Plus인데, 그 프로그램을 실행시키기 위해서는 앞서 살펴봤듯이 `/prj:cp`를 전달해주어야 한다. 이 옵션을 앞서 `args`라는 변수로 설명하긴 했지만, 실질적으로 해당 함수에 전달할 때에는 하나의 값으로 전달해주어야 하기 때문에 `valuable`이라는 변수를 생성하여 전달하고자 하는 경로와 옵션을 하나의 변수에 입력한 후, `print()`문을 활용하여 그 내용을 확인해보도록 하자.
※ Line: 4~6
def run(self):
app = application.Application()
executable_path = "C:\\DAISHIN\\STARTER\\ncStarter.exe"
args = " /prj:cp"
valuable = f"{executable_path}{args}"
print(valuable)
app.start(executable_path)
▶ 실행 결과 확인하기
C:\DAISHIN\STARTER\ncStarter.exe /prj:cp
이제 결과를 확인했으면 `valuable` 변수를 `app.start()`의 인자로 전달하여 프로그램을 실행해보면, 아래와 같은 결과물을 확인할 수 있을 것이다.
def run(self):
app = application.Application()
executable_path = "C:\\DAISHIN\\STARTER\\ncStarter.exe"
args = " /prj:cp"
valuable = f"{executable_path}{args}"
app.start(valuable)
이제 마지막으로 `args` 변수 내에 우리는 접속하고자 하는 아이디와 비밀번호 및 공인인증서 번호를 함께 전달해줄 것인데, 그 변수는 `class login` 내부의 초기화 함수(`def __init__(self):`)에서 정의해두었던 `self.Id`, `self.Password` 등의 변수를 활용하면 된다. 프로그램을 실행시키면 자동적으로 로그인을 수행하게 되고, 하단의 우측 이미지와 같은 공지사항 화면이 출력되면 정상적으로 로그인된 것이다.
def run(self):
app = application.Application()
executable_path = "C:\\DAISHIN\\STARTER\\ncStarter.exe"
args = f" /prj:cp /id:{self.Id} /pwd:{self.Password} /pwdcert:{self.Cert} /autostart"
valuable = f"{executable_path}{args}"
app.start(valuable)
마지막으로, 조금 간결한 코드를 위해 `valuable` 변수를 삭제한 후에 `app.start()`의 인자로 해당 내용을 직접 전달해주도록 하자.
def run(self):
app = application.Application()
executable_path = "C:\\DAISHIN\\STARTER\\ncStarter.exe"
args = f" /prj:cp /id:{self.Id} /pwd:{self.Password} /pwdcert:{self.Cert} /autostart"
app.start(f"{executable_path}{args}")
'AUTO TRADE > [대신증권] CYBOS PLUS' 카테고리의 다른 글
대신증권 CYBOS PLUS 프로그램 구현 (3) - GUI와 연결하기 (0) | 2024.08.18 |
---|---|
대신증권 CYBOS PLUS 프로그램 구현 (2) - 자동로그인 구현하기 ② (0) | 2024.08.18 |
대신증권 CYBOS PLUS 시작하기 (9) - WithEvents 알아보기 (1) | 2024.08.18 |
대신증권 CYBOS PLUS 시작하기 (8) - 모듈별로 클래스 생성하기 (0) | 2024.08.08 |
대신증권 CYBOS PLUS 시작하기 (7) - 차트조회 클래스 생성하기 (0) | 2024.08.04 |
소중한 공감 감사합니다