Gayriresmi REST API servisidir. Meteorolojik veriler mgm.gov.tr adresinden çekilir.
docker compose up --buildDocker olmadan çalıştırmak veya buluta deploy etmek için detaylı yönergeleri docs/development.md dosyasında bulabilirsiniz.
mgm_client.py Flask veya bir HTTP sunucusuna ihtiyaç duymaz. Herhangi bir uygulamaya gömülüp çağırılabilir:
pip install . # sadece requests + tzdata kurulurfrom mgm_client import MGMWeather
mgm = MGMWeather() # sıfır yapılandırma, env değişkeni gerekmez
print(mgm.hava_durumu("İstanbul", "Kadıköy"))Redis ve tam sunucu bağımlılıkları isteğe bağlıdır:
pip install mgm-tr[redis] # cache ve rate limit için Redis desteği
pip install mgm-tr[sunucu] # app.py'yi çalıştırmak için tam sunucu bağımlılıkları
pip install mgm-tr[zamanlayici] # opsiyonel iç alert zamanlayıcısı (APScheduler)Hızlı test için:
python mgm_client.py İstanbul Kadıköycurl "[http://127.0.0.1:5000/hava-durumu/Istanbul?ilce=Bakirkoy](http://127.0.0.1:5000/hava-durumu/Istanbul?ilce=Bakirkoy)"Örnek Yanıt:
{
"basarili": true,
"veri": {
"il": "İSTANBUL",
"ilce": "Bakırköy",
"guncel": { "sicaklik": 29.4, "durum": "Açık" },
"tahmin": [
{ "tarih": "2026-08-14", "enDusuk": 23, "enYuksek": 31 }
],
"ayEvresi": "Yeni Ay"
}
}Not: URL parametrelerinde Türkçe karakter (ı, İ, ş, Ş, vb.) sorun yaratıyorsa standart ASCII karakterler kullanın (Örn:
Istanbul,Bakirkoy,Kadikoy).
Tüm endpoint'lerin detaylı şeması, parametreleri ve test arayüzü /docs içinde
| HTTP Metodu | Endpoint | Açıklama |
|---|---|---|
GET |
/hava-durumu/<il> |
İlin (ve ?ilce=) anlık durumu ve 5 günlük tahmini. |
GET |
/ara?q=... |
Hatalı/karmaşık girdi toleranslı akıllı arama. "kadikoy/istanbul" gibi metinleri çözer. |
GET |
/uyarilar?il=... |
MGM'nin aktif sarı/turuncu/kırmızı kodlu uyarı kartları. |
GET |
/konum?lat=...&lon=... |
Enlem ve boylam (GPS) koordinatlarına göre anlık veri. |
GET |
/hava-kalitesi/<il> |
Anlık hava kalitesi (PM10, PM2.5, NO2) ve UV indeksi. |
GET |
/gun-ay-bilgisi/<il> |
Gün doğumu/batımı ve yerel formülle hesaplanmış Ay Evresi. |
GET |
/polen/<il> |
Sezonluk polen ve alerji riski indeksi (çimen, zeytin, huş vb.). |
GET |
/deniz/<il>?lat=&lon= |
Deniz suyu sıcaklığı, dalga yüksekliği, periyodu ve yönü. |
GET |
/sondurum/en-dusuk-sicakliklar?tarih= |
Türkiye geneli gerçekleşen en düşük sıcaklıklar. |
GET |
/sondurum/en-yuksek-sicakliklar?tarih= |
Türkiye geneli gerçekleşen en yüksek sıcaklıklar. |
GET |
/sondurum/toplam-yagis?tarih= |
Türkiye geneli gerçekleşen toplam yağış (mm). |
GET |
/sondurum/kar-kalinliklari |
Türkiye geneli anlık kar yüksekliği (cm). |
GET |
/sondurum/son-gozlemler |
İl merkezlerinde anlık ölçüm (sıcaklık, nem, yağış, rüzgar, basınç, hadise). |
POST |
/toplu |
Tek istekte çoklu konum sorgusu ({"sorgular": ["istanbul", "bursa"]}). Paralel çalışır. |
POST |
/favoriler |
Yeni public liste_id, manage_token ve read_token tokenlar yalnızca bu yanıtta düz metin döner. |
POST/DELETE |
/favoriler/<liste_id> |
Authorization: Bearer <manage_token> ile favori ekleme veya silme. |
GET |
/favoriler/<liste_id> |
Authorization: Bearer <read_token> ile listedeki tüm favoriler için hava durumunu /toplu mantığıyla tek istekte döner. |
GET |
/favoriler/<liste_id>/liste |
Authorization: Bearer <read_token> ile hava durumunu çekmeden kayıtlı sorguları döner. |
POST |
/alerts/<liste_id> |
manage_token ile webhook bildirim kaydı ekler ({"tur", "il", "webhookUrl", "esik", "yon"}). |
DELETE |
/alerts/<liste_id>/<alert_id> |
manage_token ile kayıtlı bildirim kuralını siler. |
GET |
/alerts/<liste_id> |
read_token ile kayıtlı tüm bildirim kurallarını listeler. |
POST |
/api/v1/alerts/check |
Kayıtlı tüm bildirimleri değerlendirir, tetiklenenlere webhook gönderir. Authorization: Bearer <CRON_SECRET> gerekir. |
GET |
/map/geojson |
Harita kütüphaneleri (Leaflet/Mapbox) için 81 ilin sıcaklık verili GeoJSON çıktısı |
GET |
/don-uyarisi/<il> |
Tarımsal don ve kırağı riski değerlendirmesi |
GET |
/metrics |
Sistem performans takibi için Prometheus ölçümleri |
GET /hava-durumu/<il>: IP başına dakikada 60 istek.POST /toplu: IP başına dakikada 10 istek; en fazlaAPP_TOPLU_MAX_SORGUlokasyon.GET /map/geojson: IP başına dakikada 2 istek.GET /gecmis: IP başına dakikada 10 istek;startveendaralığı en fazla 31 gün.POST /alerts/<liste_id>: IP başına dakikada 10 istek.POST /webhook/test: IP başına dakikada 3 istek.- JSON body en fazla
APP_MAX_JSON_BODY_BYTES, yanıt en fazlaAPP_MAX_RESPONSE_BYTESbyte olabilir. - Webhook URL en fazla
APP_MAX_WEBHOOK_URL_LENGTHkarakter olabilir; liste başına alert sayısıAPP_ALERT_MAX_KAYITile sınırlıdır. - Depolama: REDIS_URL varsa sayaçlar Redis'te tutulur, tüm instance'lar paylaşır; Redis sayacı atomik Lua script ile artırılır.
- Proxy arkasında çalışıyorsanız yalnızca kendi proxy ağlarınızı
APP_TRUSTED_PROXY_CIDRSile tanımlayın. Boş bırakılırsaX-Forwarded-Foryok sayılır.
liste_idpublic/read identifier'dır; değişiklik içinmanage_token, okuma içinread_tokengerekir.- Limit: Liste başına en fazla 30 kayıt (APP_FAVORI_MAX_KAYIT).
- Toplu okuma:
GET /favoriler/<liste_id>, tüm sorgular için/toplumantığıyla hava durumunu döner.
Belirli hava durumu olayları gerçekleştiğinde (yağmur başlangıcı, ani sıcaklık düşüşü, fırtına veya resmi MGM uyarıları) kendi uygulamalarınıza otomatik Webhook bildirimleri gönderebilirsiniz.
- Esnek Kurallar: İster eşik bazlı (örn. rüzgar hızı 50km/s'yi geçerse sürekli bildir), ister olay bazlı (örn. yağmur başladığında veya durduğunda bir kez bildir) kurallar oluşturabilirsiniz.
- Üyeliksiz ve Pratik: Favori sistemindeki gibi kendi belirlediğiniz
liste_idile çalışır. Her liste için 30 farklı bildirim kuralı ekleyebilirsiniz. - Anında İletim: Koşullar sağlandığında, belirlediğiniz URL adresine konum, ölçüm ve zaman bilgilerini içeren net bir JSON paketi postalanır.
- Retry: Timeout, bağlantı hataları ve
408,425,429,5xxyanıtları sınırlı exponential backoff ile yeniden denenir.4xxyanıtlar yeniden denenmez. - Idempotency: Her olay
eventIdveIdempotency-Keytaşır. Alıcı aynı anahtarı daha önce işlediyse olayı tekrar uygulamamalıdır. - İmza:
APP_ALERT_WEBHOOK_SIGNING_SECRETtanımlıysaX-MGM-Alert-SignatureHMAC-SHA256 olarak gönderilir. İmzalanan veritimestamp + "." + raw_json_bodybiçimindedir; zaman damgasıX-MGM-Alert-Timestampheader'ındadır.
Sunucuyu yormamak adına uygulamanın içinde sürekli çalışan bir arka plan görevi yoktur. Bildirimleri kontrol edip göndermesi için sisteminizi dışarıdan düzenli olarak tetiklemeniz gerekir (Örn: Her 10 dakikada bir).
Linux Crontab veya GitHub Actions gibi ücretsiz servislerle otomatik yapılabilir:
Örnek GitHub Actions Görevi (.github/workflows/alert-check.yml):
on:
schedule:
- cron: "*/10 * * * *"
jobs:
check:
runs-on: ubuntu-latest
steps:
- run: |
curl -X POST -H "Authorization: Bearer ${{ secrets.CRON_SECRET }}" \
https://<sunucu-adresiniz>/api/v1/alerts/check