プログラミング

YouTube Data APIをGoogle Apps Script(GAS)から使おう

投稿日:


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ドライブ上で公開してみるので、自環境にコピーしていじってみてください。

-プログラミング

執筆者:


comment

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

GeoJSONで市町村境界をマージして都道府県境界にしたい(その1)

前回の続きで、国土地理院の「国土数値情報」っていうオープンデータで遊んでいます。独立した記事なので前回のは読まなくても良いです。 やりたいこと 国土数値情報で提供されている「行政区域データ」は、市町村 …

no image

[C言語]スペースを大量に入れるとバグが直るコードを書いてみた

↓こういうツイートがバズっていたので、実際に組んでみた。 修士の頃、授業の課題でC言語書いてる時にどうしても謎のエラーが出て困っていた。それを見たSE経験(金融系)がある社会人大学院生の同期の女性が「 …

no image

プログラミングとアルゴリズムのはなし

みんなー!小学校でプログラミングの授業がはじまるよー!! プログラミングってなんだろう? プログラミングって、コンピューターに「○○をしなさい」って命令して、なにかの問題を解いたり、ゲームをつくったり …

国土地理院の地図データをUnityで読みたい(願望)

なんかgoogleのAdSense通ったんで有益な情報載せないとなって。 国土地理院のオープンデータ 国土地理院が公開している(正確には国土地理院のデータを利用して国土交通省国土政策局国土情報課が公開 …

no image

UnityのCompute Shaderに線分と三角形の衝突判定をさせる

はじめてCompute Shader使ってみた。でもあまり性能は出ないのでただの失敗の記録です。 まず元のアルゴリズムはコレ。 線分と三角形の当たり判定 – 富士見研究所 で、これをまず三角形の表裏問 …