Deprem uyarılarını kendi sunucumda işlemek için kullandığım küçük araç
这篇内容暂时只有 Türkçe 版本,以下是原文。
Kandilli’nin ve AFAD’ın son deprem listelerini günde birkaç kez elle kontrol etmek yerine, kendi makinemde çalışan küçük bir betikle topluyorum. Ortam: Ubuntu 22.04, Python 3.10, harici bağımlılık yok. Veri hacmi küçük; ayda ~3-5 bin satır, yani SQLite fazlasıyla yeterli. Amaç büyük bir sistem kurmak değil, “son 24 saatte ne oldu, bana yakın mı” sorusuna hızlı cevap vermek.
Önce JSON çıktısını çekip şemayı sabitliyorum; alan adları değişirse betik sessizce boş liste döndürmesin diye zorunlu alanları kontrol ediyorum:
import json, sqlite3, urllib.request, datetime
URL = "https://api.orhanaydogdu.com.tr/deprem/kandilli/live"
REQ = {"date": str, "mag": float, "lat": float, "lng": float, "depth": float}
def fetch():
with urllib.request.urlopen(URL, timeout=20) as r:
data = json.load(r)
rows = []
for e in data.get("result", []):
if any(e.get(k) is None for k in REQ):
continue
rows.append((e["date"], float(e["mag"]), float(e["lat"]),
float(e["lng"]), float(e["depth"])))
return rows
def store(rows):
con = sqlite3.connect("deprem.db")
con.execute("""CREATE TABLE IF NOT EXISTS q(
date TEXT PRIMARY KEY, mag REAL, lat REAL, lng REAL, depth REAL)""")
con.executemany("INSERT OR IGNORE INTO q VALUES (?,?,?,?,?)", rows)
con.commit()
return con.total_changes
Kaydettikten sonra konumumu referans alıp kaba bir mesafe filtresi uyguluyorum. Deprem büyüklüğü logaritmik olduğu için “M4 ve üstü, 150 km içinde” gibi tek bir eşik kullanmıyorum; iki eşiği ayrı ayrı tutuyorum:
def yakin(con, lat=41.0, lng=29.0, max_km=150, min_mag=3.5):
import math
q = con.execute("SELECT date,mag,lat,lng FROM q").fetchall()
for d,m,la,lo in q:
dy = (la-lat)*111
dx = (lo-lng)*111*math.cos(math.radians(lat))
km = math.hypot(dx,dy)
if km <= max_km and m >= min_mag:
print(f"{d} M{m} ~{km:.0f} km")
Neden böyle: API’yi her açılışta çağırmak yerine yerel tabloya yazıyorum, böylece ağ kesildiğinde de geçmişe bakabiliyorum. PRIMARY KEY olarak tarih stringini kullanmak, aynı kaydın iki kez girmesini engelliyor. Mesafeyi düzlemsel yaklaşımla hesaplıyorum; 150 km ölçeğinde hata birkaç km’yi geçmiyor, jeodezik kütüphane kurmaya değmiyor. Alan doğrulamasını da bilerek sert tuttum: eksik alanlı kayıtları atıyorum, çünkü bir kez mag: null yüzünden tüm liste bozulmuştu ve fark etmem bir gün sürmüştü.
Nerede işe yaramıyor: bu betik resmi bir uyarı sistemi değil, sadece listeyi düzenli tutuyor. Şema değişirse fetch boş liste döndürür ve “deprem yok” sanırım; bu yüzden total_changes == 0 durumunu loglamak gerekiyor, bunu eklemedim ve bir kez yanlış rahatladım. Ayrıca “son 24 saat” filtresi saat dilimi kaymasına açık; tarih stringini olduğu gibi saklıyorum, dönüştürme yapmıyorum.
Sizin elinizde benzer bir toplayıcı varsa, şema değişimini nasıl yakalıyorsunuz — alan sayısı mı kontrol ediyorsunuz, yoksa şema sürümü mü tutuyorsunuz?
0 条评论
还没有评论,写下第一条。