Webサイトから情報を取得する⑤ Web API vol.2

Web API vol.1では、YouTube Data APIのSearchリソースを使って、検索ワードからヒットした動画のIDとタイトルを取得してみました。
GASのApps Scriptに標準装備されているサービスを使えば、APIの導入がとても簡単であることも分かりました。
せっかくAPIの世界に少し触れることができたので、もう少しAPIの世界を探検してみたいと思います。

vol.1では、動画のIDとタイトル、それからIDにちょっと手を加えてURLリンクを取得できました。
でも、もう少し動画の情報が欲しい気がします。例えば、動画の再生回数とか、高評価数とか…

はい。それらの情報ももちろんAPIで取得できますよ!
それらを取得するには、YouTube Data APIのVideosリソースを使います。
これには、先に取得した動画IDも不可欠ですので、vol.1の応用編とも言えます。
では、やっていきましょう!

Videosリソースの目的のプロパティと階層を確認する

まず初めにやるべきことは、目的とするプロパティが何プロパティなのか、プロパティ名を確認することでしたね。
それが書いてあるのが公式ドキュメントですのて、早速見ていきましょう。

再生回数はstatisticsオブジェクトのviewCountプロパティ、高評価数は同じくstatisticsオブジェクトのlikeCountプロパティであることが確認できました。
つまり、上位プロパティのstatisticsが必須引数のpartパラメータとなります。

APIリクエストの構成

サービスリソースメソッド引数(part/必須)引数(フィルタ/必須)
YouTubeVideosliststatisticsid

listメソッドの公式ドキュメントでリクエスト⇔レスポンスの方法、構成を確認しましょう。

動画の再生回数と高評価数を取得するgetVideoInfos関数を作成

Web API vol.1で用意したスプレッドシート「YouTube Data API」からコンテナバインドのApps Scriptを立ち上げます。
そして、動画の再生回数と高評価数を取得するgetVideoInfos関数を作ります。
引数のidはvol.1で作ったsearchByKeyword関数から受け取るので、そのようにコードを書き換えていきます。

function getVideoInfos(id) {
  // APIリクエスト
  const results = YouTube.Videos.list('statistics', {
    id: id
  });
  // レスポンスからviewCountとlikeCountを取得
  const viewCount = results.items[0].statistics.viewCount;
  const likeCount = results.items[0].statistics.likeCount;
  return [viewCount, likeCount];
}

searchByKeyword関数の書き換え

オレンジ枠がvol.1からの変更部分です。
解説はコメントアウト部分を参考にしてください。
forEach文の中でgetVideoInfos関数をループさせて、25件の動画IDを順番に受け取り、その動画の再生回数と高評価数を取得して、元のデータに追加しています。

function searchByKeyword() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('検索');
  const query = sheet.getRange('B3').getValue();
  try {
    const results = YouTube.Search.list('id,snippet', {
      q: query,
      maxResults: 25,
      type: 'video',
    });
    if (results === null) {
      console.log('Unable to search videos');
      return;
    }
    const data = [];
    results.items.forEach(item => {
      const url = 'https://www.youtube.com/watch?v=';
      const rowData = [item.id.videoId, url + item.id.videoId, item.snippet.title];
      // rowDataからidを取得
      const id = rowData[0];
      // getVideoInfos関数の引数にidを渡してviewCountとlikeCountを取得
      const [viewCount, likeCount] = getVideoInfos(id);
      // rowDataにviewCountとlikeCountを追加
      rowData.push(viewCount, likeCount);
      data.push(rowData);
    });
    return [data, query];

  } catch (err) {
    // TODO (developer) - Handle exceptions from Youtube API
    console.log('Failed with an error %s', err.message);
  }
}

シートに見出しをつける youtubeDataToSS関数の書き換え

情報量が多くなったので、分かりやすいようにシートの1行目に見出しをつけます。
youtubeDataToSS関数のコードを図のように追加、変更します。

function youtubeDataToSS() {
  const [data, query] = searchByKeyword();
  const firstRowData = [['ID', 'URL', 'タイトル', '再生回数', 'いいね数']];
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = ss.getSheetByName(query);
  if (sheet === null) {
    sheet = ss.insertSheet(query);
  }
  sheet.getRange(1, 1, 1, 5).setValues(firstRowData);
  sheet.getRange(2, 1, data.length, data[0].length).setValues(data);
}

完成です!

テスト実行

では、検索ワードに入力して試してみましょう。
今回も「大谷翔平」です。
検索ボタンをクリックします。

うまくいったようです!
1行目に見出しが表示されました。
ID、URL、タイトル、そして再生回数と高評価数が取得できています!

SearchリソースとVideosリソース、複数のリソースを用い、連結させることで取得できる情報の幅が広がりました。
APIを使いこなせば、可能性がどんどん広がりそうですね!

シリーズ目次:Webサイトから情報を取得する

  1. Webサイトから情報を取得する① ファイルのダウンロード
  2. Webサイトから情報を取得する② スプレッドシートにインポート
  3. Webサイトから情報を取得する③ スクレイピング
  4. Webサイトから情報を取得する④ Web API vol.1
  5. Webサイトから情報を取得する⑤ Web API vol.2

GASAPI,データ

Posted by botw