Watch-IP

Python ile Toplu IP Konum Belirleme

Resmi Python SDK'sı bu endpoint'i kapsamadığından doğrudan HTTP üzerinden çağrılan; satır eşleştirmesi, kontrol noktalı (checkpointed) çıktı ve 429 geri çekilmesi ile bir IP listesini POST /v1/lookup'a karşı 100'lük gruplar halinde zenginleştirin.

Başlamadan önce

  • Bir Watch-IP hesabı ve gizli bir sorgulama anahtarı — POST /v1/lookup yalnızca sunucudan sunucuyadır; onu asla bir tarayıcıdan çağırmayın ya da anahtarı bir istemciye gömmeyin.
  • Python 3.9+.
  • Zenginleştirilecek yerel bir IP listesi — bu kılavuz, bunları her satırda bir IP olan bir CSV'den okur.

1. Bunun neden SDK yerine doğrudan HTTP kullandığı

Resmi Python paketi olan watch-ip-sdk yalnızca tarayıcıya yönelik ziyaretçi endpoint'i olan GET /v1/geo'yu uygular — POST /v1/lookup için bir metodu yoktur. Bu kılavuz, sadece bunun için yeni bir bağımlılık eklemek yerine SDK'nın kendi sıfır bağımlılık yaklaşımına uyacak şekilde, API'yi standart kütüphaneden urllib ile doğrudan çağırır.

2. Girdi listesini okuyun ve doğrulayın

Bir sonucun geldiği kayıtla eşleştirilebilmesi için her IP'nin orijinal satır konumunu koruyun — API, sonuçları IP'leri aldığı sırayla döndürür; bu da yalnızca kendi listeniz de aynı sırada kalırsa işe yarar.

Python

import csv

with open("ips.csv", newline="") as f:
    ips = [row[0].strip() for row in csv.reader(f) if row and row[0].strip()]

print(f"Loaded {len(ips)} IPs")

3. 100'lük gruplara (chunk) ayırın

POST /v1/lookup, çağrı başına 1-100 IP kabul eder ve herhangi bir şeyi sorgulamadan önce toplu isteğin tamamını doğrular — hatalı biçimlendirilmiş tek bir adres, chunk'ın tamamını başarısız kılar; bu yüzden girdi listeniz kirli olabiliyorsa önce IP söz dizimini yerel olarak doğrulayın.

Python

def chunk(items, size=100):
    for i in range(0, len(items), size):
        yield items[i : i + size]

4. Her toplu isteği gönderin ve sonuçları kontrol noktasına kaydedin

Sonuçları, her şeyi sona kadar bellekte tutmak yerine her toplu istek tamamlandıkça yazın; böylece uzun bir listenin ortasındaki bir hata, zaten başarılı olmuş toplu istekleri kaybetmez. found: false, IP'nin söz dizimi olarak geçerli ama veritabanında bir kaydı olmadığı anlamına gelir — bu bir hata değil, normal bir sonuçtur.

Python

import json
import time
import urllib.error
import urllib.request

API_URL = "https://api.watch-ip.com/v1/lookup"
SECRET_KEY = "YOUR_SECRET_KEY"

def lookup_batch(ips):
    request = urllib.request.Request(
        API_URL,
        data=json.dumps({"ips": ips}).encode(),
        headers={
            "Authorization": f"Bearer {SECRET_KEY}",
            "Content-Type": "application/json",
        },
    )
    with urllib.request.urlopen(request) as response:
        return json.load(response)["results"]

with open("results.jsonl", "a") as out:
    for batch in chunk(ips):
        try:
            results = lookup_batch(batch)
        except urllib.error.HTTPError as err:
            if err.code == 429:
                time.sleep(60)  # geçerli bir dakikalık pencerenin kalanı için geri çekil
                results = lookup_batch(batch)
            else:
                raise
        for result in results:
            out.write(json.dumps(result) + "\n")

5. Yarım kalan bir işe devam etme

Sonuçlar her seferinde bir toplu istek olarak eklendiğinden, bir çökmeden sonra yeniden başlatmak, listenin tamamını yeniden göndermek yerine yalnızca zaten results.jsonl'e yazılmış IP'leri atlamayı gerektirir — yinelenen bir IP'nin yeniden gönderilmesi tekrar faturalandırılır, çünkü bir toplu istekteki her girdi, tekilleştirilmeden ayrı ayrı ölçülür.

Python

done = set()
with open("results.jsonl") as f:
    for line in f:
        done.add(json.loads(line)["ip"])

remaining = [ip for ip in ips if ip not in done]

Hatalar ve uç durumlar

Bir 400, toplu istekte 100'den fazla IP olduğu, listenin boş olduğu ya da içinde bir yerde hatalı biçimlendirilmiş bir adres bulunduğu anlamına gelir — yalnızca hatalı girdi değil, chunk'ın tamamı başarısız olur. Bir 403, gizli anahtar yerine yayınlanabilir bir anahtar kullanıldığı anlamına gelir. Aynı toplu istekte karışık IPv4 ve IPv6 adresleri sorun değildir; her biri bağımsız olarak sorgulanır ve her iki durumda da aynı null olabilen alanlara sahiptir.

Sonraki adım

Tam yanıt şeması için toplu IP sorgulama referansına, bu endpoint'in döndürebileceği tüm durum kodu listesi için ise hatalar ve hız sınırları sayfasına bakın.

İlgili sayfalar