Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

로그인 이후 on_event_connect 이벤트 처리 #8

Open
zimzion opened this issue Dec 18, 2022 · 3 comments
Open

로그인 이후 on_event_connect 이벤트 처리 #8

zimzion opened this issue Dec 18, 2022 · 3 comments

Comments

@zimzion
Copy link

zimzion commented Dec 18, 2022

안녕하세요.

로그인 이후 on_event_connect 이벤트 핸들러에서 접속 이후 처리를 하려고 합니다. (계좌비번을 자동으로 넣는 RPA 코드 실행) 그런데 해당 함수가 로그인 이후에 호출이 안됩니다. (break point를 걸었으나 걸리지 않음) 혹시 이유를 알 수 있을까요?

def on_event_connect(self, err_code):
"""
# 개발가이드 > 로그인 버전처리

    [OnEventConnect()이벤트]

    OnEventConnect(
      long nErrCode   // 로그인 상태를 전달하는데 자세한 내용은 아래 상세내용 참고
    )

    로그인 처리 이벤트입니다. 성공이면 인자값 nErrCode가 0이며 에러는 다음과 같은 값이 전달됩니다.

    nErrCode별 상세내용
    -100 사용자 정보교환 실패
    -101 서버접속 실패
    -102 버전처리 실패
    """
    pass
@breadum
Copy link
Owner

breadum commented Dec 18, 2022

안녕하세요,

튜토리얼 2번을 보시면 Bot 클래스 init 안에서 self.api.connect 함수를 통해
특정 이벤트가 발생했을 때 호출되고자 하는 함수를 연결하실 수 있습니다.

self.api.connect('on_event_connect', signal=self.login, slot=#원하는함수)

from kiwoom import Bot, Server, config


# 서버에 데이터를 요청하는 클래스 (사용자 작성)
class MyBot(Bot):
    def __init__(self, server=None):
        super().__init__(server)
        self.api.connect(
            event='on_event_connect',
            signal=self.login,
            slot=self.server.login
        )

    def login(self):
        # 서버에 접속 요청
        self.api.comm_connect()
        # [필수] 이벤트가 호출될 때까지 대기 (on_event_connect)
        self.api.loop()

    def connected(self):
        state = self.api.get_connect_state()
        print(f'\t현재 접속상태 = {state}')

        if state == 1:
            return True  # 연결된 경우
        return False  # 연결되지 않은 경우


# 서버에서 데이터를 받아 처리하는 클래스 (사용자 작성)
class MyServer(Server):
    def login(self, err_code):
        # err_code에 해당하는 메세지
        emsg = config.error.msg(err_code)

        # ---------------------
        # 원하시는 작업 구현
        # ---------------------

        # [필수] 이벤트를 기다리며 대기중이었던 코드 실행
        self.api.unloop()

조금 더 자세한 설명 첨부드립니다.
'KOA Studio > 개발가이드 > 로그인 버전처리 > 기본설명'을 보시면 아래와 같이 나와있는데요.

    [로그인 사용법]
    로그인은 CommConnect()함수를 호출합니다. 키움OpenAPI가 제공하는 로그인창이 실행됩니다.
    ID/Pw 입력 후 로그인완료시 OnEventConnect 이벤트가 발생됩니다.
    OnEventConnect 이벤트의 인자값으로 로그인 성공여부를 알수 있습니다.
    이 값이 0이면 성공이고 나머지는 실패로 오류코드값을 수신합니다.
	
    CommConnect(사용자 호출) -> 로그인창 출력 -> OnEventConnect(이벤트 발생)

CommConnect(사용자 호출)는 MyBot.login() 에서 호출되고 이로 인해
OnEventConnect 이벤트가 발생된다면 이전에 위에서 연결해 두었던 함수가 호출되게 됩니다.

말씀드린 방법으로 시도해 보시고 혹시 해결 안되시면
조금 더 구체적으로 말씀 다시 주시면 답변 드리겠습니다.

@zimzion
Copy link
Author

zimzion commented Dec 18, 2022

답변 감사합니다. 말씀하신 것 처럼, 이벤트 핸들러가 호출되는 것은 확인 하였습니다.
다만, 제가 기존에 구현하였던 pywinauto를 활용한 로그인 코드와 원활하게 연동되지는 않는 듯 합니다. 공개하신 코드는 자동로그인으로 사전에 셋업을 해 놓으면 코드가 잘 동작하는데요. 이 경우 업데이트에 대응하기 위해서는 수동으로 자동 로그인을 풀어서 업데이트 후 다시 자동로그인을 해야 되는 것으로 알고 있습니다. 혹시 이 부분에 대해 좀 더 자동화 계획이 있으신지요?

@breadum
Copy link
Owner

breadum commented Dec 18, 2022

현재 키움에서 제공하고 있는 업데이트를 하는 방법은 두 가지 입니다.

  1. 수동 로그인
  2. KOA Studio 로그인

자동 업데이트 기능은 키움측에서 제공하지 않고 있습니다.

저 같은 경우는 KOA Studio에 로그인 해서 업데이트 하고 있습니다.
자주는 안하고 한 달에 한 번이나 두 번 정도 수동으로 하고 있습니다.

혹시 코드 상에서 수동으로 계좌 비번 Auto 설정 창을 띄울 필요가 있으시면
아래 함수를 이용하시면 됩니다.

import sys
from PyQt5.QtWidgets import QApplication
from kiwoom import Bot

if __name__ == '__main__':
    app = QApplication(sys.argv)
    bot = Bot()
    bot.login()
    bot.api.koa_functions('ShowAccountWindow', '')

아래 참고 자료입니다.

    [로그인]
    키움OpenAPI는 로그인창을 통해 접속(로그인) 합니다.
    보안정책 강화로 인해 사용자의 로그인계정을 암호화하기 위해 로그인창이 사용됩니다.
    소스상으로 고객의 비밀번호를 평문으로 입력받지 않도록 설계되었습니다.
    
	
    [로그인 사용법]
    로그인은 CommConnect()함수를 호출합니다. 키움OpenAPI가 제공하는 로그인창이 실행됩니다.
    ID/Pw 입력 후 로그인완료시 OnEventConnect 이벤트가 발생됩니다.
    OnEventConnect 이벤트의 인자값으로 로그인 성공여부를 알수 있습니다.
    이 값이 0이면 성공이고 나머지는 실패로 오류코드값을 수신합니다.
	
    CommConnect(사용자 호출) -> 로그인창 출력 -> OnEventConnect(이벤트 발생)
	
	
    [수동 로그인]
    로그인창에 로그인ID와 비밀번호를 직접 입력해서 로그인 하는것을 말합니다.
    수동 로그인중에 버전처리(최신파일 업데이트)내용이 있는 경우 버전처리도 함께 진행됩니다.
    
	
    [계좌비밀번호 설정]
    OpenAPI는 로그인 후 한번 계좌비밀번호를 입력/등록 해야 합니다.
    계좌비밀번호 설정은 계좌비밀번호 입력창을 통해서만 가능합니다.
    이 입력창을 출력하는 방법은 2가지로 제공됩니다.
    1. 메뉴이용 - 로그인후 윈도우의 작업표시줄상에 깜박이는 트레이아이콘의 
마우스우측 메뉴(모니터 오른쪽 하단)에서 "계좌비밀번호 저장" 선택
    4. 함수이용 - 로그인후 OpenAPI.KOA_Functions(_T("ShowAccountWindow"), _T("")) 호출
	
    ※ 계좌비밀번호 입력시 주의할 점 : 
    OpenAPI는 계좌비밀번호를 검증하지 않고 입력된 값을 그대로 암호화하여 서버로 전송합니다.
    계좌비밀번호 오류가 일어나지 않도록 오타 등 입력에 주의하시기 바랍니다.
    
	
    [자동 로그인]
    로그인 후에 계좌비밀번호 입력창을 통해 자동로그인을 설정할 수 있습니다.
    계좌비밀번호 입력창에서 계좌비밀번호를 입력하고 "등록" 또는 "전체등록" 버튼을 눌러서 
    비밀번호를 저장한 다음 아래에 있는 "AUTO" 옵션을 체크하면 자동 로그인을 위한 설정이 모두 끝납니다.
    다음번 실행부터 로그인시 로그인창에 계정 입력하는 과정 없이 로그인과정이 자동으로 실행됩니다.
    자동로그인시에는 버전처리(최신파일 업데이트) 과정을 생략합니다.
    단 거래소로부터 수신되는 Daily배치 파일인 종목정보 파일은 자동로그인시에도 다운받습니다.

    ※ 자동로그인 사용시 주의할 점 : 
    정기적으로 일주일에 한번 이상 자동로그인 해지 후 수동로그인으로 버전처리를 받아주시길 권장드립니다.
    버전처리 없이 자동로그인을 계속 사용시에 예기치 않은 오동작의 가능성이 있습니다.
    장종료 후 혹은 주말에도 버전처리는 정상 수행됩니다.

	
    [버전 처리(최신파일 다운로드)]
    OpenAPI의 업데이트가 있는 경우
    로그인할때 버전처리 알림창이 출력 됩니다.
    이 알림창이 표시되면 실행한 OpenAPI프로그램(KOA스튜디오포함)을 
    먼저 모두 종료한다음 알림창에 있는 확인버튼을 눌러야 합니다.
    그렇지 않으면 버전처리가 정상적으로 끝나지 않아서 로그인할때마다 버전처리 알림창이 반복됩니다.
    이렇게 OpenAPI프로그램을 모두 종료한 다음 알림창을 닫아주면 
    버전처리가 자동으로 진행/완료 되고 종료했던 프로그램을 재실행 해주면 됩니다.
    버전처리가 정상적으로 완료된 이후에는 다음번 버전처리가 있을때까지 접속시 해당 알림창이 실행되지 않습니다.

	
    [필수 버전처리 (자동로그인 강제해지)]
    OpenAPI 운영시 사용자가 필수적으로 버전처리를 받아야 하는 업데이트가 있는 경우,
    버전처리를 위해 자동로그인이 강제 해지되는 기능이 작동할 수 있습니다.
    (이때 버전처리완료 후 접속하여 자동로그인을 재설정하실 수 있습니다.)
    자동로그인이 강제해지되는 업데이트는 사용자의 불편함을 줄일 수 있도록 최소화하여 운영됩니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants