jsonscraper
Rynki

Jak ocenić spójność tematyczną twórcy na TikToku na podstawie publicznych publikacji

Praktyczny potok w Pythonie do pobierania kanału twórcy, porównywania tematów i ostrożnego wykorzystania AI

Polityka redakcyjna Zgłoś błąd

Twórca może wydawać się odpowiedni do kampanii na podstawie profilu i kilku udanych filmów, ale jego najnowsze publikacje mówią coś ważniejszego: czy nadal regularnie porusza dany temat? Ręczna kontrola szybko się dezaktualizuje, a jednorazowy przegląd łatwo ogranicza się do wyboru najbardziej widocznych publikacji. Agencja lub marka może zamiast tego zebrać powtarzalną próbkę publicznych filmów, zachować stan na dzień kontroli i oceniać zgodność tematyczną według tych samych zasad.

Artykuł: Jak ocenić spójność tematyczną twórcy na TikToku na podstawie publicznych publikacji
Podsumowanie: Wyjaśniamy, jak marka lub agencja może ocenić, czy twórca na TikToku regularnie publikuje treści na określony temat: pobrać kanał przez API, zapisywać migawki, obliczać przejrzyste wskaźniki i przekazywać opisy filmów do klasyfikacji tematycznej.
Rola obrazu: okładka — główna idea
Sekcja: 
Przedstawiony temat: Wydrukowany raport analityczny z kartami filmów twórcy TikToka przedstawionymi jako neutralne ikony,
© jsonscraper · ilustracja wygenerowana przez AI

Poniżej przedstawiamy praktyczny proces oceny publicznego kanału twórcy na TikToku. Wykorzystuje on TikTok Scraper API jsonscraper i Pythona: pobiera publikacje przez udokumentowany endpoint, zapisuje surowy JSON, przekształca potwierdzone pola w tabelę i oblicza odsetek filmów pasujących do wybranego tematu. Opcjonalnie można przekazać opisy do klasyfikatora tekstowego jako kolejnego, osobno kontrolowanego etapu.

Najpierw określ, co oznacza „pasuje”

Załóżmy, że zespół wybiera twórcę do kampanii o domowym parzeniu kawy. Liczba obserwujących i popularność poszczególnych filmów mogą pomóc opisać zasięg, ale same nie odpowiadają na pytanie, jak mocno kanał jest związany z kawą. Wstępna selekcja wymaga cech związanych z treścią: czy opis filmu wspomina o parzeniu kawy, sprzęcie, przepisach lub recenzjach; ile publikacji na ten temat znalazło się w określonym okresie obserwacji; jaki odsetek zebranych filmów dotyczy tematu.

Przed zebraniem danych zapisz kryteria w krótkim słowniku, na przykład: „espresso”, „młynek do kawy”, „latte”, „parzenie”. Dodaj wykluczenia i niejednoznaczne słowa. „Kawa” może pojawić się w żarcie, reklamie lub przypadkowym kontekście, dlatego automatyczne dopasowanie tekstowe to wstępna klasyfikacja, a nie ostateczna ocena twórcy. Rozróżnij co najmniej trzy statusy: wyraźne dopasowanie, możliwe dopasowanie i film niepowiązany z tematem.

Próbkę także należy zdefiniować z wyprzedzeniem. Można na przykład analizować 20 ostatnich pobranych publikacji podczas każdego cotygodniowego uruchomienia. To warunek monitorowania, a nie gwarancja, że API zwróci dokładnie tyle elementów: dostępność i skład wyników zależą od odpowiedzi na konkretne zapytanie. Zapisuj czas pobrania, liczbę uzyskanych elementów i parametry zapytania, aby porównywać migawki bez mieszania różnych zasad.

Zapytanie o kanał twórcy

W dokumentacji jsonscraper endpoint GET /getUserFeed przyjmuje wymagany parametr query — nazwę użytkownika lub adres URL profilu. Wśród parametrów opcjonalnych wymieniono count, region, sort_type, with_pinned_posts i max_cursor. Klucz API przekazuje się jako license_key w ciągu zapytania; przechowuj go w zmiennej środowiskowej, a nie w kodzie źródłowym. Szczegóły endpointów i parametrów znajdują się w oficjalnej dokumentacji TikTok API.

W odpowiedzi najpierw sprawdź zewnętrzne pole status, a następnie odwołuj się do obiektu tiktok. Lista publikacji użytkownika znajduje się w tiktok.aweme_list. W zaobserwowanym schemacie występują identyfikator filmu, tekst opisu, czas publikacji, autor, adres URL i obiekt statystyk. Niektórych pól może brakować, dlatego obsługa odpowiedzi powinna zachowywać puste wartości jako puste, zamiast zastępować je wymyślonymi liczbami.

Poniższy minimalny przykład jest przeznaczony dla Pythona 3.8+ i biblioteki requests. Zapisz klucz w zmiennej JSONSCRAPER_TIKTOK_LICENSE_KEY. Kod wykonuje jedno zapytanie, sprawdza odpowiedź HTTP i zewnętrzny status API, zapisuje surowy JSON oraz wyświetla znormalizowane wiersze.

import json
import os
from datetime import datetime, timezone
from pathlib import Path

import requests

API_KEY = os.environ["JSONSCRAPER_TIKTOK_LICENSE_KEY"]
PROFILE = "creator_username"

params = {
    "license_key": API_KEY,
    "query": PROFILE,
    "count": 20,
    "region": "US",
    "sort_type": 0,
    "with_pinned_posts": 0,
}

response = requests.get(
    "https://tiktok.evelode.com/getUserFeed",
    params=params,
    timeout=30,
)
response.raise_for_status()
payload = response.json()

if payload.get("status") != "ok":
    raise RuntimeError("TikTok API returned a non-ok status")

tiktok = payload.get("tiktok") or {}
items = tiktok.get("aweme_list") or []

stamp = datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%SZ")
Path("snapshots").mkdir(exist_ok=True)
Path(f"snapshots/{PROFILE}_{stamp}.json").write_text(
    json.dumps(payload, ensure_ascii=False, indent=2),
    encoding="utf-8",
)

rows = []
for item in items:
    stats = item.get("statistics") or {}
    author = item.get("author") or {}
    rows.append({
        "aweme_id": item.get("aweme_id"),
        "created_at": item.get("create_time"),
        "description": item.get("desc") or "",
        "share_url": item.get("share_url"),
        "creator": author.get("unique_id") or author.get("nickname"),
        "play_count": stats.get("play_count"),
        "digg_count": stats.get("digg_count"),
        "comment_count": stats.get("comment_count"),
        "share_count": stats.get("share_count"),
    })

print(json.dumps(rows, ensure_ascii=False, indent=2))

Parametr sort_type dla tego endpointu opisano jako 0 dla najnowszego kanału i 1 dla najpopularniejszego. W przykładzie wybrano tryb najnowszych publikacji, a przypięte filmy wykluczono przez with_pinned_posts=0, aby stary przypięty post nie trafiał do próbki nowych publikacji. Jeśli potrzebujesz innego trybu, zapisuj parametr w metadanych migawki i stosuj go tak samo przy każdym uruchomieniu.

Przetwarzanie odpowiedzi: od JSON-u do odtwarzalnej tabeli

Warto zapisać surową odpowiedź przed jakimikolwiek przekształceniami. Pozwala to zweryfikować normalizację, ustalić, dlaczego dany wiersz jest pusty, i dostosować obsługę, jeśli zmieni się obecność pól opcjonalnych w odpowiedziach. W pamięci roboczej obok JSON-u zachowaj czas pobrania w UTC, profil użyty w zapytaniu, parametry i wersję skryptu. Nie umieszczaj klucza API w archiwum ani w logu.

Przy kolejnych uruchomieniach używaj aweme_id jako identyfikatora publikacji, jeśli to pole jest dostępne. Deduplikacja według tego identyfikatora zapobiega liczeniu tego samego filmu jako kilku publikacji po ponownym pobraniu. Jednocześnie przechowuj osobne migawki statystyk: liczby wyświetleń i reakcji dotyczą chwili obserwacji, a nie niezmiennych cech filmu. Jeśli brakuje pola statystyki, pozostaw je puste i wyłącz taki rekord z obliczania odpowiedniej miary.

Czas publikacji w schemacie oznaczono jako create_time. W tabeli analitycznej przekształć go w datę i zachowaj zarówno wartość źródłową, jak i znormalizowany czas UTC. Przed obliczeniami sprawdź kilka rzeczywistych rekordów z pobranej odpowiedzi, aby potwierdzić oczekiwany typ i jednostki. To szczególnie ważne przy tworzeniu wykresów czasowych: błąd konwersji czasu przesuwa publikacje między dniami i zniekształca porównanie tygodni.

Prosty klasyfikator tematyczny można zbudować bez modelu: normalizować tekst, wyszukiwać określone frazy i oznaczać dopasowania. Aby uzyskać lepszą klasyfikację, przygotuj ręcznie sprawdzony zestaw opisów oraz zasady postępowania w przypadkach granicznych. Następnie porównaj prosty filtr słownikowy z oceną człowieka: ustal, które wyrażenia powodują fałszywe dopasowania, i zaktualizuj słownik. Powstaje w ten sposób zrozumiały poziom bazowy, z którym można porównywać późniejsze zastosowanie AI.

import re

KEYWORDS = (
    "kawa", "espresso", "młynek do kawy", "latte", "parzenie",
)


def normalize(text):
    text = (text or "").casefold()
    return re.sub(r"\s+", " ", text).strip()


def classify(description):
    text = normalize(description)
    matches = [word for word in KEYWORDS if word in text]
    return {
        "topic_match": bool(matches),
        "matched_terms": matches,
    }

for row in rows:
    row.update(classify(row["description"]))

Słowo kluczowe w opisie może być przydatnym sygnałem, ale klasyfikator powinien zwracać zrozumiałe uzasadnienie: listę dopasowanych terminów, a nie tylko etykietę „tak/nie”. W przypadku modeli językowych użyj ustrukturyzowanego polecenia: przekaż opis filmu i ustalone kategorie, a następnie poproś o zwrócenie kategorii, krótkiego uzasadnienia i poziomu pewności. Zachowuj tekst źródłowy i odpowiedź modelu osobno. Decyzje wpływające na budżet lub wybór partnera sprawdzaj ręcznie, korzystając z linków do publikacji.

Obliczaj wskaźniki z jasno określonym mianownikiem

Do prostego raportu nadają się odsetek filmów tematycznych i częstotliwość publikacji. Odsetek to liczba filmów z potwierdzonym dopasowaniem tematycznym podzielona przez liczbę filmów, które udało się sklasyfikować. Zawsze pokazuj obie liczby, na przykład „7 z 18 sprawdzonych opisów”. Dzięki temu wynik jest czytelny i łatwiej zauważyć, gdy procent obliczono na podstawie zbyt małej próbki.

Częstotliwość publikacji można wyrazić jako liczbę pobranych filmów w ustalonym okresie, na przykład w ciągu ostatnich 30 dni. Granice okresu wyznaczaj na podstawie czasu pobrania i dat publikacji. Przy cotygodniowych migawkach zachowuj wynik każdego uruchomienia, a nie tylko zaktualizowany wiersz podsumowania: pozwala to śledzić zmiany tematyki i aktywności. Nie traktuj liczby zebranych elementów jako pełnego archiwum publikacji twórcy — analizuj faktycznie uzyskaną próbkę i jasno określ jej regułę.

Statystyki wyświetleń, polubień, komentarzy i udostępnień są przydatnym kontekstem dla każdego filmu. Do wartości bezwzględnych należy podchodzić ostrożnie: starsza publikacja mogła dłużej gromadzić reakcje. Porównując wyniki w obrębie jednego profilu, zapisuj czas każdego pobrania i analizuj zmiany tego samego filmu między migawkami. Nie określaj różnicy między dwiema migawkami mianem „tempa wzrostu”, jeśli nie zapisano odstępu czasu i dostępności pomiarów.

Przydatny wpis podsumowujący dla każdego profilu zawiera datę pobrania, wybrane parametry, liczbę uzyskanych publikacji, liczbę sklasyfikowanych opisów, liczbę dopasowań tematycznych, przykładowe adresy URL oraz krótką notatkę o niejednoznacznych przypadkach. Taka tabela pozwala pracownikowi zweryfikować wniosek, a innemu analitykowi powtórzyć metodę dla kolejnego profilu.

Paginacja i harmonogram

Jeśli próbka wymaga pobrania kolejnej strony, dokumentacja kanału profilu wskazuje max_cursor uzyskany z poprzedniej odpowiedzi. Przekazuj go bez zmian: kursor jest nieprzejrzystą wartością, którą należy zachować i odesłać do API. Jeśli planujesz pobierać kolejne strony, sprawdź również pole has_more w odpowiedzi. Ogranicz liczbę stron lub łączny budżet zapytań, aby pobieranie kończyło się w przewidywalny sposób.

cursor = None
all_items = []
max_pages = 3

for _ in range(max_pages):
    page_params = dict(params)
    if cursor is not None:
        page_params["max_cursor"] = cursor

    page_response = requests.get(
        "https://tiktok.evelode.com/getUserFeed",
        params=page_params,
        timeout=30,
    )
    page_response.raise_for_status()
    page_payload = page_response.json()

    if page_payload.get("status") != "ok":
        raise RuntimeError("TikTok API returned a non-ok status")

    page = page_payload.get("tiktok") or {}
    all_items.extend(page.get("aweme_list") or [])

    if not page.get("has_more"):
        break

    cursor = page.get("max_cursor")
    if cursor is None:
        break

Częstotliwość uruchomień dostosuj do zadania: do wstępnej oceny wystarczy uruchomienie ręczne; przy liście twórców cotygodniowy harmonogram może ujawniać zmiany bez ciągłego odpytywania. Zadanie można uruchomić przez cron, CI lub orkiestrator. Schemat jest prosty: pobrać profile z tabeli, wykonać zapytania z ograniczeniem równoległości, zapisać migawki, sprawdzić odsetek udanych odpowiedzi i wysłać podsumowanie do tabeli roboczej. Po błędzie tymczasowym ponawiaj zapytanie ograniczoną liczbę razy, z opóźnieniem; błędy uwierzytelnionych zapytań zapisuj osobno, aby sprawdzić klucz i konfigurację.

Gdzie przydaje się AI, a gdzie potrzebna jest kontrola

AI pomaga klasyfikować opisy zawierające slang, kilka języków lub sformułowania, które nie zawierają dokładnego słowa kluczowego. Najpierw ustal zamkniętą listę kategorii i poproś model, aby korzystał wyłącznie z tekstu opisu. Następnie zmierz jakość na niewielkiej próbce oznaczonej ręcznie: porównaj kategorie modelu z ocenami redaktora i osobno przeanalizuj błędy oraz niejednoznaczne przypadki. W raporcie lepiej podać odsetek zgodności modelu z ręczną klasyfikacją oraz liczbę sprawdzonych przykładów niż nieinterpretowalny wynik ogólny.

Nie zlecaj modelowi zadania „wybierz najlepszego twórcę” bez określenia kryteriów. Zamiast tego podziel proces na mierzalne cechy: udział tematyczny, regularność, przykłady trafnych filmów i zakres publicznych reakcji. Model może krótko podsumować te dane i wskazać linki potwierdzające wnioski; ostateczna decyzja należy do zespołu, który uwzględnia format kampanii, odbiorców i ustalenia z twórcą.

Jeśli analiza dotyczy treści sponsorowanych, osobno sprawdzaj, czy relacja twórcy z marką została ujawniona w samych publikacjach oraz czy spełniono obowiązujące wymagania. Wytyczne Federalnej Komisji Handlu USA wyjaśniają, że związek z marką powinien być wyraźnie ujawniony obok rekomendacji; biogram profilu lub ukryta część tekstu mogą nie wystarczyć, by informacja była widoczna dla odbiorców. Zobacz zalecenia FTC dla twórców w mediach społecznościowych. Monitorowanie publicznych danych pomaga zebrać materiał do kontroli, ale ocena zgodności z zasadami wymaga kontekstu konkretnego posta i kampanii.

Co otrzymasz na koniec

Po skonfigurowaniu potoku zespół otrzymuje datowane migawki publicznego kanału, tabelę publikacji z opisami i dostępnymi metrykami, a także powtarzalne obliczenie udziału tematycznego. Na tej podstawie można szybciej wybierać profile do dalszej kontroli, zauważać zmianę tematyki i dokumentować powody oceny. Metoda pozostaje weryfikowalna: surowy JSON, parametry zapytania, zasady klasyfikacji i linki do filmów pozwalają prześledzić drogę od danych do wniosku.

Na początek uruchom skrypt dla jednego profilu, zapisz surową odpowiedź i ręcznie sprawdź kilka klasyfikacji. Następnie ustal słownik tematów, zasady doboru próbki i format raportu. Gdy wyniki będą powtarzalne, dodaj harmonogram i kolejkę profili. Opis endpointów i parametrów znajdziesz w dokumentacji API, a przegląd produktu i dostępnych opcji integracji — na stronie TikTok Scraper API.

Praktyczna lista kontrolna przed uruchomieniem

  • Zapisz temat kampanii, słownik uwzględnianych pojęć i przykłady przypadków granicznych.
  • Ustal okno próbki, wartość count, sortowanie i ustawienie dotyczące przypiętych publikacji.
  • Przechowuj surowy JSON, datę pobrania i parametry osobno od tajnego klucza.
  • Do deduplikacji używaj aweme_id, jeśli identyfikator jest dostępny.
  • Odróżniaj brak wartości od zera i nie obliczaj średnich bez jasnego uzasadnienia.
  • Pokazuj wielkość próbki obok udziału tematycznego i dołączaj przykładowe linki.
  • Przed wykorzystaniem wyników klasyfikacji AI do decyzji o kampanii sprawdź je na ręcznie oznaczonej próbce.
  • Aktualizuj ocenę zgodnie z harmonogramem i porównuj migawki zebrane według tych samych zasad.

Ludzie

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

Czytaj dalejJak oceniać jakość leadów z TikToka na podstawie publicznych filmów: potok w Pythonie krok po kroku
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