世の中にはたくさんのWebサービスがありますが、そのサービスを利用するだけではなく、サービスでどのような通信が流れ、JavaScriptが実行され、最終的にコンテンツが出来上がっているかを逆算で読み解いているエンジニアさんたちもいます。完成品から内部構造を逆算的に読み解くことは、俗にリバースエンジニアリングと呼ばれます。
今回は、こちら「Reverse-engineering YouTube | Alexey Golub」のサイトを補足・解説する形で、題材として「Youtubeのチャンネルに投稿されている動画のdescription
(概要欄)を取得する」というテーマでリバースエンジニアリングを解説してみたいと思います。
投稿動画のvideoIdを取得
動画のメタデータを取得するためには、最初に動画のvideoId
を取得する必要があります。一番簡単な方法はチャンネルトップページの動画タブにアクセスすることです。curlリクエストで再現する場合の形式は以下のようになります。
curl https://www.youtube.com/channel/{channelId}/videos \
-H 'User-Agent:{userAgent}'
window["ytInitialData"]
があります。これには投稿日時が若い動画の情報が格納されています。
- 動画の
videoId

- この後のリクエストに必要なパラメータ
continuation

curl https://www.youtube.com/browse_ajax?continuation={continuation} \
-H 'X-Youtube-Client-Version:2.20190830.05.01' \
-H 'X-Youtube-Client-Name:1'
videoId
やcontinuation
が取得できます(ただし、これ以上古い動画がない場合にはcontinuation
は存在しません)。以上の操作をcontinuation
の値を更新しながら繰り返すことで全動画のvideoId
を取得することができます。
動画のメタ情報を取得
先ほどの節でvideoId
の取得が完了しました。この節ではvideoId
から動画のメタデータを取得する方法について解説します。動画のメタデータを取得する方法としてYoutubeが提供しているiframeのAPI内部で使用されているエンドポイントを利用します。curlリクエストで再現する場合の形式は以下のようになります。
curl https://www.youtube.com/get_video_info?video_id={videoId}&hl=ja
&
で繋げられているため、&
で区切ってから利用すると良いでしょう。そうして取得したメタデータからplayer_response
フィールドの値(JSON形式)を取り出します。ここには動画の概要欄などの情報が含まれます。
