Przed uruchomieniem kampanii możesz automatycznie porównać listę kont na IGie z briefem i otrzymać plik CSV zawierający tylko wpisy wymagające uwagi. Dla każdego wiersza skrypt pobierze dane profilu, porówna nazwę użytkownika, ustawienie prywatności i weryfikację z oczekiwanymi wartościami, a także zapisze dostępne liczniki. Dzięki temu powtarzalna ręczna kontrola staje się przejrzystym etapem weryfikacji przed rozpoczęciem kampanii.
Cel: wykryć rozbieżności przed publikacją
Arkusz kampanii zwykle zawiera nazwę konta i kilka oczekiwań: profil ma być publiczny, nazwa użytkownika powinna zgadzać się z ustaloną, a status weryfikacji — z informacją w briefie. Między przygotowaniem listy a uruchomieniem kampanii konto może zmienić nazwę, stać się prywatne albo okazać się innym profilem o podobnej nazwie. Ręczne sprawdzanie kolejnych wierszy trudno powtórzyć, a szybkie wyodrębnienie wyjątków bywa kłopotliwe.

Do takiej wstępnej diagnostyki wystarczy pobrać profil na podstawie nazwy użytkownika. W opublikowanej dokumentacji jsonscraper opisano trasę GET /v1/user/by/username z parametrem username; dostępny jest też opcjonalny parametr cache_timeout. Odpowiedź może zawierać nazwę użytkownika, imię i nazwisko, informacje o prywatności i weryfikacji, liczbę publikacji, obserwujących i obserwowanych, a także biografię. Konkretne pola należy odczytywać z faktycznej odpowiedzi: zrzut schematu potwierdza ich obecność w zaobserwowanej odpowiedzi, ale wartości mogą się różnić lub być nieobecne.
Przygotuj arkusz i zasady kontroli
Utwórz plik CSV profiles.csv z kolumnami username, expected_private i expected_verified. W dwóch ostatnich kolumnach wpisz oczekiwane wartości true lub false, a nazwę użytkownika podaj bez znaku @. Jeśli oczekiwanie dotyczące danego profilu jest nieznane, pozostaw komórkę pustą: skrypt nie powinien traktować braku oczekiwanej wartości jako błędu.
username,expected_private,expected_verified
examplebrand,false,true
anotheraccount,false,false
Ta kontrola ma dwa konkretne zadania: sprawdzić, czy pobrana nazwa użytkownika zgadza się z tą, której szukano, oraz wykryć różnice względem zapisanych oczekiwań dotyczących prywatności i weryfikacji. Liczniki i biografia są zapisywane jako kontekst do ręcznej oceny, a nie traktowane jako dowód jakości odbiorców czy przydatności twórcy do kampanii.
Skonfiguruj IG Scraper API
Zapisz klucz dostępu w zmiennej środowiskowej JSONSCRAPER_INSTAGRAM_LICENSE_KEY. Nie umieszczaj go w pliku CSV, kodzie źródłowym ani logach uruchomienia. Oficjalna dokumentacja endpointu IG opisuje trasę i nazwy parametrów; podstawowy adres API to https://ig.jsonscraper.com, a nazwa parametru klucza to license_key.
Zanim przetworzysz całą listę, wykonaj jedno próbne żądanie dla testowego wiersza, sprawdź strukturę JSON i upewnij się, że Twoje konto ma dostęp. Ponieważ endpoint przyjmuje nazwę użytkownika, w tym prostym scenariuszu nie są potrzebne znany identyfikator profilu ani dodatkowe trasy.
Przykład: żądania, porównanie i CSV z wyjątkami
Poniższy skrypt działa z Pythonem 3.8 lub nowszym. Odczytuje plik CSV, wysyła po jednym żądaniu GET dla każdego profilu, sprawdza zewnętrzny status odpowiedzi i zapisuje istotne pola źródłowe wraz z wynikiem porównania. Zainstaluj zależność poleceniem python -m pip install requests, a następnie przed uruchomieniem ustaw zmienną z kluczem.

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)
Kod sprawdza zaobserwowaną strukturę odpowiedzi: zewnętrzne pole status i obiekt profilu ig. Jeśli dostawca zmieni format, kontrola struktury przerwie przetwarzanie danego wpisu i zapisze błąd, zamiast po cichu uznać nieprawidłowy wynik za zgodność. Skrypt nie wyświetla klucza ani nie umieszcza go w pliku wynikowym.
Jak odczytywać wyniki
W pliku preflight_results.csv wiersze ze statusem matched przeszły określone porównania. Wartość review oznacza, że co najmniej jeden parametr różni się od danych w briefie; kolumna checks wskazuje, który. Błąd żądania lub odpowiedzi jest oznaczany osobno, więc niedostępność danych nie wygląda jak potwierdzona zgodność.
Liczba obserwujących i publikacji pomaga zobaczyć bieżący stan profilu obok zgłoszenia. Są to wartości z chwili otrzymania odpowiedzi na żądanie. Aby oceniać zmiany w czasie, zapisuj osobne wyniki z datami; pojedyncza kontrola nie zawiera historii. Niektóre pola mogą być puste. Wpis nadal nadaje się wtedy do sprawdzenia tożsamości i pozostałych dostępnych cech, ale nie do porównania brakującego licznika.
Automatyzacja przed uruchomieniem kampanii
Po ręcznym sprawdzeniu testowego pliku CSV dodaj skrypt do harmonogramu lub etapu przygotowania kampanii. Aby zapewnić powtarzalną kontrolę, przechowuj oddzielnie pierwotną listę, zapisuj datę uruchomienia i umieszczaj wynikowy plik CSV w zabezpieczonym miejscu pracy. Jeśli nazwa użytkownika może się zmienić, do ponownego przetwarzania używaj stabilnego identyfikatora wiersza z własnego systemu.
Wraz ze wzrostem listy dodaj limit równoległości, ponawiaj próby wyłącznie w przypadku przejściowych błędów sieciowych i prowadź osobny dziennik kodów błędów, bez sekretów. Nie ponawiaj bez końca żądań z nieprawidłowym kluczem lub błędną nazwą użytkownika. Parametr cache_timeout dodawaj tylko wtedy, gdy wymaga tego przyjęta polityka aktualności danych: dokumentacja podaje, że buforowanie danych z IGa jest domyślnie wyłączone, a wartość większa od zera włącza je na określony czas.
Kontrola profilu ogranicza ręczne porównywanie do konkretnej listy wyjątków: nazwa, widoczność, weryfikacja i dostępne liczniki znajdują się w jednej tabeli przed rozpoczęciem kampanii. Informacje o parametrach API i aktualnych opcjach integracji znajdziesz na stronie IG Scraper API oraz w dokumentacji tras.