2. 해외선물/2-4. 해외선물 API (사용)

(키움증권 해외선물 OpenAPI-W) 로그인 설정하기 (4) GetCommFunc 함수

봄이오네 2023. 1. 6. 08:07
반응형
목 차
1. 들어가며
2. 사전설명
3. 코드 설명
   1) 수동으로 계좌번등록 창 열기
   2) ShowAccountWindow 함수를 통해 계좌번호등록창 열기
   3) 계좌번호등록 창에 계좌비밀번호를 입력한 화면
4. ShowAccountWindow 함수는 종료되지 않음
   1) SetInputValue함수의 설명
   2) CommRqData 함수 설명
   3) ShowAccountWindow 함수에 대한 설명
5. 마치며

1. 들어가며

지난 글에서는 with ~ as 구문을 활용하여

OpenAPI-W에 접속하는 방법을 알아보았다.

 

이 글에서는 키움증권에서 제공하는 GetCommonFunc 함수를 이용하여

"계좌비밀등록 창"을 실행해보자.

 

결론부터 이야기하지만,

"계좌비밀번호등록 창"을 띄울 수는 있지만, "계좌비밀번호"를 입력할 수는 없다.

(이 부분을 키움측에서 보안정책상의 사유로 막아두었다.)

→ 계좌비밀번호는 수동으로 사용자가 입력해 주어야 한다.


2. 사전설명

WKOA Studio에서 GetCommonFunc 함수의 기능 및 사용법을 확인해보자.

  • 함수 확인 : WKOA Studio > 샘플목록 > 함수들 > GetCommonFunc 함수
  • 함수 기능 : WKOA Studio에서 당초 제공한 함수外 추가로 키움측에서 제공하는 함수(함수 업데이트)
  • 함수 형태 : self.kiwoon.dynamicCall ( "GetCommonFunc (QString, QString) ", 함수, " ")
  • 함수 활용 : 계좌비밀번호등록 창 및 RSI, MACD 등을 받아올 수 있다. (RSI, MACD 등은 향후 설명)

 

그림1. WKOA Studio에서 GetCommonFunc 함수를 확인가능하다.


3. 코드 설명

1) 수동으로 계좌번등록 창 열기

계좌번호등록 창은 아래와 같은 경로에서 사용자가 수동으로 열 수 있다.

화면하단의 트레이(tray)쪽이다. (윈도우 화면의 시계 있는 곳)

그림2. 수동으로 계좌비밀번호 등록

 

2) ShowAccountWindow 함수를 통해 계좌번호등록창 열기

TR 요청보다는 GetCommonFunc 함수는 더 편하게 활용할 수 있다.

  •  TR요청 4단계 : SetInputValue(입력) → CommRqData(요청) → OnReceiveTrData(연결) → GetCommData(수신)

이에 비해, GetCommonFunc 함수는 요청/수신이 한번에 이루어진다.

self.kiwoom.dynamicCall("GetCommonFunc(QString, QString)", "ShowAccountWindow", "")  # 계좌번호 입력창을 띄우는 내부함수

 

여기서 주의깊게 보아야할 함수는 ShowAccountWindow 함수이다.

키움에서 제공하며, < 그림2 >의 계좌번호등록 창을 띄우는 함수이다.

 

그림3. 계좌번호등록 창

 

3) 계좌번호등록 창에 계좌비밀번호를 입력한 화면

< 그림3 >의 계좌번호 등록창에 계좌비밀번호를 입력하면 된다.

① 계좌비밀번호 4자리를 입력한다.

② 비밀번호 입력하고 저장을 눌러준다.

③ 닫기를 눌러준다 (esc를 눌러주어도 된다)

그림4. 계좌번호를 입력한 화면


4. ShowAccountWindow 함수는 종료되지 않음

< 그림3 >의 계좌번호등록 창을 호출해주는 것은 ShowAccountWindow 함수였다.

 

문.제.는...

ShowAccountWindow 함수는 "창"을 띄우기는 하나, "종료"가 되지 않는다.

(ShowAccountWindow 함수는 "반환값이 없다"는 것은 실행을 하면 종료되지 않고 실행 중이라는 것이다)

 

이를 알아보기 위해 WKOA Studio에서

SetInputValue와 CommRqData를 확인해 보자.

 

1) SetInputValue함수의 설명

SetInputValue함수는 반환값은 없다.

실제로 print문으로 감싸서 출력을 해보면, 반환값은 None으로 나온다.

→ 여기서 "반환값"이 None으로 나온 점에 대해 주목할 것은,

    반환데이터(None)를 제공준다는 것은

    SetInputValue 함수가 종료(exit) 되었다는 것이다.

그림5-1. SetInputValue 함수 설명

 

2) CommRqData 함수 설명

CommRqData함수가 제대로 입력되어 있다면,

print문을 작성할 경우 0을 반환한다.

< 그림5-2 >처럼 -202가 반환되면, 조회입력값이 제대로 입력되지 않았다는 것이다.

→ 이 또한, CommRqData함수도 데이터를 반환한 후 종료(exit)된다.

 

그림5-2. CommRqData 함수 설명

 

아래 < 그림 5-3 >은 CommRqData 함수의 반환값에 대한 키움측의 답변이다.

그림5-3. CommRqData 함수에 반환값에 대한 키움측 답변

 

3) ShowAccountWindow 함수에 대한 설명

키움에서 제공하는 ShowAccountWindow 함수를 호출하는 형태는 아래와 같다.

self.kiwoom.dynamicCall("GetCommonFunc(QString, QString)", "ShowAccountWindow", "")  # 계좌번호 입력창을 띄우는 내부함수

 

위의 코드에 print 문을 감싸고 실행을 시키면, 종료(exit)되지 않는다.

→ 종료가 되지 않는다는 것은, 다음 코드로 진행이 안된다는 말이다.

print(self.kiwoom.dynamicCall("GetCommonFunc(QString, QString)", "ShowAccountWindow", ""))  # 계좌번호 입력창을 띄우는 내부함수

 

※ 키움측에서 보안정책으로 막아놓은 부분이 ShowAccountWindow 함수를

    종료(exit)되지 않게 하는 부분이다.

    (어떤 실력자가 ShowAccountWindow 함수를 종료하게 만들어준다면,

     해외선물 자동 로그인도 가능할거 같긴 하다 ^^ )


5. 마치며

GetCommFunc 함수와 ShowAccountWindow 함수를 통해

"비밀번호등록 창"을 띄울 수 있는 방법을 알아보았다.

 

필자 입장에서 정말 야심차게 도전했던 부분이,

"비밀번호등록 창"에서 비밀번호를 입력하게 만드는 부분이었다.

 

이 부분에서 이틀간 집중해서 코드를 실행해보았으나,

ShowAccountWindow 함수가 종료되지 않는 화면을 보고나서,

해외선물 API의 자동 로그인을 포기하였다.

 

약간의 아쉬움은 있지만,

해선 시스템 구축시, 일정 정도의 타협(?)은 필요해 보인다.

키움측에서 막아놓은 부분을

필자 실력으로 해결할 수는 없어 보이기 때문이다.

 

윈도우 핸들을 이용하여 자동로그인을 시도하거나,

pyautogui를 통해 좌표를 통해 자동로그인을 시도하였으나,

두 방법 모두 실패하였다.

→ 이유는 둘다 비밀번호등록 창을 띄웠으나 종료(exit)가 않아,

     핸들값을 제어하거나, pyautogui가 실행되지 않는다.

      (파이썬은 인터프리터 개념으로 한줄씩 읽어 나가는데,

       앞의 코드가 종료되지 않으면, 뒤의 코드는 실행되지 않는다)

 

필자가 半 자동 로그인이라고 하는 것도 여기에 있다.

"로그인 창"에서 로그인 비밀번호는 자동으로 입력(pyautogui) 가능하나,

"비밀번호등록 창"에서 계좌 비밀번호는 수동으로 입력해야 한다.

 

다음 글에서는 해선 로그인을 위한 파이썬 코드를 알아보자.

반응형