Kampanya başlamadan önce IG hesap listesini brifle otomatik olarak karşılaştırıp yalnızca dikkat gerektiren kayıtları içeren bir CSV oluşturabilirsiniz. Betik her satır için profil bilgilerini ister, kullanıcı adını, gizlilik ve doğrulama durumlarını beklenen değerlerle karşılaştırır ve mevcut sayaçları da kaydeder. Böylece tekrarlanan manuel kontrol, kampanya işleme alınmadan önce uygulanabilir bir kontrol adımına dönüşür.
Görev: yayın öncesinde farklılıkları bulmak
Kampanya tablosunda genellikle hesap adı ve birkaç beklenti yer alır: profil herkese açık olmalı, kullanıcı adı onaylananla eşleşmeli ve doğrulama işareti brifteki kayıtla tutarlı olmalıdır. Listenin hazırlanması ile kampanyanın başlatılması arasında hesap adını değiştirebilir, gizliye alınabilir ya da benzer isimli başka bir profil olabilir. Satırları tek tek elle kontrol etmek, süreci tekrarlanabilir kılmayı ve istisnaları hızla belirlemeyi zorlaştırır.

Bu tür bir ön tanılama için profilin kullanıcı adıyla alınması yeterlidir. jsonscraper’ın yayımlanmış IG endpoint belgelerinde GET /v1/user/by/username rotası ve username parametresi belirtilir; isteğe bağlı olarak cache_timeout da kullanılabilir. Yanıtta kullanıcı adı, tam ad, private ve verified göstergeleri, gönderi, takipçi ve takip edilen sayıları ile biyografi bulunabilir. Kullanılabilir alanları gerçek yanıttan okuyun: şema görüntüsü, bunların gözlemlenen yanıtta yer aldığını doğrular; ancak değerler farklı olabilir veya hiç bulunmayabilir.
Tabloyu ve kontrol kurallarını hazırlayın
username, expected_private ve expected_verified sütunlarını içeren profiles.csv adlı bir CSV oluşturun. Bu iki beklenti sütununa true veya false değerlerini yazın; kullanıcı adını ise @ işareti olmadan girin. Bir profil için beklenti bilinmiyorsa hücreyi boş bırakın: betik, beklenti yokluğunu hataya dönüştürmemelidir.
username,expected_private,expected_verified
examplebrand,false,true
anotheraccount,false,false
Bu kontrol iki dar kapsamlı görevi yerine getirir: alınan kullanıcı adının istenenle eşleşip eşleşmediğini belirler ve kaydedilmiş gizlilik ve doğrulama beklentilerinden sapmaları bulur. Sayaçlar ve biyografi bağlam için, insan tarafından değerlendirilmek üzere kaydedilir; bunlar kitlenin kalitesinin veya içerik üreticisinin kampanyaya uygunluğunun kanıtı olarak yorumlanmaz.
IG Scraper API’ye bağlanın
Erişim anahtarını JSONSCRAPER_INSTAGRAM_LICENSE_KEY ortam değişkeninde saklayın. Gizli anahtarı CSV’ye, kaynak koda veya çalışma günlüklerine yazmayın. Resmî IG endpoint rehberi, rotayı ve parametre adlarını açıklar; API’nin temel adresi https://ig.jsonscraper.com, anahtar parametresinin adı ise license_key’dir.
Tam listeyi işlemeden önce deneme satırı için bir istek gönderin, JSON yapısını kontrol edin ve hesabınızın erişimi olduğundan emin olun. Endpoint kullanıcı adı kabul ettiğinden, bu basit senaryoda bilinen bir profil kimliğine veya ek rotalara gerek yoktur.
Örnek: istekler, karşılaştırma ve istisnalar CSV’si
Aşağıdaki betik Python 3.8 ve üzeri sürümlerle uyumludur. CSV’yi okur, her profil için bir GET isteği gönderir, HTTP yanıt durumunu denetler ve karşılaştırma sonucuyla birlikte önemli kaynak alanları kaydeder. python -m pip install requests komutuyla bağımlılığı yükleyin, ardından çalıştırmadan önce anahtarı dışa aktarın.

import csv
import os
import time
from pathlib import Path
import requests
BASE_URL = "https://ig.jsonscraper.com/v1/user/by/username"
API_KEY = os.environ["JSONSCRAPER_INSTAGRAM_LICENSE_KEY"]
INPUT_FILE = Path("profiles.csv")
OUTPUT_FILE = Path("preflight_results.csv")
def parse_expected(value):
value = (value or "").strip().lower()
if value == "true":
return True
if value == "false":
return False
return None
def profile_from_response(payload):
# Belgelenmiş gözlemlenen yanıtta profil alanları "ig" içinde yer alır.
if payload.get("status") != "ok":
raise ValueError("API yanıtının durumu ok değil")
profile = payload.get("ig")
if not isinstance(profile, dict):
raise ValueError("Yanıtta 'ig' altında profil nesnesi bulunmuyor")
return profile
with INPUT_FILE.open(newline="", encoding="utf-8") as source:
rows = list(csv.DictReader(source))
results = []
for row in rows:
requested = (row.get("username") or "").strip().lstrip("@")
if not requested:
results.append({
"requested_username": "",
"result": "missing_username",
"error": "username boş",
})
continue
try:
response = requests.get(
BASE_URL,
params={"username": requested, "license_key": API_KEY},
timeout=30,
)
response.raise_for_status()
profile = profile_from_response(response.json())
actual_username = profile.get("username")
actual_private = profile.get("is_private")
actual_verified = profile.get("is_verified")
expected_private = parse_expected(row.get("expected_private"))
expected_verified = parse_expected(row.get("expected_verified"))
checks = []
if actual_username and actual_username.casefold() != requested.casefold():
checks.append("username_mismatch")
if expected_private is not None and actual_private != expected_private:
checks.append("privacy_mismatch")
if expected_verified is not None and actual_verified != expected_verified:
checks.append("verification_mismatch")
results.append({
"requested_username": requested,
"username": actual_username,
"full_name": profile.get("full_name"),
"is_private": actual_private,
"is_verified": actual_verified,
"media_count": profile.get("media_count"),
"follower_count": profile.get("follower_count"),
"following_count": profile.get("following_count"),
"result": "review" if checks else "matched",
"checks": ";".join(checks),
"error": "",
})
except (requests.RequestException, ValueError, KeyError) as exc:
results.append({
"requested_username": requested,
"result": "request_or_response_error",
"error": str(exc),
})
# Kısa bir gecikme istekler arasında süre bırakır; belgelenmiş bir kota garantisi değildir.
time.sleep(0.5)
fieldnames = sorted({key for item in results for key in item})
with OUTPUT_FILE.open("w", newline="", encoding="utf-8") as destination:
writer = csv.DictWriter(destination, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(results)
print("Kaydedilen satır sayısı:", len(results), "Dosya:", OUTPUT_FILE)
Kod, gözlemlenen yanıt sarmalayıcısını, yani dıştaki status alanını ve ig profil nesnesini kontrol eder. Sağlayıcı biçimi değiştirirse yapı denetimi ilgili kaydın işlenmesini durdurur ve sessizce hatalı bir eşleşme üretmek yerine hatayı kaydeder. Betik anahtarı yazdırmaz ve sonuç dosyasına eklemez.
Sonuçları nasıl okuyabilirsiniz?
preflight_results.csv dosyasındaki matched durumlu satırlar, tanımlanan karşılaştırmalardan geçmiştir. review değeri, bir veya daha fazla parametrenin briften farklı olduğu anlamına gelir; checks sütunu hangi parametrelerin farklı olduğunu gösterir. İstek veya yanıt hataları ayrı olarak belirtilir; böylece veriye erişilememesi doğrulanmış bir eşleşme gibi görünmez.
Takipçi ve gönderi sayıları, bir kişinin mevcut profil anlık görüntüsünü başvurunun yanında görmesine yardımcı olur. Bunlar istek yanıtındaki o ana ait değerlerdir. Zaman içindeki değişimleri değerlendirmek için farklı tarihlerdeki çalıştırmaları ayrı ayrı saklayın; tek bir kontrol geçmiş içermez. Alanlar boş olabilir. Böyle bir kayıt, kimliği ve mevcut diğer göstergeleri kontrol etmek için kullanılabilir; ancak bulunmayan bir sayacı karşılaştırmak için kullanılamaz.
Kampanya başlamadan önce otomasyon
Deneme CSV’sini elle kontrol ettikten sonra betiği bir zamanlamaya veya kampanya hazırlık adımına ekleyin. Kontrolün tekrarlanabilir olması için kaynak listeyi ayrı tutun, çalıştırma tarihini kaydedin ve sonuç CSV’sini erişimi kısıtlı bir çalışma deposunda saklayın. Kullanıcı adı değişebiliyorsa yeniden işleme için sisteminizdeki kalıcı bir satır kimliğini kullanmak faydalı olur.
Liste büyüdükçe eşzamanlılık sınırı, yalnızca geçici ağ hataları için yeniden deneme ve gizli bilgiler içermeyen ayrı bir hata kodu günlüğü ekleyin. Hatalı anahtar veya geçersiz kullanıcı adı için sonsuz yeniden deneme yapmayın. cache_timeout değerini yalnızca gereken güncellik politikasına uygun şekilde ekleyin: belgelere göre IG’da önbellekleme varsayılan olarak kapalıdır; sıfırdan büyük bir değer, belirtilen süre boyunca önbelleği etkinleştirir.
Profil kontrolü, manuel karşılaştırmayı somut bir istisna listesine indirger: kampanya başlamadan önce kullanıcı adı, herkese açıklık durumu, doğrulama ve mevcut sayaçlar tek tabloda yer alır. API parametreleri ve güncel entegrasyon seçenekleri için IG Scraper API sayfasına ve rota belgelerine başvurun.