特定のTikTok動画に関する情報がアプリケーションで必要な場合は、まずリクエストを1つ送信し、どのようなデータが返るかを確認するとよいでしょう。その後、レスポンスを検証して、保存や分析に備えることができます。
jsonscraperのTikTok Scraper APIには、動画、ユーザー、検索、ハッシュタグ、音楽など、さまざまなデータ向けのルートが掲載されています。ここでは、ドキュメントに記載されたgetVideoByIDリクエストと、レスポンスを安全に処理する方法を見ていきます。以下の例は提供元の資料に基づいています。利用前に、有効なキーと最新のドキュメントで確認してください。
最初のリクエスト:動画情報を取得する
PostmanのgetVideoByIDドキュメントには、GETメソッドとvideo_idパラメーターが記載されています。例にはregionとcache_timeoutも示されています。サービスページに掲載されているベースURLはhttps:\/\/tiktok.evelode.comです。
cURLを使ったリクエスト例:
export JSONSCRAPER_LICENSE_KEY="あなたのキー"
curl --get "https:\/\/tiktok.evelode.com\/getVideoByID" \\
--data-urlencode "video_id=7106855913906081070" \\
--data-urlencode "license_key=$JSONSCRAPER_LICENSE_KEY" \\
--data-urlencode "region=US"
例のIDは、公開されているリクエストから取得したものです。確認したい動画のIDに置き換えてください。キーは環境変数またはシークレット管理ツールに保存し、公開リポジトリ、クライアント側のJavaScript、ログには含めないでください。
Postmanではregionを地域コードとして説明しており、デフォルト値はUSと記載されています。cache_timeoutについては、デフォルトのキャッシュ期間が3600秒で、値に0を指定するとキャッシュが無効になると説明されています。このパラメーターが用途に必要な場合は、明示的に指定できます。
curl --get "https:\/\/tiktok.evelode.com\/getVideoByID" \\
--data-urlencode "video_id=7106855913906081070" \\
--data-urlencode "license_key=$JSONSCRAPER_LICENSE_KEY" \\
--data-urlencode "region=US" \\
--data-urlencode "cache_timeout=0"
これはルートについて公開されているパラメーターを応用した例であり、すべてのレスポンスが同じ構造になることや、どの用途でもキャッシュ無効化が適切であることを保証するものではありません。導入前に、現在のコレクションで認証方法とパラメーターを確認してください。Postmanでは設定済みのAPI Keyを使ってキーを渡す場合がありますが、上記のcURL例ではURLパラメーターとして指定しています。
Pythonで同じリクエストを送信する
以下はPython標準ライブラリを使った例です。GETリクエストを作成してパラメーターを渡し、ネットワークエラー、HTTPエラー、JSONの解析エラーを処理します。
import json
import os
from urllib.error import HTTPError, URLError
from urllib.parse import urlencode
from urllib.request import Request, urlopen
base_url = "https:\/\/tiktok.evelode.com\/getVideoByID"
license_key = os.environ.get("JSONSCRAPER_LICENSE_KEY")
if not license_key:
raise RuntimeError("環境変数 JSONSCRAPER_LICENSE_KEY を設定してください")
params = {
"video_id": "7106855913906081070",
"license_key": license_key,
"region": "US",
}
url = f"{base_url}?{urlencode(params)}"
request = Request(url, method="GET")
try:
with urlopen(request, timeout=30) as response:
status_code = response.status
payload = json.loads(response.read().decode("utf-8"))
except HTTPError as error:
print(f"HTTPエラー:{error.code}")
raise
except URLError as error:
print(f"ネットワークエラー:{error.reason}")
raise
except json.JSONDecodeError:
raise RuntimeError("サービスのレスポンスをJSONとして解析できませんでした")
print("HTTPステータス:", status_code)
print("トップレベルのキー:", list(payload.keys()))
これはドキュメントに記載されたリクエストを応用したもので、提供元がPython用として個別にテストした例ではありません。また、サービスで起こり得るすべてのレスポンスを網羅するものでもありません。キーはURLで渡されるため、完全なURLをログに出力しないでください。秘密情報が含まれる可能性があります。
JSONレスポンスを確認する方法
Postmanで公開されているレスポンス例には、statusフィールドと、動画や投稿者のデータを含むtiktok.aweme_detailオブジェクトがあります。これは1つのレスポンス形式の例であり、スキーマが不変であることを保証するものではありません。getVideoByIDのレスポンス例で確認できます。
ネストされたフィールドを読み取る際は、各階層を確認してください。
def get_video_details(payload):
tiktok = payload.get("tiktok")
if not isinstance(tiktok, dict):
return None
details = tiktok.get("aweme_detail")
if not isinstance(details, dict):
return None
return details
details = get_video_details(payload)
if details is None:
print("レスポンスに想定した動画データオブジェクトがありません")
else:
video_id = details.get("id")
description = details.get("desc")
author = details.get("author")
print("ID:", video_id)
print("説明:", description)
print("投稿者:", author)
フィールド名は公開されている例から取得したものです。.get()による確認は、フィールドが必須であることを意味しません。想定した値がないレスポンスを処理できるようにするためのものです。アプリケーションのロジックが特定のフィールドに依存する場合は、自分の用途におけるレスポンスで存在を確認し、フィールドがない場合の動作も用意してください。
次の3つのチェックを分けると便利です。
- 通信:HTTPレスポンスを受信できたか、そのステータスは何か。
- 形式:レスポンス本文をJSONとして解析できたか。
- 内容:アプリケーションが必要とするデータが含まれているか。
JSONの解析に成功しても、必要なオブジェクトがレスポンスに含まれているとは限りません。診断用には技術的なエラーやチェック結果を記録し、キーはマスキングしてください。
1回のリクエストから実用的なパイプラインへ
プロトタイプなら、リクエストを送信していくつかの値を出力するだけで十分です。定期的に処理する場合は、作業を次の段階に分けてください。
リクエスト → 検証 → 正規化 → 重複排除 → 保存。
- リクエスト。ドキュメントに記載されたルートからレスポンスを取得し、技術的なステータスを別途保存します。
- 検証。本文をJSONとして解析できることと、用途に必要なデータが含まれていることを確認します。
- 正規化。必要な値を独自のデータモデルに移します。アプリケーションが一部のフィールドしか必要としない場合は、ネストされた構造全体をデータベースへ移さないでください。
- 重複排除。対象のIDが存在し、用途に適していることを確認したうえで識別子を選びます。すべてのレスポンスで常に利用できるとは想定しないでください。
- 保存。必要であれば、リクエスト時刻と元のレスポンスを、正規化したレコードとは分けて保存します。アプリケーションがどのような変更を加えたかを把握しやすくなります。
これらはアプリケーション設計上の推奨事項であり、サービスの機能として扱うべきものではありません。外部レスポンスと内部モデルを分けておけば、変更への対応も容易になります。コード全体を調べるのではなく、検証や正規化の段階で問題を特定できます。
リクエストを繰り返す場合は、いつデータを更新するか、どのエラーを再試行するかをあらかじめ決めてください。再試行回数には上限を設けましょう。無限に繰り返しても、誤ったパラメーターや認証の問題は解決しません。
キャッシュと地域
getVideoByIDルートの説明では、cache_timeoutパラメーターは秒単位のキャッシュ期間を指定します。デフォルトは3600秒で、0を指定するとキャッシュが無効になるとされています。regionは国コードとして説明され、ドキュメントにはUSの例が示されています。導入前に、最新のPostmanリクエストドキュメントで情報を確認してください。
キャッシュ設定が存在するからといって、特定のレスポンスが最新であることが保証されるわけではありません。鮮度が重要な場合は、自分の用途のデータでリクエストを繰り返した結果を確認し、適切な動作を選んでください。
次に調べられる用途
製品ページには、動画やユーザーの検索、ハッシュタグ、場所、音楽、トレンド向けのルートが掲載されています。例として、searchVideo、searchHashtag、getUserFeed、getTrendingFeedがあります。これは提供元が公開しているルート一覧であり、それぞれを独立して検証したものではありません。パラメーターやレスポンス形式は各ルートのドキュメントで確認してください。getVideoByIDの例をそのまま適用できるとは限りません。
jsonscraperは、キーの設定やリクエストの実行にPostmanコレクションを使う方法を紹介しています。連携コードを書く前に個別のルートを試す手段として便利な場合があります。サービスでは自動化のシナリオも案内されていますが、具体的なワークフローとの互換性は自分の設定で個別に確認してください。コレクションをエクスポートまたは共有する際は、有効なキーが残っていないことを確認してください。
アプリケーションで使う前に確認すること
リクエストを定期的な処理に組み込む前に、プロジェクトで必要となる動画やパラメーターを使って確認してください。
- 有効なキーと正しいIDでリクエストできるか。
- 誤ったパラメーターや欠落したパラメーターをアプリケーションがどう処理するか。
- JSONが正しくても、必要なフィールドがない場合にどうなるか。
- HTTPエラー、ネットワーク障害、タイムアウトをどう処理するか。
- 自分の用途で識別や重複排除に適したフィールドはどれか。
cache_timeoutを使う場合、値を変えると再リクエストの結果がどう変わるか。
確認した日付、秘密情報を含まないパラメーター、匿名化したレスポンス例を記録してください。1回のリクエストが成功しても、特定の条件下で特定のシナリオが動作したことを確認できるだけです。すべてのルートやレスポンスが安定している証明にはなりません。
再現可能なシナリオを1つ作るところから始める
対象の動画でgetVideoByIDを試し、実際のJSONを調べて、フィールドの欠落やエラーを考慮したハンドラーを作成してください。そのうえで必要に応じて、正規化、重複排除、保存をプロセスに加えます。
jsonscraperのドキュメントには、ベースURLとルート一覧が掲載されており、出発点として利用できます。それでも本番コードでは、実際のレスポンスを確認し、キーを保護し、データが想定した構造と異なる場合に備える必要があります。