2023年2月11日土曜日

GAS(Google Apps Script)でYouTubeのデータ取得②

こんばんは。ざわです。

前回、GAS(Google Apps Script)を使って YouTube の動画情報を取得してみました。

この時は特定の動画のURLを指定して取得する方法で、1件分だけの取得だったのですが、

今回はそれを改良し、特定のチャンネルから複数の動画情報を取得してスプレッドシートに一覧出力してみようと思います。

動画情報を取得するチャンネルは、弊社の「AIMEKチャンネル」です。

最初にチャンネルIDが必要なのですが、チャンネルIDはURLの末尾部分から取得できます。

AIMEKチャンネルの場合、URLは下記で、URL末尾の青字部分がチャンネルIDに該当します。
  https://www.youtube.com/channel/UCmatd8FfLKg0Pmi4iitAJYg

YouTube Data APIの以下リソースを使用して実装してみました。
 ・Channels
 ・PlaylistItems
 ・Videos

できあがったソースがこちら。

function myFunction() {
    // チャンネルID
    const channelId = "UCmatd8FfLKg0Pmi4iitAJYg"
 
    // ビデオID 取得
    const videoIds = getVideoIds(channelId)
    if (!videoIds || videoIds.length === 0) {
      console.log('No VideoId found.');
      return;
    }
 
    // スプレッドシートにヘッダ行をセット
    const sheet = SpreadsheetApp.getActiveSheet();
    sheet.getRange(1, 1).setValue("タイトル");
    sheet.getRange(1, 2).setValue("再生回数");
    sheet.getRange(1, 3).setValue("いいね数");
    sheet.getRange(1, 4).setValue("コメント数");
    sheet.getRange(1, 5).setValue("投稿日時");
    sheet.getRange(1, 6).setValue("概要");
 
    // 動画情報を取得し、取得値をスプレッドシートに出力
    for (let i = 0; i < videoIds.length; i++) {
      const {
        title,
        publishedAt,
        description,
        viewCount,
        likeCount,
        commentCount
      } = getVideoData(videoIds[i])
 
      let row = i + 2;
      sheet.getRange(row, 1).setValue(title);
      sheet.getRange(row, 2).setValue(viewCount);
      sheet.getRange(row, 3).setValue(likeCount);
      sheet.getRange(row, 4).setValue(commentCount);
      sheet.getRange(row, 5).setValue(publishedAt);
      sheet.getRange(row, 6).setValue(description);
    }
}

function getVideoIds(channelId) {
    try {
      let results = [];
     
      // チャンネルIDを指定して、channelリソースを取得
      const lstChannels = YouTube.Channels.list("contentDetails", {id: channelId});
      if (!lstChannels || lstChannels.items.length === 0) {
        console.log('No Channels found.');
        return;
      }
 
      for (let i = 0; i < lstChannels.items.length; i++) {
       
        // チャンネルのアップロード済み動画を含む再生リストIDを取得
        const item = lstChannels.items[i];
        const playlistId = item.contentDetails.relatedPlaylists.uploads;
       
        let nextPageToken = null;
        do {
          // 再生リストIDを指定して、playlistItems.list メソッドを使って対応するリストを取得
          const playlistResponse = YouTube.PlaylistItems.list('snippet', {
            playlistId: playlistId,
            maxResults: 50,
            pageToken: nextPageToken
          });
          if (!playlistResponse || playlistResponse.items.length === 0) {
            console.log('No Playlist found.');
            break;
          }
         
          // ビデオID 取得
          for (let j = 0; j < playlistResponse.items.length; j++) {
            const playlistItem = playlistResponse.items[j];
            results.push(playlistItem.snippet.resourceId.videoId);
          }        
          nextPageToken = playlistResponse.nextPageToken;
        } while (nextPageToken);
      }
      return results;
 
    } catch (err) {
      console.log('Failed with err %s', err.message);
    }
}

function getVideoData(videoId) {
    // ビデオIDを指定して、動画情報を取得
    const results = YouTube.Videos.list('snippet,statistics', { id: videoId });
    const { items } = results
    const { statistics, snippet } = items[0]
    const { title, publishedAt, description } = snippet
    const { viewCount, likeCount, commentCount } = statistics
 
    return { title, publishedAt, description, viewCount, likeCount, commentCount }
}


実行結果の一覧がこちらになります。


YouTube Data APIのサンプルコードを参考に作りました。比較的簡単にできたなぁという感想です。

それではまたー。

0 件のコメント:

コメントを投稿