2017/07/03

群益api– python 串接 失敗記

群益api 版本: 2.13.6
python 版本: 2.7.13 64bit

情境一: 使用  win32com

 

import sys
import win32com.client.CLSIDToClass, pythoncom, pywintypes
import win32com.client.util
import win32event
import win32com.client
import pythoncom
from win32com.client import makepy, gencache, DispatchWithEvents
from win32com.client import VARIANT


makepy.GenerateFromTypeLibSpec('SKCOMLib')

infos = makepy.GetTypeLibsForSpec('SKCOMLib')

clsid = infos[0][1].clsid

major = infos[0][1].major

minor = infos[0][1].minor

lcid = infos[0][1].lcid

SKComTmplate = gencache.EnsureModule(clsid, lcid, major, minor, bForDemand=True)


SKCenterLib = win32com.client.DispatchEx (SKComTmplate.SKCenterLib.CLSID)

SKQuoteLib  = win32com.client.DispatchEx (SKComTmplate.SKQuoteLib.CLSID)

SKQuoteLibEvent = DispatchWithEvents (self.SKQuoteLib, SKQuoteLibEvent)

pythoncom.PumpWaitingMessages ()


登入、Event 都正常, 但在 SKCOMLib 內 卻取不到 SKTCOK這個 struct
後面網路上搜尋或許可以使用 wincom32.client.VARIANT

但是 要修改成
SKQuoteLib  = win32com.client.dynamic.DumbDispatch(SKComTmplate.SKQuoteLib.CLSID)
def SKOSQuoteLib_GetStockByIndex(self, sIndex=defaultNamedNotOptArg, pSKForeign=defaultNamedNotOptArg):
    return self._ApplyTypes_(8, 1, (3, 0), ((2, 1), (36, 3)), u'SKOSQuoteLib_GetStockByIndex', None,sIndex, pSKForeign)

(36,3) 看網上說明需要使用 VT_RECORD, 怎麼 VARIANT 塞進去 都會失敗.

情境二: 使用 comtypes   

這時,回傳是成功的, 但是 Event 卻一直沒有觸發, 後面的流程就沒辦法執行

http://easontseng.blogspot.tw/2017/08/api-in-python.html

參考 Eason 大大的網誌已可以成功串接 (2017.09.21)

參考:
http://hlfutures.blogspot.tw/2016/08/api-in-python_8.html

4 則留言:

Eason 提到...
作者已經移除這則留言。
Eason 提到...

我最近也在用 python 接群益API,希望可以交流一下
這是我的成果,可以接報價
https://easontseng.blogspot.com/2017/07/api-in-pyhton.html

但 Event 都要自己手動呼叫 pythoncom.PumpWaitingMessage(),運作上不是很順暢
不知道您有沒有什麼好的處理方法

山豆兒 提到...

@Eason
感謝你的分享,可以使用pythoncom.PumpWaitingMessage() 來觸發 event
我想 一般的處理方式 可以放在一個 while 的迴圈中來處理訊息的接收
網路上應該也不少使用 while 來處理訊息的範例,您可以參考一下

另外我有使用 pythonnet 也可以正常的接報價, 就沒再使用 comtypes

http://kwedr.blogspot.tw/2017/07/api-python-pythonnet.html

Eason 提到...
作者已經移除這則留言。