ブランドへの言及や明示的な広告表現を含む公開TikTok動画を抽出するには、複数の検索クエリで結果を集め、キャプションを取り出して目印となる語句をマークします。最終的に得られるのは、リンクと利用可能な指標をまとめたCSV、つまり人が確認するためのキューであり、コンプライアンスに関する自動判定ではありません。
この方法は、キャンペーンの内容をブリーフと照合する代理店や、公開されたブランド言及の一覧を管理する社内チームに役立ちます。検索結果を体系的に整理し、分析担当者がどの動画を開いて調べるか判断するための手がかりを残せます。
動画では何を確認するのか?
広告表示の確認では、投稿者とブランドの関係、そして推奨の近くでその関係がどのように開示されているかが重要です。FTCのインフルエンサー向けガイダンスでは、重要な関係には金銭的、雇用上、個人的、または家族関係が含まれ得ること、また開示は目立ち、分かりやすいものであるべきことが説明されています。動画で商品を推奨する場合、FTCは説明文だけでなく動画内で開示するよう示しています。そのため、キャプションは絞り込みには役立ちますが、視聴者が画面上で何を見たか、音声で何を聞いたかまでは、それだけでは分かりません。
このスクリプトの目的はより限定的です。検索結果として返された動画のうち、キャプションにブランド関連の語句や、「広告」「スポンサー」「パートナーシップ」などの可能性のある目印が含まれるものを見つけます。語句のリストは、キャンペーンの言語や用語に合わせて調整してください。キャプションに目印がなければ動画を開いて内容を確認します。テキストが一致しただけでは、動画内に開示があるかどうかは判断できません。
検索結果を確認キューにするには?
ブランド名、キャンペーン名、製品名の一般的な表記など、少数の検索クエリを用意します。各クエリを個別に実行し、その文言を結果とともに保存します。そうすれば、どのクエリで動画が見つかったかをチームが把握でき、必要に応じて収集を再現できます。


データの収集にはjsonscraperのTikTok Scraper APIが利用できます。文書化された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の最小サンプル
このスクリプトは各フレーズについて1回ずつリクエストし、文書化された2種類の結果形式を収集し、動画IDで重複を除き、説明文中の語句をマークしてCSVに書き込みます。python -m pip install requestsで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のデータを確認してください。正規化処理は動画の配置先を2種類とも読み取ります。次のページを取得するには、受け取ったcursorを変換せずに次のリクエストに渡せます。この最小サンプルは、意図的にクエリごとに1ページだけを処理します。
CSVには何が出力される?
各行には、動画IDとリンク、取得できた投稿者ID、キャプション、検索フレーズ、該当した目印がまとめられます。レスポンスに再生数、いいね数、コメント数が含まれていれば、確認の優先順位を決めるための参考情報として保存されます。これらの項目は存在しない場合があり、そのときスクリプトはゼロを補うのではなく空欄にします。
次に動画を開き、動画内に開示があるか、また目立つ形で表示されているかを確認し、「確認済み」「追加確認が必要」「視聴時に見つからず」など、合意済みの分類で結果を記録します。このコードが検索するのはキャプション内の完全一致するテキストの目印だけです。映像や音声を解析したり、ルールへの適合性を判定したりはしません。
定期的に運用する場合は、スケジュールに沿って収集を実行し、リクエスト時刻を記録して、元のJSONをCSVとともに保存してください。クエリは必要なフレーズに絞り、収集データの保存期間を設定します。jsonscraperの責任あるデータ収集ポリシーでは、適切な頻度でのリクエスト、データの最小化、後続の行動を取る前にAIの結果を確認することが推奨されています。
こうして、広告表示を手動で確認するための、再現可能な公開動画のキューができます。検索との一致や利用可能な指標は、どの動画から開くかを決める助けになりますが、動画そのものの評価は確認担当者が行います。パラメーター名はTikTok APIのドキュメントで、製品の情報はTikTok Scraper APIのページで確認できます。