公開TikTok動画でクリエイターがブランドとの関係をどのように開示しているかをチームで確認する場合、最初に目指すべきなのは自動判定ではなく、キャプション、リンク、検出されたマーカー語をまとめた簡潔な動画キューです。以下では、TikTok Scraper API jsonscraperに検索クエリを送信し、レスポンスの2種類の構造を共通形式にそろえ、担当者の確認用CSVに保存する方法を紹介します。
目的:確認が必要な動画を見つける
企業名で手動検索すると、同じ手順を繰り返すのが難しく、選定理由もブラウザー内に残ってしまいます。検索を自動化すれば、クエリ、実行日、見つかったコンテンツを表に保存できるため、チームは統一されたリストに沿って動画を確認できます。

この用途で「確認候補」とは、検索結果に返された動画のうち、説明文にあらかじめ指定した単語やフレーズが見つかったものを指すにすぎません。たとえば「広告」「パートナーシップ」「スポンサー」などです。このテキストフィルターは人の注意を促すのに役立ちますが、動画そのものを評価したり、適用される要件を満たしているかどうかを判定したりするものではありません。
この違いはマーケティングチームにとって重要です。米国連邦取引委員会(FTC)のガイダンスでは、ブランドとの重要な関係の開示はメッセージの文脈に応じた義務として説明されており、動画では視覚と音声の両方による開示を検討するようFTCが推奨しています。キャプション検索で検出できるのは、一部のテキスト上のシグナルです。結論を出すには、投稿を視聴し、文脈を評価する必要があります。FTCのクリエイター向けガイダンスでは、こうした条件が例を挙げて説明されています。
出力:選定理由を記録したCSV
このパイプラインは、動画IDごとに1行を記録し、説明文、リンク、投稿者名、利用可能な公開カウンター、該当したマーカーを含めます。検索クエリと収集時刻も別の列に加えます。これにより、表を作業キューとして引き継げるだけでなく、後から特定の動画が選ばれた理由も確認できます。
マーカーのリストは編集者またはコンプライアンス担当者が設定します。キャンペーンで実際に使われている言語や用語から始め、検索結果を確認して必要に応じてリストを広げましょう。以下のコードでは値を簡潔にしています。ブランド、地域、コンテンツの言語に合わせて置き換えてください。
TikTok Scraper APIへの接続
jsonscraperのドキュメントによると、動画検索にはベースURL https://tiktok.evelode.com の GET /searchVideo ルートを使用します。必須パラメーターは keyword で、追加パラメーターには count、date_posted、sort_by、region があります。キーは license_key として渡すため、コードやCSVではなく環境変数に保存してください。正確なパラメーター名とルートはTikTokエンドポイントのリファレンスに記載されています。製品とアクセスの情報はTikTok Scraper APIの製品ページで確認できます。
ローカルパーサーの網羅性に影響する重要な点として、データは tiktok.aweme_list、または tiktok.search_item_list[].aweme_info に含まれる場合があります。そのため、スクリプトは両方の配列を確認します。検索結果が空の場合は、架空の行で埋めずに空のCSVを作成します。
Pythonの例:検索、フィルター、CSV出力
この例ではPython 3.8以降の標準ライブラリのみを使います。実行前に環境変数 JSONSCRAPER_TIKTOK_LICENSE_KEY を設定してください。仕様に記載されているとおり、リクエストには keyword を使い、キーはクエリパラメーター license_key として渡します。

import csv
import json
import os
import sys
from datetime import datetime, timezone
from urllib.parse import urlencode
from urllib.request import Request, urlopen
API_KEY = os.environ["JSONSCRAPER_TIKTOK_LICENSE_KEY"]
KEYWORD = "Acme"
MARKERS = ["реклама", "партнерство", "партнёрство", "спонсор", "ad", "sponsored"]
params = {
"license_key": API_KEY,
"keyword": KEYWORD,
"count": 30,
"sort_by": "date-posted",
"date_posted": "this-month",
"region": "US",
}
url = "https://tiktok.evelode.com/searchVideo?" + urlencode(params)
request = Request(url, headers={"Accept": "application/json"})
with urlopen(request, timeout=30) as response:
payload = json.load(response)
if payload.get("status") != "ok":
raise RuntimeError("API returned a non-ok outer status")
tiktok = payload.get("tiktok") or {}
items = list(tiktok.get("aweme_list") or [])
for entry in tiktok.get("search_item_list") or []:
info = entry.get("aweme_info") or {}
if info:
items.append(info)
seen = set()
rows = []
collected_at = datetime.now(timezone.utc).isoformat()
for item in items:
video_id = item.get("aweme_id")
if not video_id or video_id in seen:
continue
seen.add(video_id)
description = item.get("desc") or ""
lowered = description.casefold()
matched = [word for word in MARKERS if word.casefold() in lowered]
if not matched:
continue
author = item.get("author") or {}
stats = item.get("statistics") or {}
rows.append({
"collected_at_utc": collected_at,
"search_keyword": KEYWORD,
"video_id": video_id,
"share_url": item.get("share_url") or "",
"description": description,
"matched_markers": "; ".join(matched),
"author_name": author.get("nickname") or "",
"author_id": author.get("unique_id") or "",
"play_count": stats.get("play_count", ""),
"digg_count": stats.get("digg_count", ""),
"comment_count": stats.get("comment_count", ""),
"share_count": stats.get("share_count", ""),
})
fields = [
"collected_at_utc", "search_keyword", "video_id", "share_url",
"description", "matched_markers", "author_name", "author_id",
"play_count", "digg_count", "comment_count", "share_count",
]
with open("tiktok_review_queue.csv", "w", newline="", encoding="utf-8-sig") as output:
writer = csv.DictWriter(output, fieldnames=fields)
writer.writeheader()
writer.writerows(rows)
print(f"Saved {len(rows)} review candidates to tiktok_review_queue.csv")
スクリプトはまず外側のステータスを確認し、次に tiktok オブジェクトを読み込んで、利用可能な配列形式を統合します。aweme_id による重複排除で、同じ動画がレスポンスの両方のパスに現れた場合に行が重複するのを防ぎます。指標は受け取った値のまま記録され、値がない場合はゼロに置き換えず空欄にします。
この例では、/searchVideo についてドキュメントに記載されたパラメーターを使用しています。date_posted には this-month、sort_by には date-posted を指定でき、region は国コードを受け取ります。count は取得する検索結果の件数を指定するもので、投稿をすべて取得できる保証ではありません。ページネーションを続ける場合は、返されたカーソルを不透明な値として保存し、cursor パラメーターに渡してください。
人による確認と実行の自動化
CSVを担当の確認者に渡し、リンクを開いて動画とキャプションの文脈を確認し、判断を記録するよう簡潔に案内してください。マーカーが別の意味で使われている場合はコメントも追加します。たとえば、自動フィルターでは、広告開示と広告の仕組みについての議論を区別できません。この意味上の隔たりを埋めるのが人による確認です。
収集を定期的に繰り返すには、cron、CIスケジューラー、またはタスクオーケストレーターでスクリプトを実行します。実行日を付けてCSVを保存するか、動画IDと観測日の組み合わせを一意のキーとして行を表に取り込みます。監査ログが必要な場合は、アクセス制御を設定したうえで元のJSONレスポンスも保管してください。変換を再検証し、各行の出所を説明できます。
実運用版では、ネットワークエラーやHTTPエラーへの対応、再試行回数の制限、失敗通知を追加するとよいでしょう。アクセスキーが含まれるため、リクエストURL全体を出力しないでください。複数のユーザーが利用するチームでは、実行環境のシークレット管理機能に認証情報を保存し、社内ルールに従って出力ファイルへのアクセスを制限するのが適切です。
このリストでできること
実行後、チームはキーワードで見つかった動画の再現可能な一覧と、各候補が確認キューに入った明確な理由を得られます。表から関連性のない一致を手動で除外し、確認担当者を割り当て、マーカーや投稿者ごとに結果をまとめることができます。定期的に収集すれば、特定の日付に返された検索結果にどの動画が含まれていたかという観測履歴も蓄積されます。
この方法は、コンテンツの初期検出と振り分けに適しており、ルールへの準拠を自動判定するものではありません。検索結果、選択したキーワード、リクエスト設定、テキストマーカーによる制約があります。個別のコラボレーションを確認する場合は、動画をブリーフやチームが利用できる情報と照合したうえで、適用されるルールに照らしてメッセージ自体を評価してください。
利用を始めるには、TikTok Scraper APIの製品ページで最新のアクセス情報とパラメーターを確認し、レスポンスの形式や連携方法はAPIの公式ドキュメントと照合してください。