From 4fa9c464ad05ca762eff86df7656c4f626ecbb07 Mon Sep 17 00:00:00 2001 From: TTigger Date: Mon, 13 Jul 2026 22:09:04 +0800 Subject: [PATCH] =?UTF-8?q?feat(fuel):=20=E4=B8=AD=E6=B2=B9=E6=B2=B9?= =?UTF-8?q?=E5=83=B9=EF=BC=88stage=20C=20item=203=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 政府 API 生活工具第一發:中油今日牌價+加油試算。第三支 serverless function。 - 資料源:中油官網 GetOilPriceJson.aspx?type=TodayOilPriceString (免金鑰 JSON;sPrice1~6 對應抄自中油首頁 widget JS: 92/95/98 無鉛、酒精汽油、超級柴油、車用液化石油氣)。 - src/lib/fuelPrice.ts:回應正規化(TDD 4 tests)——價格轉數字、 UpOrDown_Html 一律拆成純文字(前端不做 innerHTML,不透傳外部 HTML)、 中油更新中回空字串時整包判 null。 - api/fuel-price.ts:固定網址、無使用者輸入(無 SSRF 面), CDN 快取 s-maxage=1800 + SWR 一天(牌價每週一調)。 - src/tools/FuelPrice.tsx:六格牌價卡、本週調價訊息、生效日, 加油試算(油品×公升⇄金額雙向);中英頁面、tools.ts 註冊(⛽)。 - e2e:stub API,涵蓋牌價顯示、試算雙向與換油品重算、掛掉重試(+2)。 - OG 卡 72 張(守門測試同步),新卡已目測。 測試:typecheck:api ✓ / 541 unit ✓(+4)/ 62 e2e ✓(+2) 合併後需立即驗 production /api/fuel-price(preview 在 SSO 後面)。 Co-Authored-By: Claude Fable 5 --- api/fuel-price.ts | 38 +++++++ e2e/fuel-price.spec.ts | 49 +++++++++ public/og/en/fuel-price.png | Bin 0 -> 39618 bytes public/og/zh/fuel-price.png | Bin 0 -> 37210 bytes src/data/tools.ts | 1 + src/lib/__tests__/fuelPrice.test.ts | 49 +++++++++ src/lib/fuelPrice.ts | 58 ++++++++++ src/pages/en/tools/fuel-price.astro | 12 +++ src/pages/tools/fuel-price.astro | 9 ++ src/tools/FuelPrice.tsx | 158 ++++++++++++++++++++++++++++ 10 files changed, 374 insertions(+) create mode 100644 api/fuel-price.ts create mode 100644 e2e/fuel-price.spec.ts create mode 100644 public/og/en/fuel-price.png create mode 100644 public/og/zh/fuel-price.png create mode 100644 src/lib/__tests__/fuelPrice.test.ts create mode 100644 src/lib/fuelPrice.ts create mode 100644 src/pages/en/tools/fuel-price.astro create mode 100644 src/pages/tools/fuel-price.astro create mode 100644 src/tools/FuelPrice.tsx diff --git a/api/fuel-price.ts b/api/fuel-price.ts new file mode 100644 index 0000000..19d1f5c --- /dev/null +++ b/api/fuel-price.ts @@ -0,0 +1,38 @@ +import type { VercelRequest, VercelResponse } from '@vercel/node'; +// 副檔名不可省:Vercel 以 nodenext 解析 api/,省略會編譯失敗(見 api/tsconfig.json) +import { parseCpcOilJson } from '../src/lib/fuelPrice.js'; + +// 中油今日牌價代理:固定網址、免金鑰、無使用者輸入(無 SSRF 面),不儲存任何資料。 +// 牌價每週一調整,CDN 快取 30 分鐘足夠即時,也不騷擾中油伺服器。 + +const SOURCE = 'https://www.cpc.com.tw/GetOilPriceJson.aspx?type=TodayOilPriceString'; +const TIMEOUT_MS = 8000; +const UA = 'Mozilla/5.0 (compatible; TigletBot/1.0; +https://tiglet.vercel.app)'; + +export default async function handler(_req: VercelRequest, res: VercelResponse) { + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), TIMEOUT_MS); + let raw: string; + try { + const response = await fetch(SOURCE, { signal: controller.signal, headers: { 'User-Agent': UA, Accept: 'application/json,text/plain' } }); + if (!response.ok) { + res.setHeader('Cache-Control', 'no-store'); + return res.status(502).json({ error: 'fetch-failed', status: response.status }); + } + raw = await response.text(); + } catch { + res.setHeader('Cache-Control', 'no-store'); + return res.status(502).json({ error: 'fetch-failed' }); + } finally { + clearTimeout(timer); + } + + const info = parseCpcOilJson(raw); + if (!info) { + res.setHeader('Cache-Control', 'no-store'); + return res.status(502).json({ error: 'parse-failed' }); + } + + res.setHeader('Cache-Control', 'public, s-maxage=1800, stale-while-revalidate=86400'); + return res.status(200).json(info); +} diff --git a/e2e/fuel-price.spec.ts b/e2e/fuel-price.spec.ts new file mode 100644 index 0000000..8d0a14f --- /dev/null +++ b/e2e/fuel-price.spec.ts @@ -0,0 +1,49 @@ +import { test, expect } from '@playwright/test'; +import { waitForIslands } from './helpers'; + +const INFO = { + updated: '7月13日', + lpgDate: '115年4月2日', + trend: '本週汽油價格 不調整', + prices: { gas92: 29.8, gas95: 31.3, gas98: 33.3, alcohol: 31.3, diesel: 28.8, lpg: 16.3 }, +}; + +test('牌價上桌、調價訊息顯示、加油試算雙向換算', async ({ page }) => { + await page.route('**/api/fuel-price', (route) => + route.fulfill({ status: 200, contentType: 'application/json', body: JSON.stringify(INFO) }) + ); + await page.goto('/tools/fuel-price'); + await waitForIslands(page); + + await expect(page.getByRole('list').getByText('95 無鉛')).toBeVisible(); + await expect(page.getByText('31.3').first()).toBeVisible(); + await expect(page.getByRole('status')).toContainText('本週汽油價格 不調整'); + await expect(page.getByText('價格生效日:7月13日')).toBeVisible(); + + // 預設 95 無鉛 40 公升 → 1252 元 + await expect(page.getByLabel('金額(元)')).toHaveValue('1252'); + // 改公升 → 金額跟著動 + await page.getByLabel('公升數').fill('10'); + await expect(page.getByLabel('金額(元)')).toHaveValue('313'); + // 反向:改金額 → 公升跟著動 + await page.getByLabel('金額(元)').fill('626'); + await expect(page.getByLabel('公升數')).toHaveValue('20'); + // 換油品 → 用新單價重算 + await page.getByLabel('油品').selectOption('gas92'); + await expect(page.getByLabel('金額(元)')).toHaveValue('596'); +}); + +test('API 掛掉顯示錯誤並可重試', async ({ page }) => { + let calls = 0; + await page.route('**/api/fuel-price', (route) => { + calls += 1; + if (calls === 1) return route.fulfill({ status: 502, contentType: 'application/json', body: '{"error":"fetch-failed"}' }); + return route.fulfill({ status: 200, contentType: 'application/json', body: JSON.stringify(INFO) }); + }); + await page.goto('/tools/fuel-price'); + await waitForIslands(page); + + await expect(page.getByText('牌價取得失敗,請稍後再試。')).toBeVisible(); + await page.getByRole('button', { name: '重試' }).click(); + await expect(page.getByRole('list').getByText('95 無鉛')).toBeVisible(); +}); diff --git a/public/og/en/fuel-price.png b/public/og/en/fuel-price.png new file mode 100644 index 0000000000000000000000000000000000000000..d11de67a2907d42ca0616bf37c54466cc785ac1d GIT binary patch literal 39618 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 oO)TsS本週汽油價格不調整', + sPrice1: '29.8', + sPrice2: '31.3', + sPrice3: '33.3', + sPrice4: '31.3', + sPrice5: '28.8', + sPrice6: '16.3', + LPGdate: '115年4月2日', +}); + +describe('parseCpcOilJson', () => { + it('解析真實回應:六種油品、生效日、調價訊息(HTML 轉純文字)', () => { + const r = parseCpcOilJson(REAL)!; + expect(r.prices).toEqual({ gas92: 29.8, gas95: 31.3, gas98: 33.3, alcohol: 31.3, diesel: 28.8, lpg: 16.3 }); + expect(r.updated).toBe('7月13日'); + expect(r.lpgDate).toBe('115年4月2日'); + // 調價訊息絕不原樣輸出 HTML —— 前端不做 innerHTML,這裡就要拆成純文字 + expect(r.trend).toBe('本週汽油價格 不調整'); + expect(r.trend).not.toContain('<'); + }); + + it('漲跌訊息帶金額也解得出來', () => { + const raw = JSON.stringify({ + PriceUpdate: '7月20日', + UpOrDown_Html: '
本週汽油價格調漲0.1
', + sPrice1: '29.9', sPrice2: '31.4', sPrice3: '33.4', sPrice4: '31.4', sPrice5: '28.9', sPrice6: '16.3', + LPGdate: '115年4月2日', + }); + expect(parseCpcOilJson(raw)!.trend).toBe('本週汽油價格 調漲 0.1 元'); + }); + + it('中油更新中會回空字串價格 → null(官網 JS 也是這樣擋)', () => { + const raw = JSON.stringify({ PriceUpdate: '', UpOrDown_Html: '', sPrice1: '', sPrice2: '', sPrice3: '', sPrice4: '', sPrice5: '', sPrice6: '', LPGdate: '' }); + expect(parseCpcOilJson(raw)).toBeNull(); + }); + + it('非 JSON、缺欄位、非數字 → null', () => { + expect(parseCpcOilJson('not json')).toBeNull(); + expect(parseCpcOilJson('{}')).toBeNull(); + expect(parseCpcOilJson(JSON.stringify({ sPrice1: 'abc', sPrice2: '1', sPrice3: '1', sPrice4: '1', sPrice5: '1', sPrice6: '1', PriceUpdate: 'x', UpOrDown_Html: '', LPGdate: '' }))).toBeNull(); + }); +}); diff --git a/src/lib/fuelPrice.ts b/src/lib/fuelPrice.ts new file mode 100644 index 0000000..5931782 --- /dev/null +++ b/src/lib/fuelPrice.ts @@ -0,0 +1,58 @@ +// 中油今日牌價:GetOilPriceJson.aspx 回應的解析與正規化。純函式, +// 由 api/fuel-price.ts 使用。sPrice1~6 的對應抄自中油官網首頁的 widget JS: +// 92無鉛 / 95無鉛 / 98無鉛 / 酒精汽油 / 超級柴油 / 車用液化石油氣。 + +export interface FuelPrices { + gas92: number; + gas95: number; + gas98: number; + alcohol: number; + diesel: number; + lpg: number; +} + +export interface FuelPriceInfo { + updated: string; // 價格生效日,如「7月13日」 + lpgDate: string; // 液化石油氣實施日(民國紀年) + trend: string; // 本週調價訊息(純文字,絕不透傳 HTML) + prices: FuelPrices; +} + +function toPrice(v: unknown): number | null { + if (typeof v !== 'string' || v.trim() === '') return null; + const n = Number(v); + return Number.isFinite(n) && n > 0 ? n : null; +} + +// 把中油的 UpOrDown_Html 拆成純文字:標籤界線補空格、收斂空白 +function stripHtml(html: string): string { + return html + .replace(/<[^>]*>/g, ' ') + .replace(/\s+/g, ' ') + .trim(); +} + +export function parseCpcOilJson(raw: string): FuelPriceInfo | null { + let data: Record; + try { + data = JSON.parse(raw); + } catch { + return null; + } + if (typeof data !== 'object' || data === null) return null; + + const gas92 = toPrice(data.sPrice1); + const gas95 = toPrice(data.sPrice2); + const gas98 = toPrice(data.sPrice3); + const alcohol = toPrice(data.sPrice4); + const diesel = toPrice(data.sPrice5); + const lpg = toPrice(data.sPrice6); + if (gas92 === null || gas95 === null || gas98 === null || alcohol === null || diesel === null || lpg === null) return null; + + return { + updated: typeof data.PriceUpdate === 'string' ? data.PriceUpdate : '', + lpgDate: typeof data.LPGdate === 'string' ? data.LPGdate : '', + trend: typeof data.UpOrDown_Html === 'string' ? stripHtml(data.UpOrDown_Html) : '', + prices: { gas92, gas95, gas98, alcohol, diesel, lpg }, + }; +} diff --git a/src/pages/en/tools/fuel-price.astro b/src/pages/en/tools/fuel-price.astro new file mode 100644 index 0000000..f4ac331 --- /dev/null +++ b/src/pages/en/tools/fuel-price.astro @@ -0,0 +1,12 @@ +--- +import BaseLayout from '../../../layouts/BaseLayout.astro'; +import FuelPrice from '../../../tools/FuelPrice.tsx'; +import { tools } from '../../../data/tools'; + +const tool = tools.find((t) => t.id === 'fuel-price')!; +--- + + ← All tools +

{tool.titleEn}

+ +
diff --git a/src/pages/tools/fuel-price.astro b/src/pages/tools/fuel-price.astro new file mode 100644 index 0000000..2c89578 --- /dev/null +++ b/src/pages/tools/fuel-price.astro @@ -0,0 +1,9 @@ +--- +import BaseLayout from '../../layouts/BaseLayout.astro'; +import FuelPrice from '../../tools/FuelPrice.tsx'; +--- + + ← 回到所有工具 +

中油油價

+ +
diff --git a/src/tools/FuelPrice.tsx b/src/tools/FuelPrice.tsx new file mode 100644 index 0000000..99f4848 --- /dev/null +++ b/src/tools/FuelPrice.tsx @@ -0,0 +1,158 @@ +import { useEffect, useState } from 'react'; +import type { FuelPriceInfo, FuelPrices } from '../lib/fuelPrice'; +import type { Locale } from '../lib/i18n'; + +const L = { + zh: { + loading: '正在取得中油今日牌價…', + loadError: '牌價取得失敗,請稍後再試。', + retry: '重試', + updated: (d: string) => `價格生效日:${d}`, + lpgNote: (d: string) => `液化石油氣為車用價格,自 ${d} 起實施`, + alcoholNote: '酒精汽油未扣除能源署優惠補助', + perLiter: '元/公升', + fuels: { gas92: '92 無鉛', gas95: '95 無鉛', gas98: '98 無鉛', alcohol: '酒精汽油', diesel: '超級柴油', lpg: '液化石油氣' } as Record, + calcTitle: '加油試算', + calcFuel: '油品', + calcLiters: '公升數', + calcAmount: '金額(元)', + calcHint: '輸入公升數或金額,另一邊會自動換算。', + sourceNote: '資料來源:台灣中油公司牌價。實際售價以各加油站公告為準。', + }, + en: { + loading: 'Fetching today’s CPC fuel prices…', + loadError: 'Could not load fuel prices. Please try again.', + retry: 'Retry', + updated: (d: string) => `Effective date: ${d}`, + lpgNote: (d: string) => `LPG is the vehicle price, effective from ${d}`, + alcoholNote: 'Alcohol gasoline price excludes the Energy Administration subsidy', + perLiter: 'NT$/L', + fuels: { gas92: '92 Unleaded', gas95: '95 Unleaded', gas98: '98 Unleaded', alcohol: 'Alcohol Gasoline', diesel: 'Premium Diesel', lpg: 'LPG (Autogas)' } as Record, + calcTitle: 'Fill-up calculator', + calcFuel: 'Fuel', + calcLiters: 'Liters', + calcAmount: 'Amount (NT$)', + calcHint: 'Type liters or an amount — the other side updates automatically.', + sourceNote: 'Source: CPC Corporation, Taiwan list prices. Actual pump prices may vary by station.', + }, +} as const; +type Dict = (typeof L)[Locale]; + +const FUEL_ORDER: (keyof FuelPrices)[] = ['gas92', 'gas95', 'gas98', 'alcohol', 'diesel', 'lpg']; + +const inputClass = + 'w-full rounded-lg border border-edge bg-surface px-3 py-2.5 font-mono tabular-nums text-ink outline-none transition-colors focus:border-accent'; + +function Calculator({ prices, t }: { prices: FuelPrices; t: Dict }) { + const [fuel, setFuel] = useState('gas95'); + const [liters, setLiters] = useState('40'); + const [amount, setAmount] = useState(() => String(Math.round(40 * prices.gas95))); + + const price = prices[fuel]; + + function fromLiters(v: string, f = fuel) { + setLiters(v); + const n = Number(v); + setAmount(v.trim() !== '' && Number.isFinite(n) && n >= 0 ? String(Math.round(n * prices[f] * 100) / 100) : ''); + } + function fromAmount(v: string) { + setAmount(v); + const n = Number(v); + setLiters(v.trim() !== '' && Number.isFinite(n) && n >= 0 ? String(Math.round((n / price) * 100) / 100) : ''); + } + + return ( +
+

{t.calcTitle}

+
+ + + +
+

{t.calcHint}

+
+ ); +} + +export default function FuelPrice({ locale = 'zh' }: { locale?: Locale }) { + const t = L[locale]; + const [info, setInfo] = useState(null); + const [failed, setFailed] = useState(false); + + async function load() { + setFailed(false); + setInfo(null); + try { + const res = await fetch('/api/fuel-price'); + if (!res.ok) throw new Error(); + const data = (await res.json()) as FuelPriceInfo; + if (!data.prices) throw new Error(); + setInfo(data); + } catch { + setFailed(true); + } + } + useEffect(() => { + load(); + }, []); + + if (failed) { + return ( +
+

{t.loadError}

+ +
+ ); + } + if (!info) return

{t.loading}

; + + return ( +
+
+ {info.trend &&

{info.trend}

} + {info.updated &&

{t.updated(info.updated)}

} +
+ +
    + {FUEL_ORDER.map((f) => ( +
  • +

    {t.fuels[f]}

    +

    {info.prices[f].toFixed(1)}

    +

    {t.perLiter}

    +
  • + ))} +
+ + + +
+ {info.lpgDate &&

{t.lpgNote(info.lpgDate)}

} +

{t.alcoholNote}

+

{t.sourceNote}

+
+
+ ); +}