Před spuštěním kampaně můžete seznam účtů na IGu zpracovat skriptem a získat JSON report s odpovědí API pro každé uživatelské jméno. Trasa IG Scraper API jsonscraper vrací vnější stav a objekt profilu; pozorované schéma obsahuje uživatelské jméno, příznaky soukromí a ověření, počet příspěvků, sledujících a sledovaných účtů. Tato pole pomáhají vytřídit záznamy k ruční kontrole, sama však nevysvětlují, proč odpověď chybí nebo je neočekávaná.

Problém: seznam účtů vypadá správně, ale je připraven k použití?
V pracovní tabulce kampaně se mohou objevit přejmenované účty, překlepy a soukromé profily. Pokud tým začne seznam analyzovat bez předběžné kontroly, musí člověk účty otevírat jeden po druhém. Automatický průchod omezuje ruční práci a vytváří jednotný záznam toho, co API vrátilo pro každé vyžádané uživatelské jméno.
Cíl tohoto postupu je omezený: projít seznam, uložit skutečné HTTP odpovědi a JSON a profily s vlastnostmi důležitými pro kampaň vyčlenit k ruční kontrole. Report zaznamenává pozorovaná data; neurčuje, proč se profil nevrátil nebo proč požadavek skončil chybou.
Co požadavek kontroluje
V dokumentaci jsonscraper je uvedena trasa GET /v1/user/by/username. Povinným parametrem je username; klíč se předává jako license_key. Volitelný parametr cache_timeout zapíná ukládání do mezipaměti na zadaný počet sekund, zatímco hodnota 0 ho ponechává vypnuté. Pozorované schéma úspěšné odpovědi obsahuje vnější status a objekt ig s poli profilu.
Při diagnostice rozlišujte tři skutečnosti: zda se podařilo provést HTTP požadavek, zda parsovaný JSON obsahuje objekt ig a která pole jsou v tomto objektu přítomna. Pokud některý krok neproběhne očekávaným způsobem, skript může zaznamenat technický výsledek a původní odpověď. Takový výsledek upozorňuje na nutnost kontroly, ale neurčuje příčinu problému.
Připravte vstupní data a klíč
Vytvořte soubor usernames.txt, do kterého zapíšete jedno uživatelské jméno na řádek, bez znaku @. Odstraňte prázdné řádky a duplicity a ponechte jen účty patřící ke kampani. Pro pozdější porovnání výsledků ukládejte zvlášť datum kontroly a identifikátor projektu.
Klíč uchovávejte v proměnné prostředí JSONSCRAPER_INSTAGRAM_LICENSE_KEY, nikoli ve zdrojovém kódu nebo repozitáři:
export JSONSCRAPER_INSTAGRAM_LICENSE_KEY="váš_klíč"
python3 check_profiles.py
Příklad používá standardní knihovnu Pythonu 3.8+ a nevyžaduje instalaci HTTP balíčků.
Příklad: vyžádejte profily a zapište report
Skript postupně zpracuje seznam, vždy jedno uživatelské jméno. Při úspěšné JSON odpovědi uloží skutečné tělo odpovědi a dostupná pole profilu; při HTTP nebo síťové chybě ji zaznamená jako technický výsledek. Chybějící pole zůstanou null a surové tělo odpovědi se uloží, pokud se ho podařilo přečíst.
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("Nastavte 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"Uloženo výsledků: {len(results)}")
Jde o příklad integrace, nikoli o zprávu o provedeném testu. Klíč se předává v parametru license_key, ale nevypisuje se. Úplná odpověď může obsahovat údaje, k nimž by měl být přístup omezen podle pravidel vašeho týmu pro uchovávání dat.
Jak číst výsledek
Záznam profile_returned znamená, že skript obdržel objekt JSON ig. Porovnejte requested_username s returned_username a zkontrolujte příznaky důležité pro proces kampaně. Například hodnotu is_private: true můžete předat k ruční kontrole, pokud kampaň vyžaduje veřejný profil.

Výsledky http_error, request_error a unexpected_or_missing_profile_object označují pouze fázi, v níž skript nezískal očekávanou strukturu. Nedokazují, že byl účet smazán, je soukromý nebo nedostupný z konkrétního důvodu. Uložte odpověď, zkontrolujte uživatelské jméno a klíč, poté požadavek zopakujte nebo kontaktujte standardní podporu služby.
Pokud pole chybí, ponechte jeho hodnotu jako neznámou — nepovažujte absenci za nulu nebo false. Počty v profilu popisují stav vrácený v okamžiku požadavku. Časová značka umožňuje odlišit tento snímek od výsledků dalšího spuštění.
Automatizace bez ztráty pozorovatelnosti
Přesuňte spuštění do plánovače úloh nebo do fáze stávajícího procesu ETL. Uchovávejte datum kontroly, vyžádané jméno, výsledek, stav a tělo odpovědi. V samostatném kroku můžete nahrát JSON do tabulky a posílat specialistovi pouze záznamy, které vyžadují kontrolu.
Chcete-li odhalovat změny, porovnávejte snímky jednoho profilu podle vybraných polí. Změna počtu příspěvků je důvodem profil otevřít a zkontrolovat, nikoli přesným údajem o datu zveřejnění příspěvku. Počet sledujících je rovněž hodnotou z okamžiku požadavku, takže historii pozorování vytvářejte z uložených snímků.
U dlouhého seznamu nastavte řízenou frekvenci, přidejte omezený počet opakovaných pokusů a veďte protokol chyb. Nevkládejte klíč do protokolů URL. Oddělené ukládání vstupního seznamu a výsledků pomáhá určit, které účty již byly zpracovány.
Očekávaný výsledek
Výsledkem je soubor JSON s výsledkem zpracování každého zadaného jména, časovou značkou, dostupnými atributy a uloženou odpovědí. Před předáním seznamu do kampaně můžete odfiltrovat shodná jména, soukromé profily a technické případy k ruční kontrole. Kritéria dalšího kroku určuje samotný tým.
Trasa a parametry jsou popsány v dokumentaci IG API; informace o produktu jsou uvedeny na stránce IG Scraper API. Začněte na malém vzorku, ověřte skutečnou podobu odpovědí a upravte pravidla reportu podle svého procesu.