Przed rozpoczęciem kampanii można przetworzyć listę kont na IGie za pomocą skryptu i uzyskać raport JSON z odpowiedzią API dla każdej nazwy. Endpoint IG Scraper API jsonscraper zwraca status zewnętrzny i obiekt profilu; obserwowany schemat obejmuje nazwę użytkownika, informacje o prywatności i weryfikacji, liczbę postów, obserwujących oraz obserwowanych. Te pola pomagają wybrać wpisy do ręcznej weryfikacji, ale same nie wyjaśniają przyczyny braku odpowiedzi ani odpowiedzi nieoczekiwanej.

Problem: lista kont wygląda poprawnie, ale czy jest gotowa do użycia?
W arkuszu kampanii mogą znaleźć się konta, które zmieniły nazwę, zawierają literówki lub mają ustawiony profil prywatny. Jeśli zespół zacznie analizować listę bez wstępnej kontroli, ktoś będzie musiał otwierać konta pojedynczo. Automatyczne sprawdzenie ogranicza ręczną pracę i pozostawia jednolity dziennik tego, co API zwróciło dla każdej żądanej nazwy.
Cel tego procesu jest ograniczony: przejść przez listę, zapisać rzeczywiste odpowiedzi HTTP i JSON, a profile z istotnymi dla kampanii cechami skierować do ręcznej weryfikacji. Raport rejestruje zaobserwowane dane; nie określa, dlaczego profil nie został zwrócony ani dlaczego żądanie zakończyło się błędem.
Co sprawdza żądanie
W dokumentacji jsonscraper opisano endpoint GET \/v1\/user\/by\/username. Wymaganym parametrem jest username; klucz przekazuje się jako license_key. Opcjonalny parametr cache_timeout włącza buforowanie na określoną liczbę sekund, a wartość 0 pozostawia je wyłączone. Obserwowany schemat poprawnej odpowiedzi zawiera zewnętrzne pole status i obiekt ig z polami profilu.
Na potrzeby diagnostyki rozdziel trzy fakty: czy udało się wykonać żądanie HTTP; czy sparsowany JSON zawiera obiekt ig; jakie pola znajdują się w tym obiekcie. Jeśli którykolwiek etap nie przebiegnie zgodnie z oczekiwaniami, skrypt może zapisać wynik techniczny i surową odpowiedź. Taki wynik wskazuje na potrzebę weryfikacji, ale nie ustala przyczyny problemu.
Przygotuj dane wejściowe i klucz
Utwórz plik usernames.txt, wpisując po jednej nazwie użytkownika w wierszu, bez znaku @. Usuń puste wiersze i duplikaty, pozostawiając tylko konta powiązane z kampanią. Aby móc później porównywać wyniki, przechowuj osobno datę kontroli i identyfikator projektu.
Przechowuj klucz w zmiennej środowiskowej JSONSCRAPER_INSTAGRAM_LICENSE_KEY, a nie w kodzie źródłowym ani repozytorium:
export JSONSCRAPER_INSTAGRAM_LICENSE_KEY="twój_klucz"
python3 check_profiles.py
Przykład korzysta ze standardowej biblioteki Pythona 3.8+ i nie wymaga instalowania pakietów HTTP.
Przykład: pobierz profile i zapisz raport
Skrypt przetwarza listę, wysyłając żądanie dla każdej nazwy z osobna. Po otrzymaniu poprawnej odpowiedzi JSON zapisuje jej rzeczywistą treść i dostępne pola profilu; w przypadku błędu HTTP lub sieci zapisuje go jako wynik techniczny. Brakujące pola pozostają ustawione na null, a surowa treść odpowiedzi zostaje zapisana, jeśli udało się ją odczytać.
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("Ustaw 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"Zapisano wyników: {len(results)}")
To przykład integracji, a nie informacja o przeprowadzonym teście. Klucz jest przekazywany w parametrze license_key, ale nie jest wyświetlany. Pełna odpowiedź może zawierać informacje, do których dostęp należy ograniczyć zgodnie z zasadami przechowywania danych obowiązującymi w zespole.
Jak odczytywać wyniki
Wpis profile_returned oznacza, że skrypt otrzymał obiekt JSON ig. Porównaj requested_username z returned_username i sprawdź informacje istotne dla procesu kampanii. Na przykład is_private: true można skierować do ręcznej weryfikacji, jeśli kampania wymaga profilu publicznego.

Wyniki http_error, request_error i unexpected_or_missing_profile_object wskazują jedynie etap, na którym skrypt nie otrzymał oczekiwanej struktury. Nie dowodzą, że konto zostało usunięte, jest prywatne ani że jest niedostępne z konkretnego powodu. Zapisz odpowiedź, sprawdź nazwę i klucz, a następnie ponów żądanie lub skontaktuj się ze standardową pomocą techniczną usługi.
Jeśli brakuje pola, pozostaw je jako nieznane — nie interpretuj braku jako zera ani false. Liczniki profilu opisują stan zwrócony w chwili wysłania żądania. Znacznik czasu pozwala odróżnić ten zrzut od wyników kolejnego uruchomienia.
Automatyzacja bez utraty widoczności
Przenieś uruchamianie do harmonogramu zadań lub etapu istniejącego procesu ETL. Przechowuj datę kontroli, żądaną nazwę, wynik, status i treść odpowiedzi. W osobnym kroku możesz wczytać JSON do tabeli i wysyłać specjaliście tylko wpisy wymagające weryfikacji.
Aby wykrywać zmiany, porównuj zrzuty tego samego profilu według wybranych pól. Zmiana liczby postów to powód, by otworzyć profil i go sprawdzić, a nie dokładna data publikacji posta. Liczba obserwujących również odzwierciedla stan z chwili żądania, dlatego historia obserwacji powstaje z zapisanych zrzutów.
W przypadku dużej listy ustaw kontrolowane tempo, dodaj ograniczoną liczbę ponowień i rejestruj błędy. Nie umieszczaj klucza w logach adresów URL. Oddzielne przechowywanie listy wejściowej i wyników ułatwia ustalenie, które konta zostały już przetworzone.
Oczekiwany rezultat
Wynikiem jest plik JSON zawierający rezultat przetworzenia każdej podanej nazwy, znacznik czasu, dostępne atrybuty i zapisaną odpowiedź. Przed przekazaniem listy do kampanii można odfiltrować pasujące nazwy, profile prywatne i przypadki techniczne wymagające ręcznej weryfikacji. Kryteria kolejnego kroku określa sam zespół.
Endpoint i parametry opisano w dokumentacji IG API; informacje o produkcie znajdują się na stronie IG Scraper API. Zacznij od niewielkiej próbki, sprawdź rzeczywistą strukturę odpowiedzi i dostosuj reguły raportu do swojego procesu.