jsonscraper
Rynki
Powrót do dziennika

Sprawdź profil na IGie przed kampanią: walidacja przez API

Skrypt w Pythonie sprawdza nazwę użytkownika, widoczność profilu, weryfikację i liczniki, a następnie oznacza rozbieżności do ręcznej kontroli.

Polityka redakcyjna Zgłoś błąd

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.

Artykuł: Sprawdź profil na IGie przed kampanią: walidacja przez API
Podsumowanie: Przed uruchomieniem kampanii automatycznie sprawdź profile na IGie z briefu: pobierz dane przez udokumentowany endpoint jsonscraper, porównaj je z oczekiwanymi wartościami i zapisz czytelną listę wyjątków.
Rola obrazu: okładka — główna idea
Sekcja: Cel: wykryć rozbieżności przed publikacją
Temat wizualny: redakcyjna martwa natura: arkusz planowania kampanii z kilkoma odrębnymi profilami na IGie
Wstępna kontrola porównuje profil z oczekiwanymi parametrami briefu i wskazuje wiersze do ręcznej oceny.© jsonscraper · utworzone z pomocą AI

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.

Artykuł: Sprawdź profil na IGie przed kampanią: walidacja przez API
Podsumowanie: Przed uruchomieniem kampanii automatycznie sprawdź profile na IGie z briefu: pobierz dane przez udokumentowany endpoint jsonscraper, porównaj je z oczekiwanymi wartościami i zapisz czytelną listę wyjątków.
Rola obrazu: ilustracja uzupełniająca 2 — inny konkretny aspekt
Sekcja: Przykład: żądania, porównanie i CSV z wyjątkami
Temat wizualny: infografika po rosyjsku pokazująca przepływ zweryfikowanych danych
Schemat przedstawia drogę od CSV przez endpoint profilu do wyników porównania: zgodność, ręczna kontrola lub błąd.© jsonscraper · ilustracja wygenerowana przez AI
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.

Ludzie

Nie ma jeszcze żadnych osób na liście dla tego artykułu.

Czytaj dalejIG: jak wykrywać problemy z profilami publicznymi przed startem kampanii
Przeczytaj następny artykuł

Zmień lekturę w działającą integrację

Poznaj API danych społecznościowych jsonscraper, testuj zapytania i buduj kolejne procesy.

Poznaj API