Help us understand the problem. What is going on with this article?

YouTubeの特定のチャンネルに紐付く動画を取得する。(YouTube Data API (v3) Search)

More than 1 year has passed since last update.

~2018.08.30追記~
久しぶりに使ったら挙動が安定せず、対象とするチャンネルによっては何かおかしな挙動をする場合があるようで、途中をちょこちょこ修正しつつ最後に注意点として追記しました。

やりたいこと

公式チャンネルの動画のURL一覧が欲しいと思うことがあります。
が、数年分もあると心と時間を犠牲にしてスクロール(&クリック)し続けなくてはいけません。

解決策

Youtube Data API(v3)のSearchAPIを利用することで、特定のチャンネルの動画一覧を取得できます。
https://developers.google.com/youtube/v3/docs/search?hl=ja

パラメータ例
part=snippet
key=(Google API Consoleから発行したキー)
channelId=(チャンネルID)
maxResults=50
order=date
pageToken=

part=snippetだと様々な情報が返ってきます。
ついでにタイトルを取りたい場合が多いと思いますので、snippetが良いでしょう。

チャンネルID は動画からチャンネルのリンクを遷移した先のURLで(2015.07現在)(2018.08現在)
https://www.youtube.com/channel/XXXXXXXXXXX
のXXXの部分がIDとなるようです。

あとは投げるだけですが・・・

立ちはだかる問題1

maxResultsは最大50なので、一度に取れるのは50件までです。
当然、51件以上紐付くチャンネルは沢山あります。

解決方法

紐付く動画の数よりも低い数でmaxResultsを投げた場合レスポンスのnextPageTokenに文字列が入ります。
この取得したnextPageTokenをリクエストパラメータpageTokenに格納すると次のページが取得されます。

これを利用して、再帰的にpageTokenを入れ替えれば51件以上自動的に取得することが可能です。

立ちはだかる問題2

上記の方法で取得していくと、nextPageTokenは500件※ あたりで止まります。
ええっ・・・。
注意:最後の追記参照

解決方法

以下のパラメータを追加します。

追加パラメータ
publishedAfter
publishedBefore

上記のパラメータにより、取得期間の指定が可能です。
本パラメータを指定後の期間内の動画数が500件に収まれば取得できるようなので、
紐付く動画が501件以上の場合は何回かに分けて取得すればOKです。
注意:最後の追記参照

その他

レスポンスパラメータ totalResults には、取得可能な数ではなく実際の動画の数が格納されるので、
この辺の値から判定すれば汎用化された取得ロジックとなりそうです。

そして3年後(追記)

久しぶりに触ったら以下の事象を確認しました。ご注意ください

publishedAfterとpublishedBeforeの期間を長くすると一部の動画が取得できない場合がある。

たとえば、とあるチャンネルで以下のパラメータで取得をしようとします。

パラメータ
publishedAfter:2017-01-01T00:00:00Z , publishedBefore:2018-09-01T00:00:00Z

結果は240件となりました。

なんか結果に違和感あるなーと思い、以下のようにしてみます。

パラメータ
publishedAfter:2018-08-01T00:00:00Z , publishedBefore:2018-09-01T00:00:00Z
publishedAfter:2018-07-01T00:00:00Z , publishedBefore:2018-08-01T00:00:00Z
publishedAfter:2018-06-01T00:00:00Z , publishedBefore:2018-07-01T00:00:00Z
...
publishedAfter:2017-01-01T00:00:00Z , publishedBefore:2017-02-01T00:00:00Z

同期間に対して1ヵ月ずつ実行すると、結果は518件でした。
*おおっと*

一定以上昔の動画がpublishedBeforeも一定以上昔にしないと取得出来ない場合がある。

こちらも例として、とあるチャンネルでのことです。

パラメータ
publishedAfter:2017-04-25T00:00:00Z , publishedBefore:2017-08-08T00:00:00Z

↑取得できた一番古い動画は2017年4月28日のものになりました。

パラメータ
publishedAfter:2017-04-25T00:00:00Z , publishedBefore:2017-08-07T00:00:00Z

↑取得できた一番古い動画は2017年4月25日のものになりました。
*おおっと*

動画数が多いチャンネルの場合、一気に一覧を取得していくのであれば小刻みに実行していった方が良さそうです。

yuji_saito
SIで産まれエンタメ業界で育ったデジタルマーケティング方面のエンジニア。サーバサイド寄り。 Java , Python , PHP , MySQL , AWS , Tableau
valuesccg
「インターネット行動ログ分析サービス」など、デジタルマーケティング領域での新たな価値創造を通し、各企業の成長支援を行っています。エンジニア募集中。
https://www.valuesccg.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away