使用Wine來跑群益API

tags: 程式相關 財金相關

安裝步驟

  • 先根據Wine的使用方法與心得這一篇文章來安裝Ubuntu 32bit的環境以及安裝Wine。要確定Wine與winetricks要確實安裝完成!
  • 要注意Wine官方強烈不建議使用者用root來執行Wine!而Wine的程式最好是在X Window的環境下執行!
  • 接下來首先先來設定Wine的環境,也就是Wine的Windows小系統含DLL檔要放在哪個資料夾下。
  • 先使用遠端桌面連線來登入X Window環境!
  • 再來打開Terminal,執行以下指令以設定Wine的環境!
$ export WINEPREFIX=~/.wine  #這一行其實不需要,這一行在Ubuntu 64bit的環境才會一定需要!
$ export WINEARCH=win32  #這一行其實不需要,這一行在Ubuntu 64bit的環境才會一定需要!
$ wineboot  #創建Wine的環境在~/.wine/資料夾下!
(它若是詢問要不要裝Wine Mono和Gecko,就直接安裝了!)
  • 接下來需要透過winetricks來安裝群益API需要的套件!
  • vcrun2010是VC++ 2010的可轉散發套件,是群益API的SKCOM.dll檔需要的!
  • vcrun2015是VC++ 2015的可轉散發套件,是因為我有使用Visual C++ 2015來編譯一個簡單的程式!(程式碼參考來源) 我幾乎照抄,只有最下面的6111換成TX00(也就是台指期),然後帳號密碼換成自己的!
    • 注意!這個原始碼千萬不要使用Visual C++ 2010去build!因為Visual C++ 2010太舊了!它裡面用到的queue.h還要額外自己上網下載來patch在Visual C++ 2010上!queue.h它很大包,我沒有成功,超級麻煩的!queue.h到Visual C++ 2012才被Visual Studio官方正式支援!
  • dotnet40是 .NET Framework 4.0,是為了Visual C#而裝的!Visual C#要透過dotnet40才能執行!而群益的範例程式SKCOMTester.exe正是用Visual C#寫成的!
    • 不需要裝2.0、3.0、4.5,.NET Framework也是一樣,DLL提供的API是很精確的!程式要call 4.0的DLL就是只能用4.0的DLL!
$ winetricks vcrun2010 vcrun2015 dotnet40

或是在ssh底下執行:

$ apt install xvfb
$ time xvfb-run winetricks -q vcrun2010 vcrun2015 dotnet40  #靜態安裝,不會秀UI,目前只試過幾次,看起來是有效的!不過還是要再看實測穩定性!
  • 下載群益API官網的C#範例,下載到CapitalAPI_2.13.16_CExample.zip、放它到Ubuntu 32bit的環境裡並且解壓縮它!
  • 進入資料夾CapitalAPI_2.13.16_CExample>元件>x86 (建議把元件改名成Components,用英文比較好!)
  • 執行以下指令以註冊群益API所需要的DLL檔SKCOM.dll
$ regsvr32 ./SKCOM.dll
  • 實測發現,使用群益C# API寫的程式,時常會被Wine說會有Make sure that ntlm_auth >= 3.0.25的問題!要解決這個問題,需要安裝winbind這個套件:
$ sudo apt install winbind
  • 接下來我們要自己下載根憑證檔root certificate並且自己透過IE5來安裝,以避免Wine內建的winhttp的HTTPS憑證的bug!
$ cd
$ wget http://sslserver.twca.com.tw/cacert/root4096.crt
$ wine control
  • 接下來選擇網際網路設定>內容>憑證...>選擇分頁信賴的根憑證授權者>匯入(I)...,接下來選擇root4096.crt這個檔,然後一直按下一步,然後最後按完成!此時你應該要看到以下的畫面:
  • 最近實測發現,實際上是Linux系統如果有安裝root4096.crt的話,Wine的環境似乎就可以不用透過IE5安裝root4096.crt!執行以下指令來在Linux系統裡安裝root4096.crt:(不過還是要實測一下穩定性!)
$ sudo cp -v ./root4096.crt /usr/local/share/ca-certificates/
$ sudo update-ca-certificates
  • 最後我們可以來執行群益API的範例程式SKCOMTester.exe了!
$ cd ~/Capital/Components/x86
$ wine ./SKCOMTester.exe
  • 再來登入自己的帳號密碼,先看看能不能登入!
    • 若出現SK_ERROR_INITIALIZE_FAIL的訊息,則代表剛剛root4096.crt沒有匯入到正確的分頁裡!Wine的HTTPS的bug還沒有繞掉!
    • 若出現登入成功的訊息,則代表真的登入成功了!

尚在研究的東西

  • 目前在X Window之下透過「網際網路設定」手動匯入root4096.crt之後,群益API就可以動了!但是目前還需要在X Window的環境下執行!我猜測是在ssh之下沒有X Window,所以IE5已匯入root4096.crt的事實也一起被忽略了,所以又繞回使用wininet失敗的窘境。可以的話,我希望能不使用X Window也能讓它吃到root4096.crt根憑證檔!(不過我還沒trace這個case的WINEDEBUG log)
  • 以上說的我事後追並不是因為沒有X Window而導致IE5已匯入root4096.crt的事實也一起被忽略,而是我寫的skcom_test1.exe雖然不是使用Visual C#寫的,但是它還是需要使用 .NET Framework 4.0的DLL檔,而且那個DLL檔似乎還一定要在X Window的環境下才不會有錯誤!這才是skcom_test1.exe在沒有X Window的SSH環境下不能執行的原因!
    • 目前我懶得解決這個問題了!我打算先使用Fake X Window來讓SSH的環境下也能執行skcom_test1.exe!而非常幸運的,我找到了Xvfb!(virtual framebuffer X server for X Version 11)
    • Ubuntu下安裝Xvfb的方法很簡單:
$ apt install xvfb
​- 使用`Xvfb`的方法也很簡單!請參考[這一篇](http://elementalselenium.com/tips/38-headless)!以我的case來講:
$ xvfb-run wine ./skcom_test1.exe
​- 如果是有二隻程式需要在同一個`Xvfb`所建立出來的`$DISPLAY`下執行的話,建議還是用Option 1中提到的`export`的方法!(Option 1的變形請參考[這一篇](https://blog.csdn.net/Nobody_Wang/article/details/60887659)!)
  • 目前已知道CA交易憑證一樣也是放匯入root4096.crt的那個視窗內!所以也許在X Window的環境之下,並不太需要擔心CA交易憑證匯入的問題!
  • 目前我的Ubuntu機的時區在安裝後都是正確的Asia/Taipei,但是LXC VM的時區在安裝後都是錯誤的Etc/UTC!Ubuntu機和LXC VM的時區是允許不同的!(神奇) 而要修改時區的話請參考這一篇文章!快速的修改方法和查詢方法是:
$ sudo timedatectl set-timezone Asia/Taipei  #時區改為Asia/Taipei
$ timedatectl  #查詢目前時區
      Local time: 三 2019-07-10 02:30:21 CST
  Universal time: 二 2019-07-09 18:30:21 UTC
        RTC time: 二 2019-07-09 18:30:21
       Time zone: Asia/Taipei (CST, +0800)
 Network time on: yes
NTP synchronized: yes
 RTC in local TZ: no
Select a repo