Uyarı, iki HTTP yoklamasının zamanını değil yeni geçerli USD/IDR gözlemini önceki gözlemle karşılaştırmalıdır. İlk gözlem temel oluşturur; eski veri ve hatalar durumu değiştirmez.
- IDR için
sources["IDR"]veeffective_at["IDR"]kullanın; genel source tüm para birimlerinin muhafazakâr özetidir. - İlk geçerli gözlem temeldir. Eşik aşılınca bir kez uyarın, yalnızca geçerli veri tekrar eşik altına dönünce yeniden kurun.
- JSON’u geçici dosyaya yazın, 0600 yapın ve
os.replaceile değiştirin; kesinti yarım durum bırakmasın. - 10 saniye timeout,
EXCHANGERATE_API_KEYve en az60 saniye polling kullanın.429 sonrası durumu koruyupRetry-Aftersüresine uyun. - Tam scripti indirin, eşik ve durum yolunu repo dışında ayarlayın; yalnızca yerel konsola yazdırın.
Para birimi gözlemini modelleyin
IDR için sources["IDR"] ve effective_at["IDR"] kullanın; genel source tüm para birimlerinin muhafazakâr özetidir.
from decimal import Decimaldef idr_observation(payload: dict) -> dict: return { "rate": Decimal(str(payload["rates"]["IDR"])), "source": payload["sources"]["IDR"], "effective_at": payload["effective_at"]["IDR"], "market_session": payload["market_session"], }Aşım politikasını tanımlayın
İlk geçerli gözlem temeldir. Eşik aşılınca bir kez uyarın, yalnızca geçerli veri tekrar eşik altına dönünce yeniden kurun.
| Durum | Durum değişimi | Uyarı |
|---|---|---|
| İlk geçerli gözlem | Temeli kaydet | Hayır |
| Eşik altındaki gözlem | armed=true | Hayır |
| Armed iken eşik aşımı | armed=false | Bir |
| Tekrar/eski veri veya hata | Durumu koru | Hayır |
Durumu güvenle saklayın
JSON’u geçici dosyaya yazın, 0600 yapın ve os.replace ile değiştirin; kesinti yarım durum bırakmasın.
import jsonimport osimport tempfilefrom pathlib import Pathdef save_state(path: Path, state: dict) -> None: path.parent.mkdir(parents=True, exist_ok=True) fd, temporary = tempfile.mkstemp(prefix=f".{path.name}.", dir=path.parent, text=True) try: os.fchmod(fd, 0o600) with os.fdopen(fd, "w") as handle: json.dump(state, handle, sort_keys=True) handle.write("\n") os.replace(temporary, path) except Exception: try: os.unlink(temporary) except OSError: pass raiseAğ ve kotayı sınırlayın
10 saniye timeout, EXCHANGERATE_API_KEY ve en az60 saniye polling kullanın.429 sonrası durumu koruyup Retry-After süresine uyun. Varsayılan beş dakika aralık 30 günde yaklaşık 8.640 çağrı kullanır; 60 saniye yaklaşık 43.200 çağrıya çıkar ve ortak aylık kotayı aşabilir.
10 saniye timeout, EXCHANGERATE_API_KEY ve en az60 saniye polling kullanın.429 sonrası durumu koruyup Retry-After süresine uyun.
İzleyiciyi çalıştırın
Tam scripti indirin, eşik ve durum yolunu repo dışında ayarlayın; yalnızca yerel konsola yazdırın. Varsayılan maksimum veri yaşı bir saattir. Günlük referans veya kapalı piyasa kabul ediyorsanız FX_ALERT_MAX_AGE_SECONDS ayarlayın. python-exchange-rate-alerts.py
chmod 700 python-exchange-rate-alerts.pyexport EXCHANGERATE_API_KEY="your-key"export FX_ALERT_THRESHOLD_PCT="1.0"export FX_ALERT_POLL_SECONDS="300"export FX_ALERT_STATE_PATH="$HOME/.local/state/fx-alert.json"python3 python-exchange-rate-alerts.pyPiyasayı beklemeden test edin
Baseline, crossing, tekrar eden timestamp, eski veri, rearm ve ikinci crossing durumlarını ağ mockuyla test edin.