twstock icon indicating copy to clipboard operation
twstock copied to clipboard

realtime.get() function issue

Open why702 opened this issue 7 years ago • 6 comments

sometime i got the issue message as below

{'userDelay': 500, 'rtmessage': ' ', 'rtcode': '0000', 'success': False}

My code:

from twstock import realtime

for stockid in stockidList: for i in range(10): rl = realtime.get(stockid) if rl['success'] == True: latest_trade_price = float(rl['realtime']['latest_trade_price']) break else: latest_trade_price = 0 print(rl) time.sleep(0.5)

why702 avatar Jan 21 '18 05:01 why702

我也遇到相同的問題。 具體的情況是發生在一次取得多筆資料,例如['2002', '2886'] 若是僅取得單筆資料不會發生這個問題,例如['2002'] 或 '2002'。 經過使用流覽器測試後發現, 若有先開啟 http://mis.twse.com.tw/stock/index.jsp 後再開啟 http://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=tse_2002.tw|tse_2886.tw&=1518059961000 便可正常取得。 但若一開始(或關閉瀏覽器一段時間後重新開啟)便連結 http://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=tse_2002.tw|tse_2886.tw&=1518059961000 便會得到這個錯誤。

猜想似乎是 realtime.get() 裡面的 requests.Session() 不起作用。 有試圖修改這一段代碼

def get_raw(stocks) -> dict:
    req = requests.Session()
    req.get(SESSION_URL)

    r = req.get(
        STOCKINFO_URL.format(
            stock_id=_join_stock_id(stocks),
            time=int(time.time()) * 1000))

但始終不知要如何在代碼裡面掛勾這兩個連結。

8888alex avatar Feb 08 '18 03:02 8888alex

@8888alex 請問這個問題解決了嗎? 我也遇到同樣的問題

s724959099 avatar Feb 25 '18 09:02 s724959099

@s724959099 我有用浏览器去跟踪 http://mis.twse.com.tw/stock/index.jsp 的内容,发现这个网址本身也会呼叫 getStockInfo.jsp 例如 http://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=tse_t00.tw|otc_o00.tw|tse_FRMSA.tw&json=1&delay=0&_=1519625027817 之后尝试过修改 headers 去模拟浏览器但无效,暂时还没找到浏览器与 requests 之间的关键区别,所以也还没发现解决的方法....

8888alex avatar Feb 26 '18 06:02 8888alex

這樣好像可以

def get_raw(stocks) -> dict:
    '''
    req = requests.Session()
    req.get(SESSION_URL)

    r = req.get(
        STOCKINFO_URL.format(
            stock_id=_join_stock_id(stocks),
            time=int(time.time()) * 1000))
    '''
    s = requests.Session()
    req = requests.Request(method='GET', url=SESSION_URL)
    prep = req.prepare()
    prep.url = STOCKINFO_URL.format(stock_id=_join_stock_id(stocks),time=int(time.time()) * 1000)
    r = s.send(prep)

    print(r.text)
    if sys.version_info < (3, 5):
        try:
            return r.json()
        except ValueError:
            return {'rtmessage': 'json decode error', 'rtcode': '5000'}
    else:
        try:
            return r.json()
        except json.decoder.JSONDecodeError:
            return {'rtmessage': 'json decode error', 'rtcode': '5000'}

distagon avatar Aug 16 '18 16:08 distagon

I cannot produce in v1.2.0 and current TWSE api, could anyone help?

mlouielu avatar Mar 19 '19 02:03 mlouielu

我也遇到類似的,twstock.realtime.get('1795'),去取不出來

Vespa1006 avatar Mar 02 '20 03:03 Vespa1006