<style> html, body, .ui-content { background-color: #333; color: #ddd; } body > .ui-infobar { display: none; } .ui-view-area > .ui-infobar { display: block; } .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { color: #ddd; } .markdown-body h1, .markdown-body h2 { border-bottom-color: #ffffff69; } .markdown-body h1 .octicon-link, .markdown-body h2 .octicon-link, .markdown-body h3 .octicon-link, .markdown-body h4 .octicon-link, .markdown-body h5 .octicon-link, .markdown-body h6 .octicon-link { color: #fff; } .markdown-body img { background-color: transparent; } .ui-toc-dropdown .nav>.active:focus>a, .ui-toc-dropdown .nav>.active:hover>a, .ui-toc-dropdown .nav>.active>a { color: white; border-left: 2px solid white; } .expand-toggle:hover, .expand-toggle:focus, .back-to-top:hover, .back-to-top:focus, .go-to-bottom:hover, .go-to-bottom:focus { color: white; } .ui-toc-dropdown { background-color: #333; } .ui-toc-label.btn { background-color: #191919; color: white; } .ui-toc-dropdown .nav>li>a:focus, .ui-toc-dropdown .nav>li>a:hover { color: white; border-left: 1px solid white; } .markdown-body blockquote { color: #bcbcbc; } .markdown-body table tr { background-color: #5f5f5f; } .markdown-body table tr:nth-child(2n) { background-color: #4f4f4f; } .markdown-body code, .markdown-body tt { color: #eee; background-color: rgba(230, 230, 230, 0.36); } a, .open-files-container li.selected a { color: #5EB7E0; } </style>} # Python + Flask 虛擬美國股票交易網站 Part6 (股價來源 ) ###### tags: `CS50` `Python` `Flask` ## 前言 登入網站後第一件要做的事就是趕快炒股,所以能拿到即時股價是很重要的,CS50課程中介紹了[IEX](https://iexcloud.io/) 這個工具可以讓我們使用它的API查價。IEX API會用json格式傳回所需的數據 例如查詢NFLX ``` { "symbol": "NFLX", "companyName": "Netflix, Inc.", "primaryExchange": "NASDAQ", "calculationPrice": "close", "open": 317.49, "openTime": 1564752600327, "close": 318.83, "closeTime": 1564776000616, "high": 319.41, "low": 311.8, "latestPrice": 318.83, "latestSource": "Close", "latestTime": "August 2, 2019", "latestUpdate": 1564776000616, "latestVolume": 6232279, "iexRealtimePrice": null, "iexRealtimeSize": null, "iexLastUpdated": null, "delayedPrice": 318.83, "delayedPriceTime": 1564776000616, "extendedPrice": 319.37, "extendedChange": 0.54, "extendedChangePercent": 0.00169, "extendedPriceTime": 1564876784244, "previousClose": 319.5, "previousVolume": 6563156, "change": -0.67, "changePercent": -0.0021, "volume": 6232279, "iexMarketPercent": null, "iexVolume": null, "avgTotalVolume": 7998833, "iexBidPrice": null, "iexBidSize": null, "iexAskPrice": null, "iexAskSize": null, "marketCap": 139594933050, "peRatio": 120.77, "week52High": 386.79, "week52Low": 231.23, "ytdChange": 0.18907500000000002, "lastTradeTime": 1564776000616 } ``` ## 設定IEX API ### vfinance/utils.py ``` def lookup(symbol): """Look up quote for symbol.""" # Contact API try: api_key = os.environ.get("API_KEY") response = requests.get(f"https://cloud-sse.iexapis.com/stable/stock/{urllib.parse.quote_plus(str(symbol))}/quote?token={api_key}") response.raise_for_status() except requests.RequestException: flash("Please set API_KEY", 'danger') return None # Parse response try: quote = response.json() return { "name": quote["companyName"], "price": float(quote["latestPrice"]), "symbol": quote["symbol"], "change": quote["change"], "changePercent": quote["changePercent"], "volume": quote["volume"], "week52High": quote["week52High"], "week52Low": quote["week52Low"], "open" :quote["open"], "high" :quote['high'], "low" : quote["low"] } except (KeyError, TypeError, ValueError): return None ``` 在這之前要去[IEX](https://iexcloud.io/) 註冊登入並拿到API Token,然後在執行程式之前先執行 ``` export API_KEY=YOUR TOKEN ``` 之後就可以利用回傳回來的json格式拿到所需要的數據,例如要股價的話就輸入 ``` quote = lookup(AMZN) stock_price = quote['price'] ```