前情提要:昨天我們定義了 AI 的溫暖對話準則。
本日目標:為了讓/life-simulate更逼真,我們要讓系統能抓取真實世界的 ETF 報價與匯率。但我們「堅持不裝」重型套件。
在 Python 世界抓資料,大家直覺都是 pip install requests 或 yfinance。
但身為一個追求極簡的開源專案,我們希望任何人下載原始碼後,不需要安裝一堆套件就能跑。
因此,我們要使用 Python 內建的標準函式庫 urllib.request 來呼叫 Yahoo Finance 的公開 API:
https://query1.finance.yahoo.com/v8/finance/chart/VT
https://query1.finance.yahoo.com/v8/finance/chart/0050.TW
https://query1.finance.yahoo.com/v8/finance/chart/TWD=X
網路總是有斷線的時候。如果 API 掛了,我們的遊戲就不能玩了嗎?
絕對不行!因此我們要在 financial_api.py 中實作一個「Fallback 機制」。如果在 5 秒內抓不到資料,系統會自動切換到本地的 Mock 資料。
# financial_api.py
import urllib.request
import json
MOCK_DATA = {
"VT": 125.40,
"VOO": 510.25,
"0050": 185.30,
"USDTWD": 32.50
}
def fetch_live_price(symbol):
"""
Fetch live price from Yahoo Finance Chart API.
Falls back to MOCK_DATA on failure.
"""
yahoo_symbol = symbol
if symbol == "0050":
yahoo_symbol = "0050.TW"
elif symbol == "USDTWD":
yahoo_symbol = "TWD=X"
url = f"https://query1.finance.yahoo.com/v8/finance/chart/{yahoo_symbol}"
try:
req = urllib.request.Request(
url,
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
)
with urllib.request.urlopen(req, timeout=5) as response:
data = json.loads(response.read().decode())
meta = data["chart"]["result"][0]["meta"]
price = meta["regularMarketPrice"]
return round(price, 2)
except Exception as e:
# Fallback to Mock
return MOCK_DATA.get(symbol, 100.0)
def get_financial_dashboard():
vt_price = fetch_live_price("VT")
voo_price = fetch_live_price("VOO")
tw_price = fetch_live_price("0050")
usdtwd = fetch_live_price("USDTWD")
return {
"VT_usd": vt_price,
"VOO_usd": voo_price,
"0050_twd": tw_price,
"USDTWD_rate": usdtwd,
"VT_twd_equivalent": round(vt_price * usdtwd, 1),
"VOO_twd_equivalent": round(voo_price * usdtwd, 1)
}
if __name__ == "__main__":
print("Fetching Financial Dashboard:")
data = get_financial_dashboard()
print(json.dumps(data, indent=2, ensure_ascii=False))
透過這種設計,我們的 AI Agent 不僅能取得實時的全球經濟數據,還具備了 100% 的容錯穩定性!
今天我們實作了最輕量級的 API 爬蟲。在 Agentic AI 的時代,Agent 的能力取決於它能呼叫多少 Tool。我們用最原始的方式,賦予了 AI 看懂全球股市的能力。
思考題:如果你要在這個系統裡加入「比特幣 (BTC)」的資產,你覺得可以去哪裡抓免費的報價 API?
明日預告:你聽過 RAG (檢索增強生成) 嗎?明天(Day 28),我們不用任何複雜的向量資料庫,用純 Python 寫一個極簡版 RAG,讓 AI 讀懂我寫的部落格金句!