Щоб відібрати публічні відео TikTok зі згадками бренду й явними рекламними формулюваннями, зберіть результати за кількома пошуковими запитами, витягніть описи та позначте слова-маркери. Результат — CSV із посиланнями й доступними показниками, тобто черга для перевірки людиною, а не автоматичний висновок про дотримання правил.
Такий процес стане в пригоді агенції, що звіряє кампанію з брифом, або внутрішній команді, яка веде список публічних згадок. Він допомагає впорядкувати результати пошуку та зберігає ознаки, за якими аналітик вирішує, який ролик відкрити й переглянути.
Що саме шукати у відео?
Для перевірки реклами важливі зв’язок автора з брендом і те, як його розкрито поруч із рекомендацією. Посібник FTC для інфлюенсерів пояснює, що істотний зв’язок може бути фінансовим, робочим, особистим або сімейним, а розкриття має бути помітним і зрозумілим. Для відеорекомендацій FTC зазначає, що розкриття слід розмістити в самому відео, а не лише в описі. Тому опис корисний для сортування, але сам по собі не показує, що глядач побачив у кадрі або почув в аудіо.
Завдання цього сценарію вужче: знайти серед отриманих результатів пошуку відео, описи яких містять назви бренду й можливі маркери на кшталт «реклама», «спонсор» або «партнерство». Словник потрібно налаштувати відповідно до мови й термінології кампанії. Якщо маркер не трапився в описі, відкрийте ролик і перевірте його вміст: текстовий збіг не встановлює, чи є розкриття в самому відео.
Як перетворити результати пошуку на чергу перевірки?
Складіть короткий список запитів: назва бренду, кампанії та поширений варіант написання продукту. Виконуйте запити окремо й зберігайте їхні формулювання поруч із результатами. Так команда зможе побачити, за яким запитом знайдено ролик, і за потреби повторити збір.


Для збору підійде TikTok Scraper API від jsonscraper. Документований маршрут GET /searchVideo розташований за адресою https://tiktok.evelode.com і приймає параметри keyword, count, date_posted, sort_by, region і cursor. У спостереженій відповіді дані TikTok містили ролики в search_item_list[].aweme_info; aweme_list міг бути порожнім. Наведений нижче парсер перевіряє обидва розташування.
Ключ передається в параметрі license_key. Зберігайте його в змінній середовища, а не у скрипті чи репозиторії. Документація маршрутів TikTok містить назви параметрів пошуку; для наступної сторінки використовуйте повернений cursor. Зберігайте кількість оброблених об’єктів і сам пошуковий запит: пагінація дає змогу продовжувати перегляд результатів, але сама по собі не підтверджує повноту набору.
Мінімальний приклад на Python
Скрипт виконує по одному запиту для кожної фрази, збирає обидві задокументовані форми результатів, видаляє дублікати за ID відео, позначає слова в описі й записує CSV. Установіть requests командою python -m pip install requests, задайте JSONSCRAPER_TIKTOK_LICENSE_KEY в середовищі й запустіть файл. Приклад сумісний із Python 3.8 і новішими версіями.
import csv
import os
import sys
import requests
BASE_URL = "https://tiktok.evelode.com/searchVideo"
KEY = os.environ.get("JSONSCRAPER_TIKTOK_LICENSE_KEY")
if not KEY:
raise SystemExit("Set JSONSCRAPER_TIKTOK_LICENSE_KEY first")
QUERIES = ["Example Brand", "Example Product", "Example Campaign"]
MARKERS = ("#реклама", "реклама", "спонсор", "партнерство", "партнёрство", "#ad", "sponsored")
def videos_from(payload):
data = payload.get("tiktok") or {}
videos = data.get("aweme_list") or []
if not videos:
videos = [
item.get("aweme_info")
for item in (data.get("search_item_list") or [])
if isinstance(item, dict) and isinstance(item.get("aweme_info"), dict)
]
return [video for video in videos if isinstance(video, dict)]
rows = {}
for query in QUERIES:
response = requests.get(
BASE_URL,
params={"keyword": query, "count": 20, "date_posted": "this-month", "license_key": KEY},
timeout=30,
)
response.raise_for_status()
payload = response.json()
if payload.get("status") != "ok":
print("Unexpected API status for query:", query, file=sys.stderr)
continue
for video in videos_from(payload):
video_id = video.get("aweme_id")
if not video_id:
continue
author = video.get("author") or {}
stats = video.get("statistics") or {}
caption = video.get("desc") or ""
matched = [word for word in MARKERS if word in caption.casefold()]
row = rows.setdefault(str(video_id), {
"video_id": str(video_id),
"url": video.get("share_url") or "",
"author": author.get("unique_id") or author.get("nickname") or "",
"caption": caption,
"queries": set(),
"disclosure_markers": set(),
"play_count": stats.get("play_count"),
"digg_count": stats.get("digg_count"),
"comment_count": stats.get("comment_count"),
"review_status": "manual_review",
})
row["queries"].add(query)
row["disclosure_markers"].update(matched)
with open("tiktok_disclosure_review.csv", "w", newline="", encoding="utf-8-sig") as file:
fields = ["video_id", "url", "author", "caption", "queries", "disclosure_markers",
"play_count", "digg_count", "comment_count", "review_status"]
writer = csv.DictWriter(file, fieldnames=fields)
writer.writeheader()
for row in rows.values():
row["queries"] = " | ".join(sorted(row["queries"]))
row["disclosure_markers"] = " | ".join(sorted(row["disclosure_markers"]))
writer.writerow(row)
print("Saved", len(rows), "unique returned videos")
Перш ніж зберігати код, перевірте статус зовнішньої відповіді, а потім дані в tiktok. Нормалізатор читає обидва розташування роликів. Для наступної сторінки можна передати отриманий cursor у наступний запит без перетворення; цей мінімальний приклад навмисно обмежено однією сторінкою на запит.
Що покаже CSV?
Кожен рядок пов’язує ID і посилання на відео, доступний ідентифікатор автора, опис, пошукові фрази та знайдені маркери. Якщо у відповіді є показники переглядів, уподобань і коментарів, вони зберігаються як контекст для визначення черговості перевірки. Ці поля можуть бути відсутніми; скрипт залишає їх порожніми, а не підставляє нулі.
Потім відкрийте ролик, перевірте наявність і помітність розкриття у відео та зафіксуйте результат за узгодженими категоріями, наприклад «знайдено», «потрібна додаткова перевірка» або «не виявлено під час перегляду». Сам код шукає точні текстові маркери в описі; він не аналізує зображення й аудіо та не ухвалює рішення про відповідність правилам.
Для регулярного процесу запускайте збір за розкладом, записуйте час запиту й зберігайте вихідний JSON разом із CSV. Обмежте список запитів потрібними фразами та термін зберігання зібраних даних. У політиці відповідального збирання даних jsonscraper ідеться про розумну частоту запитів, мінімізацію даних і перевірку результатів ШІ перед подальшими діями.
Результат — відтворювана черга публічних відео для ручної перевірки рекламних розкриттів: збіги пошуку й доступні метрики допомагають визначити, що відкрити першим, а оцінювання самого ролика залишається за перевіряльником. Назви параметрів можна звірити в документації TikTok API, а відомості про продукт — на сторінці TikTok Scraper API.