2019年7月3日 星期三

群益API 更新至 2.13.17, Login 時錯誤訊息 "SK_WARNING_REGISTER_REPLYLIB_ONREPLYMESSAGE_FIRST"

群益API 更新至 2.13.17,這版本 Login 時會要求要先看過公告的訊息
否則會出現錯誤訊息 "SK_WARNING_REGISTER_REPLYLIB_ONREPLYMESSAGE_FIRST".

API文件寫說:

SKCenterLib初使化檢查是否接收SKReplyLib_OnReplyMessage公告訊息並回傳指定值VARIANT_TRUE,方可登入。

SKReplyLib_OnReplyMessage 文件又寫說,當 sConfirmCode 回傳 VARIANT_TRUE (0xFFFF),表示你看過公告了。官方沒附範例還真難理解要怎麼實做,一陣摸索後,寫了一個目前可以運作的版本。這更新真是擾民啊,可能要設計個介面讓人讀取公告後按確認,才能進行登入吧,我把它寫死了,固定回傳 0xFFFF ,也就是 VARIANT_TRUE



from comtypes.client import GetModule, CreateObject, GetEvents
GetModule(r'C:\SKCOM\CapitalAPI_2.13.17\x64\SKCOM.dll')
import comtypes.gen.SKCOMLib as sk
#建立COM物件
if 'skC' not in globals(): skC=CreateObject(sk.SKCenterLib, interface=sk.ISKCenterLib)
if 'skQ' not in globals(): skQ=CreateObject(sk.SKQuoteLib, interface=sk.ISKQuoteLib)
if 'skR' not in globals(): skR=CreateObject(sk.SKReplyLib, interface=sk.ISKReplyLib)
#Configuration
ID=''
PW=''
#建立事件類別
class skQ_events:
    def OnConnection(self, nKind, nCode):
        if nCode == 0 :
            if nKind == 3001 :  print("連線中, nkind= ", nKind)
            elif nKind == 3003: print("連線成功, nkind= ", nKind)
class skR_events:
    def OnReplyMessage(self, bstrUserID, bstrMessage, sConfirmCode=0xFFFF):
        #根據API 手冊,login 前會先檢查這個 callback, 
        #要返回 VARIANT_TRUE 給 server,  表示看過公告了,我預設返回值是 0xFFFF
        print('OnReplyMessage', bstrUserID, bstrMessage)
        return sConfirmCode       
#Event sink, 事件實體  
EventQ=skQ_events()
EventR=skR_events()
#make connection to event sink
ConnQ = GetEvents(skQ, EventQ)
ConnR = GetEvents(skR, EventR)
print("Login,", skC.SKCenterLib_GetReturnCodeMessage(skC.SKCenterLib_Login(ID, PW)))

13 則留言:

  1. Thanks for your effort and it help me a lot.

    回覆刪除
  2. 感謝, 我是用 2.13.18 版本的 API, C# 版本也要註冊 SKReplyLib 的 OnReplyMessage event 才會成功

    回覆刪除
  3. 我找的2天的BUG 以為發生甚麼問題 好險舊版API還在 直上舊版

    回覆刪除
  4. 請問Eason大2021年有新的解決方法嗎? 我照著上面程式碼還是出現
    [Login, SK_WARNING_REGISTER_REPLYLIB_ONREPLYMESSAGE_FIRST]的訊息ㄟ

    回覆刪除
  5. 我更新至 API 2.13.27,用起來還是正常哩,你skR_events, OnReplyMessage 有寫對嗎?? GetEvent 也檢查一下

    回覆刪除
    回覆
    1. 我除了GetModule路徑,ID & PASSWORD換成自己的, 都是照上面的程式碼貼上的

      所以應該跟EASON大你的一樣。但還是出現 SK FAIL [Login, SK_WARNING_REGISTER_REPLYLIB_ONREPLYMESSAGE_FIRST]

      然後我的版本是 2.13.28

      刪除
    2. 我更新至 2.13.28 上面的 code 也是可以用的,你是第一次使用群益api嗎? 還是之前有用過其他版本的api? 用什麼環境跑的 Jupyter 還是其他IDE? 有簽或申請 API 使用憑證嗎?

      刪除
    3. 是第一次使用,之前沒有用過其他版本的API。然後使用環境是Jupyter Notebook. 已經有申請API使用憑證,也有用install.bat安裝過了

      竟然您測試是可以使用的,但實在不知道是哪個環節出了問題,這個周末我再試試看,謝謝EASON大的回覆

      刪除
  6. 不知道還能不能夠加入群組 感謝

    回覆刪除
    回覆
    1. fb 社團 Fintech.py,還在可以討論,有問題就在板上問,我可以的就盡量幫。但大家都很保守,分享的人少... 入社的問題請盡量回答,懶得回的人我也懶得加。line 群也還在,但曾經被翻群,連結我就不弄上來了,有緣就加吧,平時大家也都沒再討論,記得打個招呼

      刪除