jsonscraper
Markten
Terug naar het journaal

Controleer IG-profielen vóór de campagne met een API-controle

Een Python-script controleert de gebruikersnaam, privacy, verificatie en profielstatistieken en markeert afwijkingen voor handmatige controle.

Redactioneel beleid Een fout melden

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.

Artikel: Controleer IG-profielen vóór de campagne met een API-controle
Samenvatting: Controleer IG-profielen uit een campagnebriefing automatisch voordat de campagne start: haal gegevens op via het gedocumenteerde jsonscraper-endpoint, vergelijk ze met de verwachte waarden en sla een overzichtelijke lijst met uitzonderingen op.
Afbeeldingsrol: omslag — het centrale idee
Sectie: Doel: afwijkingen vinden vóór publicatie
Visueel onderwerp: Redactioneel stilleven: een campagneplanningsblad met verschillende IG-profielen
De voorafgaande controle vergelijkt het profiel met de verwachte briefingparameters en markeert rijen voor handmatige beoordeling.© jsonscraper · gemaakt met AI

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.

Artikel: Controleer IG-profielen vóór de campagne met een API-controle
Samenvatting: Controleer IG-profielen uit een campagnebriefing automatisch voordat de campagne start: haal gegevens op via het gedocumenteerde jsonscraper-endpoint, vergelijk ze met de verwachte waarden en sla een overzichtelijke lijst met uitzonderingen op.
Afbeeldingsrol: ondersteunende illustratie 2 — een ander specifiek aspect
Sectie: Voorbeeld: aanvragen, vergelijken en een CSV-bestand met uitzonderingen maken
Visueel onderwerp: Infographic in het Russisch die een gegevensstroom toont
Het schema toont de route van CSV via het profiel-endpoint naar de vergelijkingsresultaten: overeenkomst, handmatige controle of fout.© jsonscraper · AI-gegenereerde illustratie
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.

Mensen

Er zijn nog geen mensen vermeld voor dit artikel.

Blijf lezenIG: problemen met openbare profielen opsporen vóór de campagne
Lees het volgende artikel

Maak van wat je leest een werkende integratie

Ontdek de socialdata-API's van jsonscraper, test aanvragen en bouw je volgende workflow.

API's verkennen