Voordat een campagne van start gaat, kun je een lijst met IG-accounts automatisch vergelijken met de briefing en een CSV-bestand maken met alleen de vermeldingen die aandacht vereisen. Voor elke rij vraagt het script het profiel op, vergelijkt het de gebruikersnaam, privacyinstelling en verificatiestatus met de verwachte waarden en slaat het beschikbare statistieken op. Zo wordt een terugkerende handmatige controle een overzichtelijke controle stap voordat de campagne wordt overgedragen.
Doel: afwijkingen vinden vóór publicatie
In een campagnetabel staan doorgaans de accountnaam en enkele verwachtingen: het profiel moet openbaar zijn, de gebruikersnaam moet overeenkomen met de afgesproken naam en de verificatiemarkering moet overeenkomen met de briefing. Tussen het opstellen van de lijst en de start kan een account van naam veranderen, privé worden of een ander profiel blijken te zijn met een vergelijkbare naam. Als je de rijen handmatig controleert, is het lastig om het proces te herhalen en uitzonderingen snel te vinden.

Voor zo'n voorafgaande diagnose is het voldoende om een profiel op te vragen met de gebruikersnaam. In de gepubliceerde documentatie van jsonscraper staat de route GET /v1/user/by/username met de parameter username; ook is cache_timeout optioneel beschikbaar. De respons kan de gebruikersnaam, volledige naam, de kenmerken private en verified, het aantal berichten, volgers en gevolgde accounts, en de biografie bevatten. Lees de concrete velden uit de daadwerkelijke respons: een momentopname van het schema bevestigt dat ze in een waargenomen respons aanwezig waren, maar de waarden kunnen verschillen of ontbreken.
Maak de tabel en controlecriteria gereed
Maak een CSV-bestand profiles.csv met de kolommen username, expected_private en expected_verified. Vul in de laatste twee kolommen de verwachte waarden true of false in en noteer de gebruikersnaam zonder het teken @. Is de verwachting voor een profiel onbekend, laat de cel dan leeg: het script mag een ontbrekende verwachting niet als fout behandelen.
username,expected_private,expected_verified
examplebrand,false,true
anotheraccount,false,false
Deze controle heeft twee beperkte doelen: vaststellen of de opgehaalde gebruikersnaam overeenkomt met de opgevraagde naam en afwijkingen signaleren ten opzichte van vastgelegde verwachtingen over privacy en verificatie. Statistieken en de biografie worden opgeslagen als context voor handmatige beoordeling; ze gelden niet als bewijs voor de kwaliteit van het publiek of de geschiktheid van de maker voor de campagne.
Maak verbinding met de IG Scraper API
Sla de toegangssleutel op in de omgevingsvariabele JSONSCRAPER_INSTAGRAM_LICENSE_KEY. Zet het geheim niet in het CSV-bestand, de broncode of uitvoerlogboeken. De officiële documentatie van het IG-endpoint beschrijft de route en parameternamen; het basisadres van de API is https://ig.jsonscraper.com en de parameter voor de sleutel heet license_key.
Doe voordat je de volledige lijst verwerkt één testaanroep voor een testregel, controleer de JSON-structuur en bevestig dat je account toegang heeft. Omdat het endpoint een gebruikersnaam accepteert, zijn voor dit eenvoudige scenario geen bekende profiel-ID of aanvullende routes nodig.
Voorbeeld: aanvragen, vergelijken en een CSV-bestand met uitzonderingen maken
Het volgende script is compatibel met Python 3.8 en hoger. Het leest een CSV-bestand, voert één GET-aanvraag per profiel uit, controleert de HTTP-status van het antwoord en bewaart de relevante bronvelden samen met het vergelijkingsresultaat. Installeer de afhankelijkheid met python -m pip install requests en stel de sleutel vóór het uitvoeren als omgevingsvariabele in.

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):
# De gedocumenteerde waargenomen respons verpakt profielvelden in "ig".
if payload.get("status") != "ok":
raise ValueError("API-responsstatus is niet ok")
profile = payload.get("ig")
if not isinstance(profile, dict):
raise ValueError("Respons bevat geen profielobject onder 'ig'")
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 is empty",
})
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),
})
# Een korte vertraging spreidt de aanvragen; dit is geen gedocumenteerde quotagarantie.
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("Saved", len(results), "rows to", OUTPUT_FILE)
De code controleert de waargenomen responsverpakking: de buitenste status en het profielobject ig. Als de aanbieder het formaat wijzigt, stopt de structuurcontrole de verwerking van de betreffende vermelding en slaat het script een fout op, in plaats van stilzwijgend een onjuiste overeenkomst te registreren. Het script drukt de sleutel niet af en neemt die niet op in het uitvoerbestand.
De resultaten lezen
Rijen met de status matched in preflight_results.csv voldoen aan de opgegeven vergelijkingen. De waarde review betekent dat een of meer kenmerken afwijken van de briefing; de kolom checks laat zien welke. Een aanvraag- of responsfout wordt apart vermeld, zodat ontoegankelijke gegevens niet worden aangezien voor een bevestigde overeenkomst.
Het aantal volgers en berichten helpt iemand de huidige momentopname van het profiel naast de aanvraag te bekijken. Dit zijn momentwaarden uit de respons op de aanvraag. Wil je veranderingen in de loop van de tijd beoordelen, bewaar dan afzonderlijke, gedateerde uitvoeringen; één controle bevat geen geschiedenis. Velden kunnen leeg zijn. De vermelding blijft dan bruikbaar voor de controle van de identiteit en andere beschikbare kenmerken, maar niet voor het vergelijken van een ontbrekende statistiek.
Automatisering vóór de start van de campagne
Voeg het script na handmatige controle van een test-CSV toe aan een schema of een voorbereidingsstap voor de campagne. Bewaar voor reproduceerbare controles de oorspronkelijke lijst apart, noteer de uitvoerdatum en sla de CSV-resultaten op in een afgeschermde werkomgeving. Voor herverwerking is het handig een stabiele rij-ID uit je systeem te gebruiken als gebruikersnamen kunnen veranderen.
Voeg bij grotere lijsten een limiet voor gelijktijdige aanvragen toe, probeer tijdelijke netwerkfouten opnieuw en houd een apart logboek met foutcodes bij, zonder geheimen. Voer geen eindeloze nieuwe pogingen uit bij een ongeldige sleutel of onjuiste gebruikersnaam. Voeg de waarde cache_timeout alleen toe volgens het gewenste versheidsbeleid: de documentatie vermeldt dat caching voor IG standaard is uitgeschakeld en dat een waarde groter dan nul caching voor de opgegeven periode inschakelt.
Een profielcontrole beperkt de handmatige vergelijking tot een concrete lijst met uitzonderingen: gebruikersnaam, privacy, verificatie en beschikbare statistieken staan vóór de start van de campagne in één tabel. Raadpleeg voor API-parameters en actuele integratiemogelijkheden de pagina over de IG Scraper API en de documentatie van de routes.