Vóór de campagne kun je een lijst met IG-accounts met een script verwerken en een JSON-rapport maken met het API-antwoord voor elke gebruikersnaam. De route IG Scraper API van jsonscraper retourneert een externe status en een profielobject; het waargenomen schema bevat de gebruikersnaam, privacy- en verificatiekenmerken, het aantal berichten, volgers en gevolgde accounts. Deze velden helpen bij het selecteren van vermeldingen voor handmatige controle, maar verklaren op zichzelf niet waarom een antwoord ontbreekt of onverwacht is.

Het probleem: de accountlijst ziet er goed uit, maar is die klaar voor gebruik?
Een campagnetabel kan hernoemde accounts, typefouten en privéprofielen bevatten. Als het team de lijst zonder voorafgaande controle gaat analyseren, moet iemand de accounts één voor één openen. Een automatische controle beperkt het handwerk en legt in één logboek vast wat de API voor elke opgevraagde gebruikersnaam heeft geretourneerd.
Het doel van dit scenario is beperkt: de lijst doorlopen, de feitelijke HTTP-antwoorden en JSON bewaren en profielen met voor de campagne relevante kenmerken markeren voor handmatige controle. Het rapport legt waargenomen gegevens vast; het bepaalt niet waarom een profiel niet is geretourneerd of waarom een verzoek is mislukt.
Wat het verzoek controleert
In de documentatie van jsonscraper staat de route GET /v1/user/by/username. De verplichte parameter is username; de sleutel wordt doorgegeven als license_key. Met de optionele parameter cache_timeout schakel je caching in voor een opgegeven aantal seconden; met 0 blijft die uitgeschakeld. Het waargenomen schema van een geslaagd antwoord bevat een externe status en een object ig met profielvelden.
Houd voor diagnostiek drie feiten uit elkaar: is het HTTP-verzoek uitgevoerd; bevat de geparseerde JSON een object ig; en welke velden zijn in dat object aanwezig. Als een stap niet naar verwachting verloopt, kan het script het technische resultaat en het oorspronkelijke antwoord vastleggen. Zo’n resultaat wijst erop dat controle nodig is, maar stelt de oorzaak van de fout niet vast.
Bereid de invoer en sleutel voor
Maak een bestand usernames.txt met één gebruikersnaam per regel, zonder het teken @. Verwijder lege regels en duplicaten en houd alleen accounts over die bij de campagne horen. Bewaar voor latere vergelijking de controledatum en de project-ID apart.
Bewaar de sleutel in de omgevingsvariabele JSONSCRAPER_INSTAGRAM_LICENSE_KEY, niet in de broncode of repository:
export JSONSCRAPER_INSTAGRAM_LICENSE_KEY="uw_sleutel"
python3 check_profiles.py
Het voorbeeld gebruikt de standaardbibliotheek van Python 3.8+ en vereist geen installatie van HTTP-pakketten.
Voorbeeld: profielen opvragen en een rapport opslaan
Het script verwerkt de lijst één gebruikersnaam tegelijk. Bij een geslaagd JSON-antwoord slaat het de feitelijke inhoud en beschikbare profielvelden op; bij een HTTP- of netwerkfout registreert het die als technische uitkomst. Ontbrekende velden blijven null en de ruwe antwoordinhoud wordt bewaard als die kon worden gelezen.
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("Stel JSONSCRAPER_INSTAGRAM_LICENSE_KEY in")
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"Opgeslagen resultaten: {len(results)}")
Dit is een integratievoorbeeld, geen melding van een uitgevoerde test. De sleutel wordt doorgegeven in de parameter license_key, maar niet afgedrukt. Het volledige antwoord kan informatie bevatten waarvan de toegang moet worden beperkt volgens de regels voor gegevensopslag van je team.
Resultaten interpreteren
De vermelding profile_returned betekent dat het script een JSON-object ig heeft ontvangen. Vergelijk requested_username met returned_username en bekijk de kenmerken die voor het campagneproces van belang zijn. Je kunt bijvoorbeeld is_private: true markeren voor handmatige controle als de campagne een openbaar profiel vereist.

De resultaten http_error, request_error en unexpected_or_missing_profile_object geven alleen aan in welke stap het script de verwachte structuur niet heeft ontvangen. Ze bewijzen niet dat een account is verwijderd, privé is of om een specifieke reden niet beschikbaar is. Bewaar het antwoord, controleer de gebruikersnaam en sleutel en probeer het verzoek daarna opnieuw of neem contact op met de gebruikelijke ondersteuning van de dienst.
Ontbreekt een veld, laat het dan onbekend: interpreteer de afwezigheid niet als nul of false. De profielstatistieken beschrijven de toestand op het moment van het verzoek. Dankzij de tijdstempel kun je deze momentopname onderscheiden van de resultaten van een volgende uitvoering.
Automatiseren zonder zicht op de resultaten te verliezen
Verplaats de uitvoering naar een taakplanner of een stap in een bestaand ETL-proces. Bewaar de controledatum, opgevraagde gebruikersnaam, uitkomst, status en antwoordinhoud. In een aparte stap kun je de JSON naar een tabel uploaden en alleen vermeldingen die controle vereisen naar een specialist sturen.
Vergelijk voor het opsporen van veranderingen momentopnamen van hetzelfde profiel op basis van geselecteerde velden. Een verandering in het aantal berichten is aanleiding om het profiel te openen en te controleren, maar geeft niet precies aan wanneer een bericht is geplaatst. Ook het aantal volgers is een waarde op het moment van het verzoek; de geschiedenis van waarnemingen ontstaat dus uit de opgeslagen momentopnamen.
Stel bij een grote lijst een beheersbaar tempo in, voeg een beperkt aantal herhaalpogingen toe en houd een foutenlogboek bij. Neem de sleutel niet op in URL-logboeken. Door de invoerlijst en resultaten apart op te slaan, kun je bepalen welke accounts al zijn verwerkt.
Verwacht resultaat
Het resultaat is een JSON-bestand met de verwerkingsuitkomst voor elke opgegeven gebruikersnaam, een tijdstempel, beschikbare kenmerken en het opgeslagen antwoord. Voordat je de lijst voor de campagne gebruikt, kun je overeenkomende gebruikersnamen, privéprofielen en technische gevallen eruit filteren voor handmatige controle. Het team bepaalt zelf de criteria voor de volgende stap.
De route en parameters worden beschreven in de documentatie van de IG API; productinformatie staat op de pagina van IG Scraper API. Begin met een kleine steekproef, controleer de feitelijke antwoordstructuur en stem de rapportageregels af op je eigen proces.