Initial commit
This commit is contained in:
@@ -0,0 +1,153 @@
|
||||
# iklim.co Python sandbox istemcileri
|
||||
|
||||
Bu klasör HMAC imzalı istek, otomatik login/refresh ve `.env` token saklama
|
||||
özelliklerini ortak bir istemci katmanında toplar. Geo alarm registration istemcisi
|
||||
bu ortak yapıyı kullanarak noktalı virgüllü CSV satırlarını sırayla işler.
|
||||
|
||||
## Dosyalar
|
||||
|
||||
- `common/`: tekrar kullanılabilir API, HMAC, retry ve authentication katmanı
|
||||
- `login.py`: manuel login komutu
|
||||
- `nowcast-geo-register.py`: CSV geo alarm registration istemcisi
|
||||
- `.env.example`: güvenli ortam değişkeni şablonu
|
||||
- `webhook.example.json`: dört webhook authentication seçeneğini içeren şablon
|
||||
- `nowcast-geo-alarm-filter.example.json`: ortak nowcast geo alarm filtreleri şablonu
|
||||
- `nowcast-geo-alarm-registrations.example.csv`: CSV şablonu
|
||||
|
||||
Gerçek değerler için `.env`, `webhook.json` ve
|
||||
`nowcast-geo-alarm-filter.json` kullanılır. `.env` ile `webhook.json` kaynak kod
|
||||
deposuna eklenmemelidir.
|
||||
|
||||
## Kurulum
|
||||
|
||||
```bash
|
||||
cd iklim-sandbox
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate
|
||||
python -m pip install -r requirements.txt
|
||||
```
|
||||
|
||||
Yeni kurulumda şablonları kopyalayın ve gerçek değerlerle düzenleyin:
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
cp webhook.example.json webhook.json
|
||||
cp nowcast-geo-alarm-filter.example.json nowcast-geo-alarm-filter.json
|
||||
cp nowcast-geo-alarm-registrations.example.csv nowcast-geo-alarm-registrations.csv
|
||||
```
|
||||
|
||||
## CSV biçimi
|
||||
|
||||
Girdi UTF-8 ve noktalı virgül ayracına sahip olmalıdır:
|
||||
|
||||
```csv
|
||||
city;district;recipientId
|
||||
Ankara;Çankaya;recipient-001
|
||||
İstanbul;Kadıköy;recipient-002
|
||||
```
|
||||
|
||||
Script aynı dosyaya şu üç sonuç sütununu ekler veya mevcut değerlerini günceller:
|
||||
|
||||
```csv
|
||||
city;district;recipientId;status;httpStatus;registrationId
|
||||
Ankara;Çankaya;recipient-001;SUCCESS;HTTP_200;f7587d9e-2481-4b4c-818d-c8d1946851b7
|
||||
```
|
||||
|
||||
- İl ve ilçe adları trim edilip Türkçe büyük/küçük harf kurallarıyla kesin eşleştirilir.
|
||||
- Bulunamayan konumlar `FAILED;NOT_SENT;` olarak kaydedilir.
|
||||
- Daha önce `SUCCESS` olmuş satırlar konsola bilgi yazılarak atlanır.
|
||||
- Her satırdan sonra CSV aynı dizinde geçici dosyayla atomik olarak güncellenir.
|
||||
- `recipientId` boş olamaz ve US-ASCII karakterlerinden oluşmalıdır.
|
||||
|
||||
## İl ve ilçe sorgu cache'i
|
||||
|
||||
Şehir listesi her script çalıştırmasında yalnızca bir kez API'den alınır ve isim-ID
|
||||
eşleştirmesi bellekte tutulur. İlçe listesi de her benzersiz şehir için yalnızca ilk
|
||||
karşılaşmada alınır; aynı şehirdeki sonraki CSV satırlarında bellekteki sonuç
|
||||
kullanılır. Cache diske yazılmaz ve script kapandığında temizlenir.
|
||||
|
||||
## Webhook yapılandırması
|
||||
|
||||
`webhook.json` içindeki `authentication.selected` şu değerlerden biri olmalıdır:
|
||||
|
||||
- `BASIC`
|
||||
- `JWT_TOKEN`
|
||||
- `API_KEY`
|
||||
- `HMAC_SIGNATURE`
|
||||
|
||||
Yalnızca seçilen seçeneğin `options` altındaki alanları API'ye gönderilir. İlk
|
||||
initialization isteğinde tam webhook config gönderilir ve `accountId` kesinlikle
|
||||
gönderilmez. İlk başarılı kayıttan sonra `.env` içindeki
|
||||
`IKLIM_WEBHOOK_INITIALIZED=true` yapılır. Sonraki kayıtlar webhook altında yalnızca
|
||||
API'nin `/v1/users/me` yanıtındaki `account.id` değerini gönderir. Webhook'u yeniden
|
||||
tanımlamak için bu değeri elle `false` yapın.
|
||||
|
||||
Test/prod ortamını veya kullanıcı hesabını değiştirirken de yeni ortamın webhook'u
|
||||
ilk kayıtla tanımlayabilmesi için `IKLIM_WEBHOOK_INITIALIZED=false` yapın.
|
||||
|
||||
## Nowcast geo alarm filter yapılandırması
|
||||
|
||||
Tüm CSV satırlarına uygulanacak ortak nowcast filtreleri
|
||||
`nowcast-geo-alarm-filter.json` içinde tutulur. Yıldırım, thunderstorm ve yağış
|
||||
filtrelerinden ihtiyaç duyulmayan nesneler dosyadan çıkarılabilir. API isteğindeki
|
||||
alan adı doküman gereği yine `filter` olarak gönderilir.
|
||||
|
||||
## Otomatik authentication
|
||||
|
||||
Ortak istemci her yetkili istekten önce access token'ı kontrol eder:
|
||||
|
||||
1. Access token yoksa `.env` kullanıcı bilgileriyle login olur.
|
||||
2. Access token'ın bitmesine 60 saniyeden az kaldıysa geçerli refresh token ile yeniler.
|
||||
3. Refresh token yoksa/geçersizse yeniden login olur.
|
||||
4. Sunucu `401` döndürürse refresh veya login yapıp isteği bir kez daha gönderir.
|
||||
5. Yeni tokenları ve JWT `exp` değerlerini `.env` dosyasına kaydeder.
|
||||
|
||||
Yetkili isteklerde `Authorization: Bearer <accessToken>` ile HMAC başlıkları birlikte
|
||||
gönderilir. Tokenlar ve parolalar konsola yazılmaz.
|
||||
|
||||
## Retry davranışı
|
||||
|
||||
Ağ hataları ile `429`, `500`, `502`, `503` ve `504` yanıtları ilk istekten sonra en
|
||||
fazla üç kez, varsayılan olarak 2, 4 ve 8 saniye beklenerek tekrar edilir. `429`
|
||||
yanıtındaki `Retry-After` varsa ona uyulur. Bir operasyonun retry isteklerinde aynı
|
||||
idempotency key; yeni timestamp, nonce ve HMAC imzası kullanılır.
|
||||
|
||||
Belirsiz sonuç veya `409` sonrasında kayıt `recipientId` ile sorgulanır. Kayıt
|
||||
bulunursa `registrationId` kurtarılır ve satır `SUCCESS` yapılır.
|
||||
|
||||
## Debug HTTP logları
|
||||
|
||||
Her çalıştırmada maskelenmiş HTTP istek ve yanıtları aşağıdaki dosyaya yazılır:
|
||||
|
||||
```text
|
||||
logs/iklim-api-debug.log
|
||||
```
|
||||
|
||||
Log; istek metodu, URL, deneme numarası, başlıklar, istek gövdesi, HTTP durum kodu,
|
||||
yanıt başlıkları ve yanıt gövdesini içerir. Parola, kullanıcı adı, JWT, refresh
|
||||
token, API key, webhook secret, `Authorization`, cookie ve `X-Signature` değerleri
|
||||
maskelenir. Dosya 5 MB'a ulaştığında döndürülür ve en fazla üç eski dosya tutulur.
|
||||
Başarılı API yanıtındaki `warning`/`warnings` alanları ayrıca konsola yazılır.
|
||||
|
||||
## Çalıştırma
|
||||
|
||||
Manuel login:
|
||||
|
||||
```bash
|
||||
python login.py
|
||||
```
|
||||
|
||||
CSV registration:
|
||||
|
||||
```bash
|
||||
python nowcast-geo-register.py nowcast-geo-alarm-registrations.csv
|
||||
```
|
||||
|
||||
Farklı config dosyaları vermek için:
|
||||
|
||||
```bash
|
||||
python nowcast-geo-register.py nowcast-geo-alarm-registrations.csv \
|
||||
--webhook-config another-webhook.json \
|
||||
--nowcast-filter-config another-nowcast-geo-alarm-filter.json \
|
||||
--debug-log logs/custom-debug.log
|
||||
```
|
||||
Reference in New Issue
Block a user