Чтобы отобрать публичные 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.