一個涵蓋 台股 / 美股 / 港股 的個股查詢與投資參考網站。提供即時股價、漲跌、走勢圖與程式化「顧問觀點」,並開放 REST API 供 iOS App 與其他 webspace 取用。
/api/* 端點啟用 CORS(Access-Control-Allow-Origin: *),可供 iOS App 與其他網站直接呼叫。https://www.herelai.fun/ → 卡片「股價顧問」。https://www.herelai.fun/ws/stock-advisor/所有端點以 https://www.herelai.fun/ws/stock-advisor 為基礎路徑(以下省略前綴)。回傳皆為 application/json,market 取值 TW / HK / US。
| 方法 | 路徑 | 說明 | 參數 |
|---|---|---|---|
| GET | /api/health | 服務健康檢查 | — |
| GET | /api/markets | 三市場開收市狀態與交易時段 | — |
| GET | /api/universe | 標的清單(熱門+家族基金持倉) | market(可選) |
| GET | /api/search?q= | 依代碼/名稱搜尋(含即時探測) | q、market(可選) |
| GET | /api/quote/:market/:symbol | 個股即時報價 | 路徑參數 |
| GET | /api/quote/multi?items= | 批次報價 | items=TW:2330,HK:00700,US:AAPL |
| GET | /api/history/:market/:symbol | 歷史收盤價(走勢圖用) | days(10–250,預設 90) |
| GET | /api/advisor/:market/:symbol | 顧問觀點(啟發式指標) | 路徑參數 |
GET /api/quote/TW/2330{
"market": "TW", "symbol": "2330", "name": "台積電", "currency": "TWD",
"price": 2475.0, "prevClose": 2500.0, "open": 2480.0,
"high": 2490.0, "low": 2470.0, "volume": 12990,
"change": -25.0, "changePct": -1.0,
"updatedAt": "2026-09-25T05:30:00.000Z", "source": "mis", "marketOpen": false
}
GET /api/advisor/HK/00700{
"available": true,
"signals": [
{"label": "短期趨勢", "value": "短線高於月線(20 日均),偏多"},
{"label": "區間位置", "value": "居中震盪(中段,約 50% 分位)"},
{"label": "年化波動", "value": "中等(約 28.4%)"}
],
"ma20": 432.1, "highest": 677.7, "lowest": 411.0,
"rangePosition": 50.0, "annualizedVolatility": 28.4, "windowDays": 120,
"disclaimer": "本網站資訊與「顧問觀點」皆由程式依公開歷史資料計算,僅供參考,不構成任何投資建議。",
"quote": { "market":"HK", "symbol":"00700", "name":"騰訊控股", "price":436.6 }
}
自選股綁定帳號:先註冊/登入取得 Bearer token,後續受保護請求於標頭帶 Authorization: Bearer <token>。所有端點皆啟用 CORS(Access-Control-Allow-Origin: *),可供 iOS App 與其他網站呼叫。
| 方法 | 路徑 | 說明 | 參數 |
|---|---|---|---|
| POST | /api/auth/register | 註冊並登入(回傳 token+account) | body: email, password(≥6), displayName? |
| POST | /api/auth/login | 登入取得 token | body: email, password |
| POST | /api/auth/logout | 登出(註銷目前登入會話) | 需 token |
| GET | /api/auth/me | 取得目前帳號資訊 | 需 token |
| DELETE | /api/auth/me | 註銷帳號(刪除帳號+其自選+所有會話) | 需 token |
| GET | /api/watchlist | 取得我的自選(含每檔即時報價) | 需 token |
| POST | /api/watchlist | 加入自選 | 需 token;body: market, symbol, name? |
| DELETE | /api/watchlist/:market/:symbol | 移除自選 | 需 token;路徑參數 |
未帶有效 token 呼叫受保護端點會回傳 401 {"error":"unauthorized"}。Client 範例:
// 登入取得 token
const r = await fetch(BASE+'/api/auth/login', {method:'POST',
headers:{'Content-Type':'application/json'},
body: JSON.stringify({email, password})});
const {token, account} = await r.json();
// 加入自選(帶 token)
await fetch(BASE+'/api/watchlist', {method:'POST',
headers:{'Content-Type':'application/json','Authorization':'Bearer '+token},
body: JSON.stringify({market:'TW', symbol:'2330', name:'台積電'})});
import Foundation
struct Quote: Decodable {
let market, symbol, name, currency: String
let price: Double
let change, changePct: Double
}
func fetchQuote(market: String, symbol: String) async throws -> Quote {
let base = "https://www.herelai.fun/ws/stock-advisor"
let url = URL(string: "\(base)/api/quote/\(market)/\(symbol)")!
let (data, _) = try await URLSession.shared.data(from: url)
return try JSONDecoder().decode(Quote.self, from: data)
}
// 使用:
// let q = try await fetchQuote(market: "TW", symbol: "2330")
// print(q.name, q.price, q.changePct)
// 於任意網頁中顯示台積電即時價(API 已開啟 CORS)
fetch('https://www.herelai.fun/ws/stock-advisor/api/quote/TW/2330')
.then(r => r.json())
.then(q => {
document.getElementById('tsmc').textContent =
`${q.name} ${q.price} (${q.changePct}%)`;
});
marketOpen 欄位可判斷。