Hướng dẫnLập trình

Giá vàng trực tiếp trong Python

Gọi API goldprice.dev từ Python bằng requests, tính toán với Decimal, thử lại khi gặp 429 và lưu đệm TTL 60 giây.

27 thg 4, 2026 · 4 phút đọc

Để lấy giá vàng trực tiếp trong Python, dùng requests gửi GET tới api.goldprice.dev/v1/spot/XAU-USD-SPOT, đặt khóa API trong header X-API-Key. Dùng cachetools.TTLCache lưu đệm 60 giây và Decimal tính giá. Gói miễn phí có 5.000 lượt/tháng, không cần thẻ tín dụng. Đã kiểm thử tháng Mười 2026 với Python 3.15 + requests 2.34.

Lấy khóa API goldprice.dev

Đăng ký tài khoản miễn phí tại goldprice.dev/onboarding. Sau khi xác nhận email, bảng điều khiển hiển thị khóa bắt đầu bằng ga_live_. Đặt khóa làm biến môi trường:

Shell
export GOLDPRICE_API_KEY=ga_live_replace_with_your_key_here

Gói miễn phí có 5.000 lượt/tháng và giá vàng giao ngay theo 31 tiền tệ. Không cần thẻ tín dụng.

Cài các thư viện cần thiết

Bạn cần ba gói: requests để gọi HTTP, cachetools để lưu đệm TTL trong tiến trình và tenacity để thử lại khi gặp 429. Cài bằng pip hoặc uv:

shell
# pippip install requests cachetools tenacity# or uv (recommended)uv add requests cachetools tenacity

Viết trình khách goldprice

Lưu mã thành goldprice.py. Hàm spot() lưu đệm từng mã trong 60 giây, thử lại tối đa 3 lần khi gặp 429 với thời gian chờ tăng theo cấp số nhân, trả giá dạng Decimal để phép tính sau đó không sai lệch do số thực dấu phẩy động.

goldprice.py
# python: goldprice.py# curl-equivalent: https://api.goldprice.dev/v1/spot/XAU-USD-SPOTimport osfrom decimal import Decimalfrom typing import TypedDictimport requestsfrom cachetools import TTLCache, cachedfrom tenacity import (    retry,    retry_if_exception_type,    stop_after_attempt,    wait_exponential,)API_BASE = "https://api.goldprice.dev"API_KEY = os.environ["GOLDPRICE_API_KEY"]TIMEOUT = 5  # secondsclass SpotResponse(TypedDict):    symbol: str    quote_currency: str    price: Decimal    bid: Decimal | None  # only on plans that include bid and ask    ask: Decimal | None    is_stale: bool    computed_at: strclass RateLimited(Exception):    """Raised on HTTP 429 so tenacity retries with backoff."""@cached(cache=TTLCache(maxsize=128, ttl=60))@retry(    retry=retry_if_exception_type(RateLimited),    wait=wait_exponential(multiplier=1, min=2, max=30),    stop=stop_after_attempt(3),    reraise=True,)def spot(symbol: str = "XAU-USD-SPOT") -> SpotResponse:    """Fetch live spot price. Cached 60s per symbol, retries 3x on 429."""    resp = requests.get(        f"{API_BASE}/v1/spot/{symbol}",        headers={"X-API-Key": API_KEY},        timeout=TIMEOUT,    )    if resp.status_code == 429:        raise RateLimited(resp.text)    resp.raise_for_status()    data = resp.json()    return {        "symbol": data["symbol"],        "quote_currency": data["quote_currency"],        "price": Decimal(data["price"]),        "bid": Decimal(data["bid"]) if data.get("bid") else None,        "ask": Decimal(data["ask"]) if data.get("ask") else None,        "is_stale": data["is_stale"],        "computed_at": data["computed_at"],    }if __name__ == "__main__":    r = spot("XAU-USD-SPOT")    print(f"{r['symbol']}-{r['quote_currency']}: {r['price']} (computed {r['computed_at']})")

Chạy mã

Chạy tệp trong shell đã đặt GOLDPRICE_API_KEY. Lần đầu gọi API; các lần trong 60 giây trả ngay giá đã lưu đệm. Chạy lại bằng tiến trình mới sẽ không dùng được bộ nhớ đệm cũ vì nó chỉ tồn tại trong tiến trình. Dùng Redis nếu cần chia sẻ bộ nhớ đệm giữa các tiến trình.

shell
python goldprice.py# XAU-USD: 4012.75 (computed 2026-10-23T07:00:18.221118+00:00)

Đổi tiền tệ hoặc kim loại

Mã có dạng METAL-CURRENCY-SPOT. Truyền mã thuộc 31 tiền tệ giao ngay vào spot(). Mỗi mã lưu đệm riêng trong TTLCache. Bảng tổng quan lấy 5 mã mỗi 60s gửi 5 lượt gọi API/phút khi không trúng bộ nhớ đệm và 0 lượt khi trúng.

goldprice.py · Đa tiền tệ
# USD spot, defaultspot("XAU-USD-SPOT")spot("XAU-INR-SPOT")spot("XAU-EUR-SPOT")# Silver in USDspot("XAG-USD-SPOT")

Kết quả mong đợi

JSON
{  "symbol": "XAU",  "quote_currency": "USD",  "unit": "troy_ounce",  "contract_type": "spot",  "price": "4012.75",  "is_stale": false,  "computed_at": "2026-10-23T07:00:18.221118+00:00"}

Stdout hiện một dòng: symbol, quote_currency, price dạng Decimal và dấu thời gian computed_at theo ISO 8601. Mã xử lý tiếp theo dùng phản hồi TypedDict này.

Lỗi thường gặp

MãBiểu hiệnCách sửa
401requests.exceptions.HTTPError: 401 Client ErrorThiếu khóa API hoặc khóa sai. Kiểm tra GOLDPRICE_API_KEY bằng echo $GOLDPRICE_API_KEY. Nếu trống, đặt lại khóa từ bảng điều khiển. Trình khách báo thiếu biến khi nhập mô-đun, không đợi lúc gọi hàm, nên lỗi xuất hiện ngay lần đầu import goldprice.
429Ba lần thử lại RateLimited sau thời gian chờ đều thất bại, rồi lỗi được ném ra ngoàiBạn đã hết hạn mức mỗi phút. Bộ nhớ đệm 60 giây ngăn lỗi khi lấy giá đều đặn; nếu nhiều mã khác nhau được gọi cùng lúc, tăng TTLCache.maxsize hoặc giãn các lần gọi. Nếu cần lượng gọi lớn liên tục, xem gói trả phí tại /pricing.
N/ASai số float tích lũy khi cộng nhiều giáLuôn tính bằng Decimal, không dùng float. Trình khách trả giá dạng Decimal; khi chuyển sang JSON, dùng str(price) thay cho ép sang float để giữ độ chính xác khi truyền dữ liệu.

Làm thêm

  • Lưu đệm qua nhiều tiến trình: thay TTLCache bằng bộ nhớ đệm Redis để nhiều worker dùng chung giá trong bộ nhớ
  • Thêm hàm bọc bars() cho /v1/bars?symbol=XAU-USD-SPOT&interval=1d&from=...&to=..., chuyển sang pandas DataFrame để kiểm thử chiến lược
  • Đổi requests sang httpx.AsyncClient nếu dịch vụ dùng xử lý bất đồng bộ; cấu trúc phản hồi giữ nguyên
  • Gắn trình khách vào endpoint FastAPI để các dịch vụ không dùng Python gọi nội bộ
  • Xuất chỉ số Prometheus về tỷ lệ trúng bộ nhớ đệm, độ trễ p50/p95 và số lần thử lại do 429

Câu hỏi

Giá cập nhật bao lâu một lần?

Endpoint giao ngay cập nhật mỗi 60 giây. Giá Free hoặc không dùng khóa trễ 15 phút; gói trả phí nhận giá trực tiếp. TTLCache ở trên theo nhịp này: gọi spot() nhiều lần trong 60s sẽ trả Decimal đã lưu đệm, không gửi thêm yêu cầu HTTP.

Tự làm mới có nằm trong hạn mức Free không?

Tùy tần suất gọi. Bot gọi mỗi phút = 1.440 lượt/ngày = ~43.000/tháng, vượt Free 5.000/tháng. Tận dụng bộ nhớ đệm, chỉ gọi khi cần. Gọi đều 1 lượt/giờ = 720/tháng, nằm trong Free. Nếu cần lượng gọi lớn liên tục, xem gói trả phí tại /pricing.

Tôi có thể dùng cho mục đích thương mại không?

Mọi gói đều cho phép sử dụng thương mại. Gói trả phí không cần liên kết ghi công; Free yêu cầu liên kết hiển thị rõ tới goldprice.dev gần phần giá.

Vì sao dùng Decimal thay cho float?

Decimal giữ phép tính chính xác. Float gây sai số khi cộng: 0.1 + 0.2 == 0.30000000000000004. Cộng hàng nghìn giao dịch bằng float có thể tích lũy sai số ở mức điểm cơ bản. API trả giá dạng chuỗi với 2 chữ số thập phân, như "4012.75", để trình khách có thể dùng Decimal tính toán.

Hỗ trợ những kim loại nào?

Hỗ trợ vàng (XAU), bạc (XAG) và đồng (HG). Không gói nào hỗ trợ bạch kim và palladium. Đổi mã kim loại trong mã giao dịch, ví dụ spot("XAG-USD-SPOT").

Gói Free có thực sự miễn phí không?

Có. Bạn được 5.000 lượt gọi mỗi tháng, không cần thẻ tín dụng và không có ngày hết hạn. Lấy khóa API miễn phí tại /onboarding.

Tôi có thể nhờ Claude viết mã này không?

Có. Mở Claude Desktop đã cài MCP server goldprice.dev, yêu cầu: Tạo trình khách Python cho /v1/spot của goldprice.dev. Dùng requests, Decimal, cachetools TTLCache 60 giây, tenacity thử lại khi gặp 429, tăng thời gian chờ theo cấp số nhân. Đọc khóa từ GOLDPRICE_API_KEY. MCP cung cấp schema hiện hành, giúp Claude dùng đúng tên trường ngay lần đầu.

Đọc tiếp

Bắt đầu với khóa API miễn phí

5.000 yêu cầu mỗi tháng trên gói miễn phí. Không cần thẻ tín dụng.

Lấy khóa miễn phí