Ennen kampanjaa IG-tilien luettelo voidaan käsitellä skriptillä, joka muodostaa JSON-raportin API:n vastauksesta kullekin käyttäjänimelle. jsonscraperin IG Scraper API -reitti palauttaa ulkoisen tilan ja profiiliobjektin; havaittuun skeemaan kuuluvat käyttäjänimi, yksityisyyden ja vahvistuksen ilmaisimet sekä julkaisujen, seuraajien ja seurattujen tilien määrät. Näiden kenttien avulla voidaan poimia tietueet manuaaliseen tarkistukseen, mutta ne eivät yksin selitä puuttuvan tai odottamattoman vastauksen syytä.

Ongelma: käyttäjätilien luettelo näyttää oikealta, mutta onko se valmis käyttöön?
Kampanjan työtaulukossa voi olla uudelleennimettyjä tilejä, kirjoitusvirheitä ja yksityisiä profiileja. Jos tiimi alkaa analysoida luetteloa ilman esitarkistusta, jonkun on avattava tilit yksitellen. Automaattinen läpikäynti vähentää manuaalista työtä ja jättää yhtenäisen lokin siitä, mitä API palautti kullekin pyydetylle käyttäjänimelle.
Tämän työnkulun tavoite on rajattu: käydä luettelo läpi, tallentaa todelliset HTTP-vastaukset ja JSON sekä nostaa manuaaliseen tarkistukseen profiilit, joissa on kampanjan kannalta tarvittavia ominaisuuksia. Raportti tallentaa havaintotiedot; se ei määritä, miksi profiilia ei palautettu tai miksi pyyntö epäonnistui.
Mitä pyyntö tarkistaa
jsonscraperin dokumentaatiossa mainitaan reitti GET \/v1\/user\/by\/username. Pakollinen parametri on username; avain välitetään parametrina license_key. Valinnainen parametri cache_timeout ottaa välimuistin käyttöön määritetyksi sekuntimääräksi, ja arvolla 0 se pysyy poissa käytöstä. Onnistuneen vastauksen havaittuun skeemaan kuuluvat ulkoinen status ja profiilikenttiä sisältävä ig-objekti.
Pidä diagnostiikassa erillään kolme asiaa: onnistuiko HTTP-pyyntö, sisältääkö jäsennetty JSON ig-objektin ja mitä kenttiä objektissa on. Jos jokin vaihe ei pääty odotetusti, skripti voi kirjata teknisen tuloksen ja alkuperäisen vastauksen. Tulos ilmaisee tarkistustarpeen, mutta ei määritä virheen syytä.
Valmistele syötetiedot ja avain
Luo tiedosto usernames.txt, jossa on yksi käyttäjänimi kullakin rivillä ilman @-merkkiä. Poista tyhjät rivit ja kaksoiskappaleet ja jätä mukaan vain kampanjaan liittyvät tilit. Säilytä tarkistuspäivä ja projektin tunniste erillään tuloksista, jotta niitä voi verrata myöhemmin.
Säilytä avain ympäristömuuttujassa JSONSCRAPER_INSTAGRAM_LICENSE_KEY, älä lähdekoodissa tai repositoriossa:
export JSONSCRAPER_INSTAGRAM_LICENSE_KEY="oma_avaimesi"
python3 check_profiles.py
Esimerkissä käytetään Python 3.8:n tai uudemman vakiokirjastoa, eikä HTTP-paketteja tarvitse asentaa.
Esimerkki: hae profiilit ja tallenna raportti
Skripti käy luettelon läpi yksi käyttäjänimi kerrallaan. Kun JSON-vastaus onnistuu, se tallentaa vastauksen varsinaisen sisällön ja saatavilla olevat profiilikentät; HTTP- tai verkkovirheen sattuessa se kirjaa teknisen lopputuloksen. Puuttuvat kentät jäävät arvoon null, ja raaka vastaus tallennetaan, jos sen lukeminen onnistuu.
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("Aseta 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"Tallennettuja tuloksia: {len(results)}")
Tämä on integraatioesimerkki, ei raportti suoritetusta testistä. Avain välitetään license_key-parametrina, mutta sitä ei tulosteta. Täydellinen vastaus voi sisältää tietoja, joiden käyttöoikeuksia on rajattava tiimin tietojen säilytyssääntöjen mukaisesti.
Tulosten tulkinta
Tietue profile_returned tarkoittaa, että skripti sai JSON-muotoisen ig-objektin. Vertaa kenttiä requested_username ja returned_username ja tarkista kampanjaprosessin kannalta olennaiset merkit. Jos kampanja esimerkiksi edellyttää julkista profiilia, is_private: true voidaan merkitä manuaaliseen tarkistukseen.

Tulokset http_error, request_error ja unexpected_or_missing_profile_object ilmaisevat vain vaiheen, jossa skripti ei saanut odotettua rakennetta. Ne eivät todista, että tili olisi poistettu, yksityinen tai saavuttamattomissa tietystä syystä. Tallenna vastaus, tarkista käyttäjänimi ja avain, tee sitten uusi pyyntö tai ota yhteyttä palvelun viralliseen tukeen.
Jos kenttä puuttuu, jätä sen arvo tuntemattomaksi — älä tulkitse puuttumista nollaksi tai arvoksi false. Profiilin laskurit kuvaavat pyyntöhetkellä palautettua tilannetta. Aikaleiman avulla tämän tilannekuvan voi erottaa seuraavan ajon tuloksista.
Automatisoi säilyttäen havaittavuus
Siirrä suoritus ajastettuun tehtävään tai nykyisen ETL-prosessin vaiheeksi. Tallenna tarkistuspäivä, pyydetty käyttäjänimi, tulos, tila ja vastausrunko. Erillisessä vaiheessa JSON voidaan ladata taulukkoon ja lähettää asiantuntijalle vain tarkistusta vaativat tietueet.
Muutosten havaitsemiseksi vertaa saman profiilin tilannekuvia valittujen kenttien perusteella. Julkaisujen määrän muutos on syy avata profiili ja tarkistaa se, ei tarkka tieto julkaisun ilmestymisajankohdasta. Myös seuraajien määrä kuvaa pyyntöhetkeä, joten havaintohistoria muodostuu tallennetuista tilannekuvista.
Jos luettelo on suuri, määritä hallittu pyyntötahti, lisää rajattu määrä uudelleenyrityksiä ja pidä virhelokia. Älä sisällytä avainta URL-osoitteen lokeihin. Syöteluettelon ja tulosten säilyttäminen erillään helpottaa sen selvittämistä, mitkä tilit on jo käsitelty.
Odotettu tulos
Tuloksena on JSON-tiedosto, jossa on kunkin annetun käyttäjänimen käsittelytulos, aikaleima, saatavilla olevat ominaisuudet ja tallennettu vastaus. Ennen luettelon siirtämistä kampanjaan voit suodattaa siitä täsmäävät käyttäjänimet, yksityiset profiilit ja tekniset tapaukset manuaalista tarkistusta varten. Tiimi määrittää itse seuraavan vaiheen kriteerit.
Reitti ja parametrit kuvataan IG API -dokumentaatiossa; tuotetiedot löytyvät IG Scraper API -sivulta. Aloita pienellä otoksella, tarkista vastausten todellinen rakenne ja mukauta raportointisäännöt omaan prosessiisi.