YouTubeってAPIから色々な情報を取ることができるんですよ。
APIの情報はリファレンスにまとまってるんですが、APIキーだのOAuth2.0だの、使い始めるまでがまぁまぁ面倒なんですね。
で、YouTubeってGoogle傘下なので、Google Apps Script(GAS)と相性が良いんじゃない?と思って調べてみたところ、GASならごくアッサリ使えることがわかりました。
使い方
下準備
エディタの「リソース」から「Googleの拡張サービス」を選んで…
「YouTube Data API v3」を有効にすると良いです。
叩く
準備さえ済めば、関数叩くだけでもう情報が撮れます。入力補完も効くので書きたい放題。
例えば特定のチャンネルの全ての動画を示す再生リストのplaylistIDを抜いてくる場合はこう。
複雑な指定一切なしで、一行ぽろっと書けば取ってこれます。
YouTube.Channels.list("contentDetails", {id: channelId}).items[0].contentDetails.relatedPlaylists.uploads
どこにどういう指定が要るのか、どういうレスポンスが来るのか、はリファレンスを見ながら把握しましょう。
使用例
YouTube Data APIは1コール50件ずつしか取ってこれないので、大量のデータを取ってくる場合は注意が必要です。
たとえば、特定の再生リストから全ての動画のvideoIDを抜いてくる処理はPlaylistItemsっていうAPIを使ってこういう関数になります。
function getVideos(playlistId, maxNum = 1000) {
let results = [];
let cnt = 0;
let nextPageToken = '';
let maxResults = Math.min(50, maxNum);
apiloop : while (1) {
const apiResult = YouTube.PlaylistItems.list("contentDetails", {playlistId : playlistId, maxResults : maxResults, pageToken : nextPageToken});
const totalResults = apiResult.pageInfo.totalResults;
nextPageToken = apiResult.nextPageToken;
for (let i = 0; i < apiResult.items.length; i++) {
results.push(apiResult.items[i].contentDetails.videoId);
cnt++;
if (cnt >= maxNum || cnt >= totalResults) {
break apiloop;
}
}
}
return results;
で、取ってきたvideoIDのリストを以下のようにvideoのAPIに食わせれば、再生数や高評価数が取ってこれるわけです。
このAPIはvideoIDをカンマ区切り文字列で与えますが、一度に50個を超えるとやはりエラーを吐きます。
function getVideoInfo(videoIds) {
let results = [];
for (let idSlice = 0; idSlice < videoIds.length / 50; idSlice++) {
const videoIdStr = videoIds.slice(idSlice * 50,idSlice * 50 + 50).join(',');
const apiResult = YouTube.Videos.list("contentDetails,statistics,snippet", {id : videoIdStr});
for (let i = 0; i < apiResult.items.length; i++) {
let item = apiResult.items[i];
results.push({
title : item.snippet.title,
publishedAt : item.snippet.publishedAt,
duration : item.contentDetails.duration,
viewCount : item.statistics.viewCount,
likeCount : item.statistics.likeCount,
dislikeCount : item.statistics.dislikeCount
});
}
}
return results;
}
ちなみにpublishedAt(投稿日)やduration(再生時間)はISO8601っていう規格に沿ってるらしいんですが分かりづらい。
特にdurationはなかなか他で見ない形式で、例えば1時間23分の動画は"PT1H23M"っていう表記になります。詳しくはWikipediaで。
サンプル
と、いうわけで、特定のチャンネルの動画をガサっと取ってきて再生数や高評価数を散布図にしてしまうサンプルを作ってみました。
Googleドライブ上で公開してみるので、自環境にコピーしていじってみてください。