群益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)))