LINE-ROBOT / usgs_service.py
cwadayi's picture
Upload 8 files
4804f0f verified
raw
history blame
2.88 kB
# usgs_service.py
import requests
import pandas as pd
from datetime import datetime, timedelta, timezone
from config import USGS_API_BASE_URL, CURRENT_YEAR
def _iso(dt: datetime) -> str:
"""ε°‡ datetime η‰©δ»Άζ ΌεΌεŒ–η‚Ί USGS API ιœ€θ¦ηš„ ISO 8601 字串。"""
return dt.astimezone(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S")
def fetch_global_last24h_text(min_mag: float = 5.0, limit: int = 10) -> str:
"""從 USGS ζ“·ε–ιŽεŽ» 24 ε°ζ™‚ηš„ε…¨ηƒι‘―θ‘—εœ°ιœ‡γ€‚"""
now_utc = datetime.now(timezone.utc)
since = now_utc - timedelta(hours=24)
params = {
"format": "geojson",
"starttime": _iso(since),
"endtime": _iso(now_utc),
"minmagnitude": float(min_mag),
"limit": int(limit),
"orderby": "time",
}
try:
r = requests.get(USGS_API_BASE_URL, params=params, timeout=15)
r.raise_for_status()
features = r.json().get("features", [])
if not features:
return f"βœ… 過去 24 ε°ζ™‚ε…§οΌŒε…¨ηƒη„‘θ¦ζ¨‘ {min_mag} δ»₯δΈŠηš„ι‘―θ‘—εœ°ιœ‡γ€‚"
lines = [f"🚨 θΏ‘ 24 ε°ζ™‚ε…¨ηƒι‘―θ‘—εœ°ιœ‡ (Mβ‰₯{min_mag}):", "-" * 20]
for f in features:
p = f["properties"]
t_utc = datetime.fromtimestamp(p["time"] / 1000, tz=timezone.utc)
lines.append(f"ιœ‡η΄š: {p['mag']:.1f} | ζ—₯ζœŸζ™‚ι–“: {t_utc.strftime('%Y-%m-%d %H:%M')} (UTC)\n地點: {p.get('place','')}")
return "\n\n".join(lines)
except Exception as e:
return f"❌ ζŸ₯θ©’ε€±ζ•—: {e}"
def fetch_taiwan_df_this_year(min_mag: float = 5.0) -> pd.DataFrame | str:
"""ζ“·ε–δ»ŠεΉ΄δ»₯δΎ†ε°η£ε€εŸŸηš„ι‘―θ‘—εœ°ιœ‡γ€‚"""
now_utc = datetime.now(timezone.utc)
start_of_year_utc = datetime(now_utc.year, 1, 1, tzinfo=timezone.utc)
params = {
"format": "geojson", "starttime": _iso(start_of_year_utc), "endtime": _iso(now_utc),
"minmagnitude": float(min_mag),
"minlatitude": 21, "maxlatitude": 26,
"minlongitude": 119, "maxlongitude": 123,
"limit": 250, "orderby": "time",
}
try:
r = requests.get(USGS_API_BASE_URL, params=params, timeout=20)
r.raise_for_status()
features = r.json().get("features", [])
if not features:
return f"βœ… 今年 ({CURRENT_YEAR} εΉ΄) δ»₯δΎ†οΌŒε°η£ε€εŸŸη„‘ Mβ‰₯{min_mag:.1f} ηš„ι‘―θ‘—εœ°ιœ‡γ€‚"
rows = []
for f in features:
p = f["properties"]
lon, lat, *_ = f["geometry"]["coordinates"]
rows.append({
"latitude": lat, "longitude": lon, "magnitude": p["mag"],
"place": p.get("place", ""), "time_utc": datetime.fromtimestamp(p["time"]/1000, tz=timezone.utc)
})
return pd.DataFrame(rows)
except Exception as e:
return f"❌ ζŸ₯θ©’ε€±ζ•—: {e}"