Ennen kampanjan käynnistämistä voit verrata IG-tilien luetteloa briifiin automaattisesti ja saada CSV-tiedoston, jossa ovat vain huomiota vaativat rivit. Skripti hakee kunkin rivin profiilin, vertaa käyttäjänimeä, yksityisyysasetusta ja vahvistusta odotettuihin arvoihin sekä tallentaa saatavilla olevat laskurit. Näin toistuvasta manuaalisesta tarkistuksesta tulee selkeä tarkistusvaihe ennen kampanjan siirtämistä tuotantoon.
Tavoite: löydä poikkeamat ennen julkaisua
Kampanjataulukossa on yleensä tilin nimi ja muutamia odotuksia: profiilin tulee olla julkinen, käyttäjänimen tulee vastata sovittua ja vahvistusmerkin tulee täsmätä briifiin kirjattuun tietoon. Tilin nimi voi vaihtua, profiili muuttua yksityiseksi tai kyseessä voi olla toinen samanniminen profiili listan kokoamisen ja kampanjan käynnistämisen välillä. Rivien manuaalinen tarkistaminen on vaikea toistaa, ja poikkeamien nopea löytäminen on hankalaa.

Tällaiseen esitarkistukseen riittää, että profiili haetaan käyttäjänimen perusteella. jsonscraperin julkaistussa dokumentaatiossa mainitaan reitti GET /v1/user/by/username ja parametri username; lisäksi käytettävissä on valinnainen cache_timeout. Vastauksessa voi olla käyttäjänimi, koko nimi, private- ja verified-tiedot, julkaisujen, seuraajien ja seurattavien määrä sekä esittelyteksti. Lue kentät varsinaisesta vastauksesta: skeeman tilannekuva vahvistaa niiden esiintymisen havaitussa vastauksessa, mutta arvot voivat vaihdella tai puuttua.
Valmistele taulukko ja tarkistussäännöt
Luo CSV-tiedosto profiles.csv, jossa on sarakkeet username, expected_private ja expected_verified. Syötä kahteen viimeiseen sarakkeeseen odotetut arvot true tai false ja kirjoita käyttäjänimi ilman @-merkkiä. Jos profiilin odotettu arvo ei ole tiedossa, jätä solu tyhjäksi: skripti ei saa tulkita odotuksen puuttumista virheeksi.
username,expected_private,expected_verified
examplebrand,false,true
anotheraccount,false,false
Tässä tarkistuksessa on kaksi rajattua tavoitetta: selvittää, vastaako saatu käyttäjänimi pyydettyä, ja havaita erot yksityisyydestä ja vahvistuksesta kirjattuihin odotuksiin. Laskurit ja esittelyteksti tallennetaan kontekstiksi ja manuaalista arviointia varten, eikä niitä tulkita näytöksi yleisön laadusta tai tekijän soveltuvuudesta kampanjaan.
Ota IG Scraper API käyttöön
Tallenna käyttöavain ympäristömuuttujaan JSONSCRAPER_INSTAGRAM_LICENSE_KEY. Älä kirjoita salaisuutta CSV-tiedostoon, lähdekoodiin tai ajolokeihin. IG-endpointin ohje kuvaa reitin ja parametrien nimet; API:n perusosoite on https://ig.jsonscraper.com, ja avaimen parametrin nimi on license_key.
Tee yksi koepyyntö testirivillä ennen koko luettelon käsittelyä, tarkista JSON-rakenne ja varmista, että tililläsi on käyttöoikeus. Koska endpoint ottaa vastaan käyttäjänimen, tässä yksinkertaisessa käyttötapauksessa ei tarvita tunnettua profiilitunnistetta eikä muita reittejä.
Esimerkki: pyynnöt, vertailu ja CSV poikkeamista
Seuraava skripti toimii Python 3.8:ssa ja sitä uudemmissa versioissa. Se lukee CSV-tiedoston, tekee yhden GET-pyynnön profiilia kohti, tarkistaa HTTP-vastauksen tilan ja tallentaa alkuperäiset keskeiset kentät yhdessä vertailun tuloksen kanssa. Asenna riippuvuus komennolla python -m pip install requests ja vie avain ympäristömuuttujaksi ennen käynnistystä.

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):
# The documented observed response wraps profile fields in "ig".
if payload.get("status") != "ok":
raise ValueError("API response status is not ok")
profile = payload.get("ig")
if not isinstance(profile, dict):
raise ValueError("Response has no profile object under '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),
})
# A small delay spaces requests; it is not a documented quota guarantee.
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)
Koodissa tarkistetaan nimenomaan havaittu vastauskuori: ulompi status ja profiiliobjekti ig. Jos palveluntarjoaja muuttaa muotoa, rakennetarkistus keskeyttää kyseisen tietueen käsittelyn ja tallentaa virheen sen sijaan, että loisi huomaamatta virheellisen vastaavuuden. Skripti ei tulosta avainta eikä tallenna sitä tulostiedostoon.
Tulosten tulkinta
preflight_results.csv-tiedoston rivit, joiden tila on matched, läpäisivät määritetyt vertailut. Arvo review tarkoittaa, että yksi tai useampi tieto eroaa briifistä; checks-sarake kertoo, mikä tieto poikkeaa. Pyyntö- tai vastausvirhe merkitään erikseen, joten tietojen puuttuminen ei näytä vahvistetulta vastaavuudelta.
Seuraajien ja julkaisujen määrä auttaa näkemään profiilin nykytilanteen hakemuksen rinnalla. Kyseessä ovat pyynnön vastaushetken arvot. Tallenna erilliset, päivämäärällä varustetut ajot, jos haluat arvioida muutoksia ajan mittaan; yksittäinen tarkistus ei sisällä historiaa. Kentät voivat olla tyhjiä, jolloin tietuetta voi edelleen käyttää tunnisteen ja muiden saatavilla olevien ominaisuuksien tarkistamiseen, mutta puuttuvan laskurin vertaamiseen se ei sovellu.
Automatisointi ennen kampanjan käynnistämistä
Kun olet tarkistanut testin CSV-tiedoston manuaalisesti, lisää skripti ajastettuun tehtävään tai kampanjan valmisteluvaiheeseen. Toistettavaa tarkistusta varten säilytä alkuperäinen luettelo erillään, kirjaa ajon päivämäärä ja tallenna tulos-CSV suojattuun työskentelytilaan. Jos käyttäjänimi voi vaihtua, käytä uudelleenkäsittelyssä järjestelmäsi pysyvää rivitunnistetta.
Kun luettelo kasvaa, lisää rinnakkaisuusrajoitus, tee uusia yrityksiä vain tilapäisten verkkovirheiden yhteydessä ja pidä erillistä virhekoodilokia ilman salaisuuksia. Älä yritä loputtomasti uudelleen virheellisellä avaimella tai virheellisellä käyttäjänimellä. Lisää cache_timeout vain tarpeisiisi sopivan tuoreuskäytännön mukaisesti: dokumentaation mukaan IGin välimuistitus on oletuksena pois käytöstä, ja nollaa suurempi arvo ottaa välimuistin käyttöön määritetyksi ajaksi.
Profiilin tarkistus vähentää manuaalisen vertailun konkreettiseksi poikkeamaluetteloksi: nimi, julkisuus, vahvistus ja saatavilla olevat laskurit ovat samassa taulukossa ennen kampanjan alkua. API-parametreja ja ajantasaisia integraatiovaihtoehtoja varten katso IG Scraper API -sivu ja reittien dokumentaatio.