第一次呼叫,零依賴
標準庫以外咩都唔使。一次呼叫用 urllib.request 就搞掂:
python · standard librarycopy
import json
from decimal import Decimal
import urllib.request
url = "https://api.exchangerate.dev/v1/latest/USD?symbols=EUR,GBP"
with urllib.request.urlopen(url, timeout=10) as response:
data = json.load(response, parse_float=Decimal)
print(data["rates"]["EUR"])
print(data["sources"]["EUR"], data["effective_at"]["EUR"])
print(data["market_session"])呢段代碼唔使 key 都行到。匿名呼叫按 IP 地址設上限,所以超過簡單測試就應該攞個免費 key。
用 requests 加 API key
大部分項目本身已經用緊 requests。將 key 以 bearer token 傳送:
python · requestscopy
# Install first: python -m pip install requests
import os
from decimal import Decimal
import requests
response = requests.get(
"https://api.exchangerate.dev/v1/latest/USD",
headers={"Authorization": f"Bearer {os.environ['EXCHANGERATE_API_KEY']}"},
timeout=10,
allow_redirects=False,
)
if response.status_code == 429:
raise RuntimeError(f"Rate limited; Retry-After: {response.headers.get('Retry-After')}")
if 300 <= response.status_code < 400:
raise RuntimeError("Unexpected redirect")
response.raise_for_status()
data = response.json(parse_float=Decimal)
print(data["rates"]["GBP"], data["effective_at"]["GBP"])免費 key 將上限提升到每月 10,000 次呼叫、每分鐘 12 次請求。設定唔到 Authorization 嘅平台可以用 X-API-Key 標頭。
換算一個金額
如果要嘅係換算而唔係成個匯率表,就呼叫 /v1/convert。匯率同換算結果一齊返回:
python · convert 100 USD to EURcopy
import os
from decimal import Decimal
import requests
response = requests.get(
"https://api.exchangerate.dev/v1/convert/USD/EUR/100",
headers={"Authorization": f"Bearer {os.environ['EXCHANGERATE_API_KEY']}"},
timeout=10,
allow_redirects=False,
)
if not 200 <= response.status_code < 300:
raise RuntimeError(f"HTTP {response.status_code}; Retry-After: {response.headers.get('Retry-After')}")
data = response.json(parse_float=Decimal)
print(data["rate"], data["converted"])知道匯率有幾新
請用 sources[currency] 查看所顯示貨幣的資料來源類別,並用 effective_at[currency] 查看觀測時間。source 概括整個回應中更新頻率最低的資料。market_session 表示市場交易時段;timestamp 是回應產生時間,並非匯率觀測時間。
欄位值意思幾時郁
source: live綜合現貨共識值交易週日內(約 60 秒一次)
source: ecb_daily官方參考定盤價每個工作日一次
market_session: weekend星期六或者星期日(銀行同業休市)參考定盤價維持星期五數值;即時數據暫停更新
指示性,唔可以用嚟結算
匯率係為參考、分析同顯示而發佈,唔係交易報價,唔應該用嚟結算交易。每個回應嘅 notice 欄位都帶住呢句話。
讀過去某一日
將日期放入路徑,就可以查詢遠至 1999 年嘅任何一日。回應會多一個 is_forward_filled 欄位,如果嗰日冇發佈匯率(例如週末或者假期)就係 true:
python · rate on a past datecopy
import os
from decimal import Decimal
import requests
response = requests.get(
"https://api.exchangerate.dev/v1/2026-03-14/USD?symbols=JPY",
headers={"Authorization": f"Bearer {os.environ['EXCHANGERATE_API_KEY']}"},
timeout=10,
allow_redirects=False,
)
if not 200 <= response.status_code < 300:
raise RuntimeError(f"HTTP {response.status_code}; Retry-After: {response.headers.get('Retry-After')}")
data = response.json(parse_float=Decimal)
print(data["rates"]["JPY"], data["is_forward_filled"])想一次呼叫攞成個日期範圍嘅序列,就用 /v1/range 加 start_date 同 end_date。另有一篇指南詳細講。