이것저것

리눅스에서 wine + 키움증권 OpenAPI 성공!

ForceCore 2020. 8. 9. 17:25

https://forcecore.tistory.com/1430

 

docker + wine + MFC 조합으로 키움증권 OpenAPI 리눅스 실행 성공

평상시에는 윈도우 없이 편안하게 클라우드에서 실행이 가능하다. ㄷㄷㄷㄷㄷ https://github.com/forcecore/KiwoomRestfulCpp/blob/master/docker/README.md GitHub - forcecore/KiwoomRestfulCpp Contribute to..

forcecore.tistory.com

2021-12-09 도커까지 써서 안정화 했다. 이 글보다는 위 글로 가길 추천.

 

 

결론적으로 말해서 wine이 버전업되면서 성공하게 되었다. (주식도 그렇고) 존버는 승리한다!

github.com/forcecore/kiwoom-restful : 사용한 서버/클라이언트 구현체

 

forcecore.tistory.com/1420 : setup 과정을 한번 정리한 것

 

$ wine --version
wine-6.3

multilib/wine 6.4-1 [installed: 6.3-1]
    A compatibility layer for running Windows programs

 

----------------------------------

 

윈도우 azure 환경에서 윈도우 환경으로 API 서버를 굴리자니 좀 버벅거림이 심하고 불만족스럽다.

그래서 이 삽질에 뛰어들었다. Amazon EC2에서 OpenAPI만 어떻게든 굴리면 될 것 아닌가? 이런 접근법임.

 

우선 한글 깨지는 것을 바로잡아야 한다. 뭐가 보야야지 디버깅도 하지.

 

https://forcecore.tistory.com/1320

 

와인 한글이 네모 혹은 바코드로 나올 때

네이버 라인을 설치하다 문제가 생겼다. http://egloos.zum.com/nemonein/v/5218684 그래서 자료를 찾아봤는데... 우선 위 자료대로 하니깐 한글 글꼴이 뵈기 싫은 것은 해결이 되었다. 문제는, 아직 한글이 �

forcecore.tistory.com

이 글을 참조한다.

 

mkdir ~/usr/kiwoom

cd ~/usr/kiwoom

 

env.sh 만듦.

#!/bin/bash
export WINEARCH=win32
export WINEPREFIX=$HOME/usr/kiwoom/wine
export LANG=ko_KR.utf8
export LC_ALL=ko_KR.utf8

이 파일을 소스 하고나서 와인을 건들도록 하자.

 

Miniconda3-latest-Windows-x86.exe

OpenAPISetup.exe

준비.

 

API 설치하고 Miniconda 설치함. (c:\OpenAPI 와 c:\Miniconda 에 설치됨)

 

https://pypi.org/project/kiwoom-api-handler/

 

kiwoom-api-handler

a package for hanlding Kiwoom OPEN API+ ActiveX Control with python

pypi.org

이것 사용 예정이다. 이제 파이썬 환경을 갖춰보자. (와인 내에 ㅠㅠ)

 

$ wine cmd

 

그러면 윈도우 콘솔처럼 되는데...

C:\Miniconda3

여기에서...

 

> condabin\conda.bat

을 실행한다. 이렇게 실행해야 한다.

 

set CONDA_FORCE_32BIT=1
conda create -n py36_32 python=3.6 anaconda
# 설치 후 conda activate py36_32

대략 이런 과정인데, 안 될 것이다. libssl, libcrypto 어쩌구 하면서 초장부터 안 될텐데,  libcrypto-1_1, libssl-1_1 DLL 파일 (윈도우용)을 구해다가, winecfg 켜서, 라이브러리 탭에다 native로 지정을 한다. 그리고 와인의 windows\system32에다가 dll파일들을 넣어주면 된다.

 

그러면 conda create가 될 것이다.

 

drive_c/Miniconda3/envs/py36_32

이런 데 생겼구만. 하지만 conda activate 명령어가 전혀 먹혀들지 않는다. 윈도우의 shell interpreter와 간극이 있어서...

 

C:\Miniconda3\envs\py36_32>lib\venv\scripts\nt\activate.bat

 

이거는 된다. kiwoom_api_handler 를 git clone 한 뒤...

 

__VENV_PROMPT__C:\Miniconda3\envs\py36_32>scripts\pip install -r c:\kiwoom_api_handler\requirements.txt

 

기괴하군...

 

c:\Miniconda3\envs\py36_32\python  xxx.py

이렇게 해야 파이썬 실행도 되고... pandas, numpy 로딩이 실패해서 그냥 kiwoom_api_handler에서 import pandas as pd 행을 다 삭제했다. (연구 개발목적으로 넣었지만, 실제로는 안 쓰임)

 

02c0:err:module:open_builtin_file failed to load .so lib "/usr/lib32/wine/wldap32.dll.so"

이건 sudo pacman -S lib32-libldap 로 해결.

 

02cc:err:winediag:gnutls_initialize failed to load libgnutls, no support for encryption

sudo pacman -S lib32-gnutls

 

inicore_v2.3.42, inisafenet_v7.2 는 DLL을 와인의 windows\system32에 복사, winecfg로 네이티브 지정 함.

 

여기서 더이상 진행이 없다. 에러도 안 나고, 그렇다고 로그인 창이 뜨지도 않는다.... 인줄 알았는데

 

한참을 기다리니 뭔가 변화가 생긴다.

00c4:err:module:import_dll Library MFC42.DLL (which is needed by L"C:\\OpenAPI\\ASTxManager.dll") not found

이런 말이 나온다. MFC42.DLL 이 없어서.

 

winetricks mfc42

 

로 설치.

 

되는 것 같다가 이번에는 버전처리가 실패한다.

 

 

이렇게 되는 것이다. ㅋㅋ;;;; 

00a0:fixme:mountmgr:harddisk_ioctl Unsupported ioctl 74080 (device=7 access=1 func=20 method=0)

이런 것과 관련 있을 것 같은데, 파일을 업데이트 하면서 교체하는 부분의 코드가 와인에 없으니 어떻게 할 방법이 없다...;; 여기까지 왔는데 아깝다.

 

한참 막혀있다가 이게 윈도우에서도 일어나는 일이라는 것을 알고...

ps -eaf | grep 

USER         4306       1  2 17:04 pts/1    00:00:01 c:\Miniconda3\envs\py36_32\python kiwoom_restful_server.py

이런식으로 파이썬이 도는 것이 있는데 kill 4306 처럼 킬 한다음 opstarter 의 확인 버튼을 누르니 진행되었다. (윈도우에서도 유사하게 해야 한다)

 

이번에는 공인인증서가 없다. ㄷㄷㄷ;;

PC에서 복사하면 되지... 인증서 갱신은 1년에 한번정도만 하면 되니 굳이 와인으로 스마트폰->wine쪽으로 복사 작업까지 할 필요는 없다.

 

c:\users\USER\AppData\LocalLow\NPKI 여기 공인인증서가 있는데 PC쪽에서 복사를 하여 wine/drive_c 에서도 똑같이 배치를 해주면 된다.

 

설레이는 마음으로 로그인 완료 화면까지 보았는데...

crypt32/context.c:111: Context_Release: assertion `ref >= 0'

이런 에러가 나오면서 안 된다...

crypt32.dll 받고 native로 설정. 어... 쟤가 범인이 아니었다. 그럼 뭐지... ㄷㄷㄷ

 

OK... stack trace를 보고 bcrypt.dll 도 native로 해봤다.

 

Traceback (most recent call last):
 File "kiwoom_restful_server.py", line 204, in <module>
   main()
 File "kiwoom_restful_server.py", line 182, in main
   tornado_app.listen(port)
 File "c:\Miniconda3\envs\py36_32\lib\site-packages\tornado\web.py", line 2116, in listen
   server.listen(port, address)
 File "c:\Miniconda3\envs\py36_32\lib\site-packages\tornado\tcpserver.py", line 151, in listen
   sockets = bind_sockets(port, address=address)
 File "c:\Miniconda3\envs\py36_32\lib\site-packages\tornado\netutil.py", line 174, in bind_sockets
   sock.bind(sockaddr)
OSError: [WinError 10048] Windows Error 0x2740

 

이런 에러가 나온다. 혹시... 이거... 그냥 tornado 때문에 나는 에러 아닐까 ㄷㄷㄷ 키움 API는 정상이고.

 

---------------

위 까지 해둔다음 와인 버전업을 기다렸다.

2020-12-15

 

Failed to create dump file 'C:\OpenAPI\OPStarter.dmp' (error32)

이렇게 된다. wine error가 나는 것도 아니고 그냥 아무것도 안 된다;;;

native dll들 다 없애고 나니 inicore_v2.3.42.dll
, inisafenet_v7.2.dll 이 없어서 나는 에러였다. 이것듯만 네이티브로 전환...

소용 없네.

 

 

--------------

2021-03-28존버 끝에 와인이 버전업 되면서 위의 문제도 사라졌다 (ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ)

 

이런 에러로 바뀌었다.

하지만? 트레이에는 여전히 키움증권 뭔가 도는 것처럼 보인다.

 

이렇게.

 

위 스샷처럼 보안프로그램 어쩌구 하는 에러는 한 번 나오는데, 이후부터는 잘 된다 ㅎㄷㄷㄷ 트레이딩 잘 되라고 계좌 비밀번호 저장도 했다.

 

yeeeeessss