Vor dem Start einer Kampagne lässt sich eine Liste von IG-Konten per Skript verarbeiten und ein JSON-Bericht mit der API-Antwort für jeden Namen erstellen. Der Endpunkt der IG Scraper API von jsonscraper liefert einen übergeordneten Status und ein Profilobjekt; das beobachtete Schema umfasst den Benutzernamen, Angaben zu Privatsphäre und Verifizierung sowie die Anzahl von Beiträgen, Followern und gefolgten Konten. Diese Felder helfen dabei, Einträge für eine manuelle Prüfung auszuwählen, erklären für sich genommen aber nicht, warum eine Antwort fehlt oder unerwartet ausfällt.

Das Problem: Die Kontenliste sieht korrekt aus – ist sie einsatzbereit?
In einer Kampagnen-Tabelle können umbenannte Konten, Tippfehler und private Profile stehen. Beginnt das Team die Liste ohne Vorabprüfung auszuwerten, muss jemand die Konten einzeln öffnen. Ein automatisierter Durchlauf verringert den manuellen Aufwand und erstellt ein einheitliches Protokoll darüber, was die API für jeden angefragten Namen zurückgegeben hat.
Der Zweck dieses Ablaufs ist klar begrenzt: die Liste durchgehen, die tatsächlichen HTTP-Antworten und das JSON speichern und Profile mit für die Kampagne relevanten Merkmalen zur manuellen Prüfung markieren. Der Bericht hält die Beobachtungsdaten fest; er ermittelt nicht, warum ein Profil nicht zurückgegeben wurde oder eine Anfrage fehlgeschlagen ist.
Was die Anfrage prüft
In der Dokumentation von jsonscraper ist der Endpunkt GET /v1/user/by/username angegeben. Der Pflichtparameter lautet username; der Schlüssel wird als license_key übergeben. Mit dem optionalen Parameter cache_timeout lässt sich das Caching für eine festgelegte Anzahl von Sekunden aktivieren; bei 0 bleibt es ausgeschaltet. Das beobachtete Schema einer erfolgreichen Antwort enthält einen übergeordneten status und ein ig-Objekt mit Profilfeldern.
Unterscheiden Sie bei der Diagnose drei Sachverhalte: ob die HTTP-Anfrage erfolgreich ausgeführt wurde, ob das geparste JSON ein ig-Objekt enthält und welche Felder in diesem Objekt vorhanden sind. Wird ein Schritt nicht wie erwartet abgeschlossen, kann das Skript das technische Ergebnis und die ursprüngliche Antwort protokollieren. Das weist auf Prüfbedarf hin, belegt aber nicht die Ursache des Fehlers.
Eingabedaten und Schlüssel vorbereiten
Erstellen Sie die Datei usernames.txt mit einem Benutzernamen pro Zeile, ohne das Zeichen @. Entfernen Sie leere Zeilen und Duplikate und behalten Sie nur Konten, die zur Kampagne gehören. Speichern Sie für spätere Ergebnisvergleiche das Prüfdatum und die Projektkennung separat.
Speichern Sie den Schlüssel in der Umgebungsvariable JSONSCRAPER_INSTAGRAM_LICENSE_KEY, nicht im Quellcode oder Repository:
export JSONSCRAPER_INSTAGRAM_LICENSE_KEY="ihr_schlüssel"
python3 check_profiles.py
Das Beispiel verwendet die Python-Standardbibliothek ab Version 3.8 und erfordert keine Installation von HTTP-Paketen.
Beispiel: Profile abfragen und einen Bericht speichern
Das Skript arbeitet die Liste mit jeweils einem Namen ab. Bei einer erfolgreichen JSON-Antwort speichert es den tatsächlichen Inhalt und die verfügbaren Profilfelder; bei einem HTTP- oder Netzwerkfehler protokolliert es diesen als technisches Ergebnis. Fehlende Felder bleiben null, und der rohe Antworttext wird gespeichert, sofern er gelesen werden konnte.
import json
import os
import time
from datetime import datetime, timezone
from urllib.error import HTTPError, URLError
from urllib.parse import urlencode
from urllib.request import Request, urlopen
API_KEY = os.environ.get("JSONSCRAPER_INSTAGRAM_LICENSE_KEY")
if not API_KEY:
raise SystemExit("Setzen Sie JSONSCRAPER_INSTAGRAM_LICENSE_KEY")
BASE_URL = "https:\/\/ig.jsonscraper.com\/v1\/user\/by\/username"
with open("usernames.txt", encoding="utf-8") as f:
usernames = list(dict.fromkeys(
line.strip().lstrip("@") for line in f if line.strip()
))
results = []
for username in usernames:
params = urlencode({"username": username, "license_key": API_KEY})
request = Request(f"{BASE_URL}?{params}", method="GET")
checked_at = datetime.now(timezone.utc).isoformat()
try:
with urlopen(request, timeout=30) as response:
http_status = response.status
raw_body = response.read().decode("utf-8")
try:
payload = json.loads(raw_body)
json_error = None
except json.JSONDecodeError as exc:
payload = None
json_error = str(exc)
profile = payload.get("ig") if isinstance(payload, dict) else None
record = {
"requested_username": username,
"checked_at": checked_at,
"http_status": http_status,
"api_status": payload.get("status") if isinstance(payload, dict) else None,
"check_result": "profile_returned" if isinstance(profile, dict) else "unexpected_or_missing_profile_object",
"response": payload if payload is not None else raw_body,
}
if json_error:
record["json_error"] = json_error
if isinstance(profile, dict):
record["returned_username"] = profile.get("username")
record["is_private"] = profile.get("is_private")
record["is_verified"] = profile.get("is_verified")
record["media_count"] = profile.get("media_count")
record["follower_count"] = profile.get("follower_count")
record["following_count"] = profile.get("following_count")
results.append(record)
except HTTPError as exc:
body = exc.read().decode("utf-8", errors="replace")
results.append({
"requested_username": username,
"checked_at": checked_at,
"check_result": "http_error",
"http_status": exc.code,
"response": body,
})
except (URLError, TimeoutError) as exc:
results.append({
"requested_username": username,
"checked_at": checked_at,
"check_result": "request_error",
"detail": str(exc),
})
time.sleep(0.5)
with open("profile-check.json", "w", encoding="utf-8") as f:
json.dump(results, f, ensure_ascii=False, indent=2)
print(f"Gespeicherte Ergebnisse: {len(results)}")
Dies ist ein Integrationsbeispiel, kein Bericht über einen durchgeführten Test. Der Schlüssel wird im Parameter license_key übergeben, aber nicht ausgegeben. Die vollständige Antwort kann Informationen enthalten, deren Zugriff gemäß den Datenaufbewahrungsregeln Ihres Teams beschränkt werden sollte.
Ergebnisse interpretieren
Der Eintrag profile_returned bedeutet, dass das Skript ein JSON-Objekt ig erhalten hat. Vergleichen Sie requested_username mit returned_username und prüfen Sie die für den Kampagnenprozess wichtigen Merkmale. Beispielsweise kann is_private: true zur manuellen Prüfung markiert werden, wenn die Kampagne ein öffentliches Profil voraussetzt.

Die Ergebnisse http_error, request_error und unexpected_or_missing_profile_object kennzeichnen lediglich den Schritt, in dem das Skript nicht die erwartete Struktur erhalten hat. Sie belegen nicht, dass ein Konto gelöscht, privat oder aus einem bestimmten Grund nicht verfügbar ist. Speichern Sie die Antwort, überprüfen Sie Namen und Schlüssel und wiederholen Sie anschließend die Anfrage oder wenden Sie sich an den regulären Support des Dienstes.
Fehlt ein Feld, belassen Sie es als unbekannt – interpretieren Sie das Fehlen nicht als Null oder false. Profilzähler beschreiben den Zustand zum Zeitpunkt der Anfrage. Der Zeitstempel hilft, diese Momentaufnahme von den Ergebnissen des nächsten Durchlaufs zu unterscheiden.
Automatisierung ohne Verlust der Nachvollziehbarkeit
Verlegen Sie die Ausführung in einen Aufgabenplaner oder einen Schritt eines bestehenden ETL-Prozesses. Speichern Sie Prüfdatum, angefragten Namen, Ergebnis, Status und Antworttext. In einem separaten Schritt können Sie das JSON in eine Tabelle laden und der zuständigen Person nur die Einträge zur Prüfung senden.
Um Änderungen zu erkennen, vergleichen Sie die Momentaufnahmen eines Profils anhand ausgewählter Felder. Eine Änderung der Beitragszahl ist ein Anlass, das Profil zu öffnen und zu prüfen, aber kein exaktes Datum für das Erscheinen eines Beitrags. Auch die Follower-Zahl gilt nur zum Zeitpunkt der Anfrage; ein Verlauf entsteht daher aus gespeicherten Momentaufnahmen.
Legen Sie bei großen Listen ein kontrolliertes Tempo fest, ergänzen Sie begrenzte Wiederholungsversuche und führen Sie ein Fehlerprotokoll. Nehmen Sie den Schlüssel nicht in URL-Protokolle auf. Getrennt gespeicherte Eingabelisten und Ergebnisse erleichtern es festzustellen, welche Konten bereits verarbeitet wurden.
Erwartetes Ergebnis
Das Ergebnis ist eine JSON-Datei mit dem Verarbeitungsresultat für jeden angegebenen Namen, einem Zeitstempel, den verfügbaren Attributen und der gespeicherten Antwort. Vor der Übergabe der Liste an die Kampagne können Sie übereinstimmende Namen, private Profile und technische Fälle für die manuelle Prüfung herausfiltern. Die Kriterien für den nächsten Schritt legt das Team selbst fest.
Endpunkt und Parameter sind in der Dokumentation der IG-API beschrieben; Produktinformationen finden Sie auf der Seite der IG Scraper API. Beginnen Sie mit einer kleinen Auswahl, überprüfen Sie die tatsächliche Antwortstruktur und passen Sie die Berichtsregeln an Ihren Prozess an.